Merge pull request #3681 from matrix-org/neilj/fix_reap_users_in_postgres
Neilj/fix reap users in postgres
This commit is contained in:
commit
0bdc362598
|
@ -0,0 +1 @@
|
||||||
|
Fixes test_reap_monthly_active_users so it passes under postgres
|
|
@ -64,23 +64,27 @@ class MonthlyActiveUsersStore(SQLBaseStore):
|
||||||
Deferred[]
|
Deferred[]
|
||||||
"""
|
"""
|
||||||
def _reap_users(txn):
|
def _reap_users(txn):
|
||||||
|
# Purge stale users
|
||||||
|
|
||||||
thirty_days_ago = (
|
thirty_days_ago = (
|
||||||
int(self._clock.time_msec()) - (1000 * 60 * 60 * 24 * 30)
|
int(self._clock.time_msec()) - (1000 * 60 * 60 * 24 * 30)
|
||||||
)
|
)
|
||||||
# Purge stale users
|
query_args = [thirty_days_ago]
|
||||||
|
base_sql = "DELETE FROM monthly_active_users WHERE timestamp < ?"
|
||||||
|
|
||||||
|
# Need if/else since 'AND user_id NOT IN ({})' fails on Postgres
|
||||||
|
# when len(reserved_users) == 0. Works fine on sqlite.
|
||||||
|
if len(self.reserved_users) > 0:
|
||||||
# questionmarks is a hack to overcome sqlite not supporting
|
# questionmarks is a hack to overcome sqlite not supporting
|
||||||
# tuples in 'WHERE IN %s'
|
# tuples in 'WHERE IN %s'
|
||||||
questionmarks = '?' * len(self.reserved_users)
|
questionmarks = '?' * len(self.reserved_users)
|
||||||
query_args = [thirty_days_ago]
|
|
||||||
query_args.extend(self.reserved_users)
|
|
||||||
|
|
||||||
sql = """
|
query_args.extend(self.reserved_users)
|
||||||
DELETE FROM monthly_active_users
|
sql = base_sql + """ AND user_id NOT IN ({})""".format(
|
||||||
WHERE timestamp < ?
|
','.join(questionmarks)
|
||||||
AND user_id NOT IN ({})
|
)
|
||||||
""".format(','.join(questionmarks))
|
else:
|
||||||
|
sql = base_sql
|
||||||
|
|
||||||
txn.execute(sql, query_args)
|
txn.execute(sql, query_args)
|
||||||
|
|
||||||
|
@ -93,16 +97,24 @@ class MonthlyActiveUsersStore(SQLBaseStore):
|
||||||
# negative LIMIT values. So there is no way to write it that both can
|
# negative LIMIT values. So there is no way to write it that both can
|
||||||
# support
|
# support
|
||||||
query_args = [self.hs.config.max_mau_value]
|
query_args = [self.hs.config.max_mau_value]
|
||||||
query_args.extend(self.reserved_users)
|
|
||||||
sql = """
|
base_sql = """
|
||||||
DELETE FROM monthly_active_users
|
DELETE FROM monthly_active_users
|
||||||
WHERE user_id NOT IN (
|
WHERE user_id NOT IN (
|
||||||
SELECT user_id FROM monthly_active_users
|
SELECT user_id FROM monthly_active_users
|
||||||
ORDER BY timestamp DESC
|
ORDER BY timestamp DESC
|
||||||
LIMIT ?
|
LIMIT ?
|
||||||
)
|
)
|
||||||
AND user_id NOT IN ({})
|
"""
|
||||||
""".format(','.join(questionmarks))
|
# Need if/else since 'AND user_id NOT IN ({})' fails on Postgres
|
||||||
|
# when len(reserved_users) == 0. Works fine on sqlite.
|
||||||
|
if len(self.reserved_users) > 0:
|
||||||
|
query_args.extend(self.reserved_users)
|
||||||
|
sql = base_sql + """ AND user_id NOT IN ({})""".format(
|
||||||
|
','.join(questionmarks)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
sql = base_sql
|
||||||
txn.execute(sql, query_args)
|
txn.execute(sql, query_args)
|
||||||
|
|
||||||
yield self.runInteraction("reap_monthly_active_users", _reap_users)
|
yield self.runInteraction("reap_monthly_active_users", _reap_users)
|
||||||
|
|
Loading…
Reference in New Issue