Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Require Collections as the parameters for simple_* methods. (#11580)
Browse files Browse the repository at this point in the history
Instead of Iterable since the generators are not allowed due
to the potential for their re-use.
  • Loading branch information
clokep authored Dec 15, 2021
1 parent 323151b commit f901f8b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 40 deletions.
1 change: 1 addition & 0 deletions changelog.d/11580.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add some safety checks that storage functions are used correctly.
28 changes: 10 additions & 18 deletions synapse/storage/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
from synapse.storage.background_updates import BackgroundUpdater
from synapse.storage.engines import BaseDatabaseEngine, PostgresEngine, Sqlite3Engine
from synapse.storage.types import Connection, Cursor
from synapse.util.iterutils import batch_iter

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -986,7 +987,7 @@ async def simple_insert_many_values(
self,
table: str,
keys: Collection[str],
values: Iterable[Iterable[Any]],
values: Collection[Collection[Any]],
desc: str,
) -> None:
"""Executes an INSERT query on the named table.
Expand Down Expand Up @@ -1427,7 +1428,7 @@ async def simple_select_one(
self,
table: str,
keyvalues: Dict[str, Any],
retcols: Iterable[str],
retcols: Collection[str],
allow_none: Literal[False] = False,
desc: str = "simple_select_one",
) -> Dict[str, Any]:
Expand All @@ -1438,7 +1439,7 @@ async def simple_select_one(
self,
table: str,
keyvalues: Dict[str, Any],
retcols: Iterable[str],
retcols: Collection[str],
allow_none: Literal[True] = True,
desc: str = "simple_select_one",
) -> Optional[Dict[str, Any]]:
Expand All @@ -1448,7 +1449,7 @@ async def simple_select_one(
self,
table: str,
keyvalues: Dict[str, Any],
retcols: Iterable[str],
retcols: Collection[str],
allow_none: bool = False,
desc: str = "simple_select_one",
) -> Optional[Dict[str, Any]]:
Expand Down Expand Up @@ -1618,7 +1619,7 @@ async def simple_select_list(
self,
table: str,
keyvalues: Optional[Dict[str, Any]],
retcols: Iterable[str],
retcols: Collection[str],
desc: str = "simple_select_list",
) -> List[Dict[str, Any]]:
"""Executes a SELECT query on the named table, which may return zero or
Expand Down Expand Up @@ -1681,7 +1682,7 @@ async def simple_select_many_batch(
table: str,
column: str,
iterable: Iterable[Any],
retcols: Iterable[str],
retcols: Collection[str],
keyvalues: Optional[Dict[str, Any]] = None,
desc: str = "simple_select_many_batch",
batch_size: int = 100,
Expand All @@ -1704,16 +1705,7 @@ async def simple_select_many_batch(

results: List[Dict[str, Any]] = []

if not iterable:
return results

# iterables can not be sliced, so convert it to a list first
it_list = list(iterable)

chunks = [
it_list[i : i + batch_size] for i in range(0, len(it_list), batch_size)
]
for chunk in chunks:
for chunk in batch_iter(iterable, batch_size):
rows = await self.runInteraction(
desc,
self.simple_select_many_txn,
Expand Down Expand Up @@ -1853,7 +1845,7 @@ def simple_select_one_txn(
txn: LoggingTransaction,
table: str,
keyvalues: Dict[str, Any],
retcols: Iterable[str],
retcols: Collection[str],
allow_none: bool = False,
) -> Optional[Dict[str, Any]]:
select_sql = "SELECT %s FROM %s WHERE %s" % (
Expand Down Expand Up @@ -2146,7 +2138,7 @@ async def simple_search_list(
table: str,
term: Optional[str],
col: str,
retcols: Iterable[str],
retcols: Collection[str],
desc="simple_search_list",
) -> Optional[List[Dict[str, Any]]]:
"""Executes a SELECT query on the named table, which may return zero or
Expand Down
23 changes: 1 addition & 22 deletions synapse/storage/databases/main/pusher.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from synapse.storage.util.id_generators import StreamIdGenerator
from synapse.types import JsonDict
from synapse.util import json_encoder
from synapse.util.caches.descriptors import cached, cachedList
from synapse.util.caches.descriptors import cached

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -196,27 +196,6 @@ async def get_if_user_has_pusher(self, user_id: str):
# This only exists for the cachedList decorator
raise NotImplementedError()

@cachedList(
cached_method_name="get_if_user_has_pusher",
list_name="user_ids",
num_args=1,
)
async def get_if_users_have_pushers(
self, user_ids: Iterable[str]
) -> Dict[str, bool]:
rows = await self.db_pool.simple_select_many_batch(
table="pushers",
column="user_name",
iterable=user_ids,
retcols=["user_name"],
desc="get_if_users_have_pushers",
)

result = {user_id: False for user_id in user_ids}
result.update({r["user_name"]: True for r in rows})

return result

async def update_pusher_last_stream_ordering(
self, app_id, pushkey, user_id, last_stream_ordering
) -> None:
Expand Down

0 comments on commit f901f8b

Please sign in to comment.