Move account validity bg updates to registration store
This commit is contained in:
parent
2aa8943809
commit
ddd48b6851
|
@ -252,8 +252,6 @@ class SQLBaseStore(object):
|
||||||
# A set of tables that are not safe to use native upserts in.
|
# A set of tables that are not safe to use native upserts in.
|
||||||
self._unsafe_to_upsert_tables = set(UNIQUE_INDEX_BACKGROUND_UPDATES.keys())
|
self._unsafe_to_upsert_tables = set(UNIQUE_INDEX_BACKGROUND_UPDATES.keys())
|
||||||
|
|
||||||
self._account_validity = self.hs.config.account_validity
|
|
||||||
|
|
||||||
# We add the user_directory_search table to the blacklist on SQLite
|
# We add the user_directory_search table to the blacklist on SQLite
|
||||||
# because the existing search table does not have an index, making it
|
# because the existing search table does not have an index, making it
|
||||||
# unsafe to use native upserts.
|
# unsafe to use native upserts.
|
||||||
|
@ -272,14 +270,6 @@ class SQLBaseStore(object):
|
||||||
|
|
||||||
self.rand = random.SystemRandom()
|
self.rand = random.SystemRandom()
|
||||||
|
|
||||||
if self._account_validity.enabled:
|
|
||||||
self._clock.call_later(
|
|
||||||
0.0,
|
|
||||||
run_as_background_process,
|
|
||||||
"account_validity_set_expiration_dates",
|
|
||||||
self._set_expiration_date_when_missing,
|
|
||||||
)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _check_safe_to_upsert(self):
|
def _check_safe_to_upsert(self):
|
||||||
"""
|
"""
|
||||||
|
@ -312,62 +302,6 @@ class SQLBaseStore(object):
|
||||||
self._check_safe_to_upsert,
|
self._check_safe_to_upsert,
|
||||||
)
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
|
||||||
def _set_expiration_date_when_missing(self):
|
|
||||||
"""
|
|
||||||
Retrieves the list of registered users that don't have an expiration date, and
|
|
||||||
adds an expiration date for each of them.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def select_users_with_no_expiration_date_txn(txn):
|
|
||||||
"""Retrieves the list of registered users with no expiration date from the
|
|
||||||
database, filtering out deactivated users.
|
|
||||||
"""
|
|
||||||
sql = (
|
|
||||||
"SELECT users.name FROM users"
|
|
||||||
" LEFT JOIN account_validity ON (users.name = account_validity.user_id)"
|
|
||||||
" WHERE account_validity.user_id is NULL AND users.deactivated = 0;"
|
|
||||||
)
|
|
||||||
txn.execute(sql, [])
|
|
||||||
|
|
||||||
res = self.cursor_to_dict(txn)
|
|
||||||
if res:
|
|
||||||
for user in res:
|
|
||||||
self.set_expiration_date_for_user_txn(
|
|
||||||
txn, user["name"], use_delta=True
|
|
||||||
)
|
|
||||||
|
|
||||||
yield self.runInteraction(
|
|
||||||
"get_users_with_no_expiration_date",
|
|
||||||
select_users_with_no_expiration_date_txn,
|
|
||||||
)
|
|
||||||
|
|
||||||
def set_expiration_date_for_user_txn(self, txn, user_id, use_delta=False):
|
|
||||||
"""Sets an expiration date to the account with the given user ID.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
user_id (str): User ID to set an expiration date for.
|
|
||||||
use_delta (bool): If set to False, the expiration date for the user will be
|
|
||||||
now + validity period. If set to True, this expiration date will be a
|
|
||||||
random value in the [now + period - d ; now + period] range, d being a
|
|
||||||
delta equal to 10% of the validity period.
|
|
||||||
"""
|
|
||||||
now_ms = self._clock.time_msec()
|
|
||||||
expiration_ts = now_ms + self._account_validity.period
|
|
||||||
|
|
||||||
if use_delta:
|
|
||||||
expiration_ts = self.rand.randrange(
|
|
||||||
expiration_ts - self._account_validity.startup_job_max_delta,
|
|
||||||
expiration_ts,
|
|
||||||
)
|
|
||||||
|
|
||||||
self._simple_upsert_txn(
|
|
||||||
txn,
|
|
||||||
"account_validity",
|
|
||||||
keyvalues={"user_id": user_id},
|
|
||||||
values={"expiration_ts_ms": expiration_ts, "email_sent": False},
|
|
||||||
)
|
|
||||||
|
|
||||||
def start_profiling(self):
|
def start_profiling(self):
|
||||||
self._previous_loop_ts = monotonic_time()
|
self._previous_loop_ts = monotonic_time()
|
||||||
|
|
||||||
|
|
|
@ -926,6 +926,14 @@ class RegistrationStore(RegistrationBackgroundUpdateStore):
|
||||||
|
|
||||||
self._account_validity = hs.config.account_validity
|
self._account_validity = hs.config.account_validity
|
||||||
|
|
||||||
|
if self._account_validity.enabled:
|
||||||
|
self._clock.call_later(
|
||||||
|
0.0,
|
||||||
|
run_as_background_process,
|
||||||
|
"account_validity_set_expiration_dates",
|
||||||
|
self._set_expiration_date_when_missing,
|
||||||
|
)
|
||||||
|
|
||||||
# Create a background job for culling expired 3PID validity tokens
|
# Create a background job for culling expired 3PID validity tokens
|
||||||
def start_cull():
|
def start_cull():
|
||||||
# run as a background process to make sure that the database transactions
|
# run as a background process to make sure that the database transactions
|
||||||
|
@ -1502,3 +1510,59 @@ class RegistrationStore(RegistrationBackgroundUpdateStore):
|
||||||
self._invalidate_cache_and_stream(
|
self._invalidate_cache_and_stream(
|
||||||
txn, self.get_user_deactivated_status, (user_id,)
|
txn, self.get_user_deactivated_status, (user_id,)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def _set_expiration_date_when_missing(self):
|
||||||
|
"""
|
||||||
|
Retrieves the list of registered users that don't have an expiration date, and
|
||||||
|
adds an expiration date for each of them.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def select_users_with_no_expiration_date_txn(txn):
|
||||||
|
"""Retrieves the list of registered users with no expiration date from the
|
||||||
|
database, filtering out deactivated users.
|
||||||
|
"""
|
||||||
|
sql = (
|
||||||
|
"SELECT users.name FROM users"
|
||||||
|
" LEFT JOIN account_validity ON (users.name = account_validity.user_id)"
|
||||||
|
" WHERE account_validity.user_id is NULL AND users.deactivated = 0;"
|
||||||
|
)
|
||||||
|
txn.execute(sql, [])
|
||||||
|
|
||||||
|
res = self.cursor_to_dict(txn)
|
||||||
|
if res:
|
||||||
|
for user in res:
|
||||||
|
self.set_expiration_date_for_user_txn(
|
||||||
|
txn, user["name"], use_delta=True
|
||||||
|
)
|
||||||
|
|
||||||
|
yield self.runInteraction(
|
||||||
|
"get_users_with_no_expiration_date",
|
||||||
|
select_users_with_no_expiration_date_txn,
|
||||||
|
)
|
||||||
|
|
||||||
|
def set_expiration_date_for_user_txn(self, txn, user_id, use_delta=False):
|
||||||
|
"""Sets an expiration date to the account with the given user ID.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user_id (str): User ID to set an expiration date for.
|
||||||
|
use_delta (bool): If set to False, the expiration date for the user will be
|
||||||
|
now + validity period. If set to True, this expiration date will be a
|
||||||
|
random value in the [now + period - d ; now + period] range, d being a
|
||||||
|
delta equal to 10% of the validity period.
|
||||||
|
"""
|
||||||
|
now_ms = self._clock.time_msec()
|
||||||
|
expiration_ts = now_ms + self._account_validity.period
|
||||||
|
|
||||||
|
if use_delta:
|
||||||
|
expiration_ts = self.rand.randrange(
|
||||||
|
expiration_ts - self._account_validity.startup_job_max_delta,
|
||||||
|
expiration_ts,
|
||||||
|
)
|
||||||
|
|
||||||
|
self._simple_upsert_txn(
|
||||||
|
txn,
|
||||||
|
"account_validity",
|
||||||
|
keyvalues={"user_id": user_id},
|
||||||
|
values={"expiration_ts_ms": expiration_ts, "email_sent": False},
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue