mirror of
https://github.com/element-hq/synapse.git
synced 2025-03-14 09:45:51 +00:00
Merge 0e3c3734f3
into 698278ba50
This commit is contained in:
commit
780da23986
5 changed files with 50 additions and 1 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -78,3 +78,7 @@ book/
|
|||
|
||||
# Don't include users' poetry configs
|
||||
/poetry.toml
|
||||
|
||||
data/
|
||||
registration.yaml
|
||||
registration.yml
|
||||
|
|
|
@ -58,6 +58,7 @@ components.
|
|||
import logging
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
Any,
|
||||
Awaitable,
|
||||
Callable,
|
||||
Collection,
|
||||
|
@ -482,11 +483,21 @@ class _Recoverer:
|
|||
self.service = service
|
||||
self.callback = callback
|
||||
self.backoff_counter = 1
|
||||
self._delayed_call_handler = None
|
||||
|
||||
def reset(self) -> None:
|
||||
if self._delayed_call_handler is not None and self._delayed_call_handler.active():
|
||||
self._delayed_call_handler.cancel()
|
||||
self._delayed_call_handler = None
|
||||
|
||||
self.backoff_counter = 1
|
||||
|
||||
self.recover()
|
||||
|
||||
def recover(self) -> None:
|
||||
delay = 2**self.backoff_counter
|
||||
logger.info("Scheduling retries on %s in %fs", self.service.id, delay)
|
||||
self.clock.call_later(
|
||||
self._delayed_call_handler = self.clock.call_later(
|
||||
delay, run_as_background_process, "as-recoverer", self.retry
|
||||
)
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from synapse.module_api.callbacks.appservice_login_callbacks import AppserviceLoginModuleApiCallbacks
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from synapse.server import HomeServer
|
||||
|
||||
|
@ -40,3 +42,4 @@ class ModuleApiCallbacks:
|
|||
self.account_validity = AccountValidityModuleApiCallbacks()
|
||||
self.spam_checker = SpamCheckerModuleApiCallbacks(hs)
|
||||
self.third_party_event_rules = ThirdPartyEventRulesModuleApiCallbacks(hs)
|
||||
self.appservice_login = AppserviceLoginModuleApiCallbacks(hs)
|
||||
|
|
21
synapse/module_api/callbacks/appservice_login_callbacks.py
Normal file
21
synapse/module_api/callbacks/appservice_login_callbacks.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
from typing import TYPE_CHECKING, Union
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from synapse.server import HomeServer
|
||||
from synapse.appservice import ApplicationService
|
||||
|
||||
class AppserviceLoginModuleApiCallbacks:
|
||||
def __init__(self, hs: "HomeServer") -> None:
|
||||
self.scheduler = hs.get_application_service_scheduler()
|
||||
|
||||
async def reset_recoverer_backoff(self, appservice: "ApplicationService"):
|
||||
print(appservice, "resetting backoff, retrying transactions immediately")
|
||||
|
||||
appservice_id = appservice.id
|
||||
|
||||
if appservice_id not in self.scheduler.txn_ctrl.recoverers:
|
||||
print(appservice, "no recoverer found to reset")
|
||||
return
|
||||
|
||||
self.scheduler.txn_ctrl.recoverers[appservice_id].reset()
|
|
@ -19,6 +19,7 @@
|
|||
#
|
||||
#
|
||||
|
||||
from copy import copy
|
||||
import logging
|
||||
import re
|
||||
from typing import (
|
||||
|
@ -306,6 +307,8 @@ class LoginRestServlet(RestServlet):
|
|||
if not appservice.is_interested_in_user(qualified_user_id):
|
||||
raise LoginError(403, "Invalid access_token", errcode=Codes.FORBIDDEN)
|
||||
|
||||
print("logging in appservice")
|
||||
|
||||
return await self._complete_login(
|
||||
qualified_user_id,
|
||||
login_submission,
|
||||
|
@ -315,8 +318,15 @@ class LoginRestServlet(RestServlet):
|
|||
# is not actually created in Synapse.
|
||||
should_check_deactivated=qualified_user_id != appservice.sender,
|
||||
request_info=request_info,
|
||||
callback=self._appservice_login_callback(appservice),
|
||||
)
|
||||
|
||||
def _appservice_login_callback(self, appservice: "ApplicationService") -> Optional[Callable[[LoginResponse], Awaitable[None]]]:
|
||||
async def __handle_appservice_login(_: "LoginResponse"):
|
||||
await self.hs.get_module_api_callbacks().appservice_login.reset_recoverer_backoff(appservice)
|
||||
|
||||
return __handle_appservice_login
|
||||
|
||||
async def _do_other_login(
|
||||
self,
|
||||
login_submission: JsonDict,
|
||||
|
|
Loading…
Add table
Reference in a new issue