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

Commit

Permalink
Revert "Fix #8518 (sync requests being cached wrongly on timeout) (#9358
Browse files Browse the repository at this point in the history
)"

This reverts commit f5c93fc.

This is being backed out due to a regression (#9507) and additional
review feedback being provided.
  • Loading branch information
clokep committed Mar 2, 2021
1 parent 7f5d753 commit aee1076
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 35 deletions.
1 change: 0 additions & 1 deletion changelog.d/9358.misc

This file was deleted.

3 changes: 1 addition & 2 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,9 +277,8 @@ async def wait_for_sync_for_user(
user_id = sync_config.user.to_string()
await self.auth.check_auth_blocking(requester=requester)

res = await self.response_cache.wrap_conditional(
res = await self.response_cache.wrap(
sync_config.request_key,
lambda result: since_token != result.next_batch,
self._wait_for_sync_for_user,
sync_config,
since_token,
Expand Down
34 changes: 2 additions & 32 deletions synapse/util/caches/response_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, Optional, Set, TypeVar
from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, Optional, TypeVar

from twisted.internet import defer

Expand All @@ -40,7 +40,6 @@ class ResponseCache(Generic[T]):
def __init__(self, hs: "HomeServer", name: str, timeout_ms: float = 0):
# Requests that haven't finished yet.
self.pending_result_cache = {} # type: Dict[T, ObservableDeferred]
self.pending_conditionals = {} # type: Dict[T, Set[Callable[[Any], bool]]]

self.clock = hs.get_clock()
self.timeout_sec = timeout_ms / 1000.0
Expand Down Expand Up @@ -102,11 +101,7 @@ def set(self, key: T, deferred: defer.Deferred) -> defer.Deferred:
self.pending_result_cache[key] = result

def remove(r):
should_cache = all(
func(r) for func in self.pending_conditionals.pop(key, [])
)

if self.timeout_sec and should_cache:
if self.timeout_sec:
self.clock.call_later(
self.timeout_sec, self.pending_result_cache.pop, key, None
)
Expand All @@ -117,31 +112,6 @@ def remove(r):
result.addBoth(remove)
return result.observe()

def add_conditional(self, key: T, conditional: Callable[[Any], bool]):
self.pending_conditionals.setdefault(key, set()).add(conditional)

def wrap_conditional(
self,
key: T,
should_cache: Callable[[Any], bool],
callback: "Callable[..., Any]",
*args: Any,
**kwargs: Any
) -> defer.Deferred:
"""The same as wrap(), but adds a conditional to the final execution.
When the final execution completes, *all* conditionals need to return True for it to properly cache,
else it'll not be cached in a timed fashion.
"""

# See if there's already a result on this key that hasn't yet completed. Due to the single-threaded nature of
# python, adding a key immediately in the same execution thread will not cause a race condition.
result = self.get(key)
if not result or isinstance(result, defer.Deferred) and not result.called:
self.add_conditional(key, should_cache)

return self.wrap(key, callback, *args, **kwargs)

def wrap(
self, key: T, callback: "Callable[..., Any]", *args: Any, **kwargs: Any
) -> defer.Deferred:
Expand Down

0 comments on commit aee1076

Please sign in to comment.