forked from MirrorHub/synapse
Fix error handling during insertion of client IPs (#9051)
You can't continue using a transaction once an exception has been raised, so catching and dropping the error here is pointless and just causes more errors.
This commit is contained in:
parent
195adf4025
commit
fa5f5cbc74
2 changed files with 25 additions and 32 deletions
1
changelog.d/9051.bugfix
Normal file
1
changelog.d/9051.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix error handling during insertion of client IPs into the database.
|
|
@ -470,43 +470,35 @@ class ClientIpStore(ClientIpWorkerStore):
|
||||||
for entry in to_update.items():
|
for entry in to_update.items():
|
||||||
(user_id, access_token, ip), (user_agent, device_id, last_seen) = entry
|
(user_id, access_token, ip), (user_agent, device_id, last_seen) = entry
|
||||||
|
|
||||||
try:
|
self.db_pool.simple_upsert_txn(
|
||||||
self.db_pool.simple_upsert_txn(
|
txn,
|
||||||
|
table="user_ips",
|
||||||
|
keyvalues={"user_id": user_id, "access_token": access_token, "ip": ip},
|
||||||
|
values={
|
||||||
|
"user_agent": user_agent,
|
||||||
|
"device_id": device_id,
|
||||||
|
"last_seen": last_seen,
|
||||||
|
},
|
||||||
|
lock=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Technically an access token might not be associated with
|
||||||
|
# a device so we need to check.
|
||||||
|
if device_id:
|
||||||
|
# this is always an update rather than an upsert: the row should
|
||||||
|
# already exist, and if it doesn't, that may be because it has been
|
||||||
|
# deleted, and we don't want to re-create it.
|
||||||
|
self.db_pool.simple_update_txn(
|
||||||
txn,
|
txn,
|
||||||
table="user_ips",
|
table="devices",
|
||||||
keyvalues={
|
keyvalues={"user_id": user_id, "device_id": device_id},
|
||||||
"user_id": user_id,
|
updatevalues={
|
||||||
"access_token": access_token,
|
"user_agent": user_agent,
|
||||||
|
"last_seen": last_seen,
|
||||||
"ip": ip,
|
"ip": ip,
|
||||||
},
|
},
|
||||||
values={
|
|
||||||
"user_agent": user_agent,
|
|
||||||
"device_id": device_id,
|
|
||||||
"last_seen": last_seen,
|
|
||||||
},
|
|
||||||
lock=False,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Technically an access token might not be associated with
|
|
||||||
# a device so we need to check.
|
|
||||||
if device_id:
|
|
||||||
# this is always an update rather than an upsert: the row should
|
|
||||||
# already exist, and if it doesn't, that may be because it has been
|
|
||||||
# deleted, and we don't want to re-create it.
|
|
||||||
self.db_pool.simple_update_txn(
|
|
||||||
txn,
|
|
||||||
table="devices",
|
|
||||||
keyvalues={"user_id": user_id, "device_id": device_id},
|
|
||||||
updatevalues={
|
|
||||||
"user_agent": user_agent,
|
|
||||||
"last_seen": last_seen,
|
|
||||||
"ip": ip,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
# Failed to upsert, log and continue
|
|
||||||
logger.error("Failed to insert client IP %r: %r", entry, e)
|
|
||||||
|
|
||||||
async def get_last_client_ip_by_device(
|
async def get_last_client_ip_by_device(
|
||||||
self, user_id: str, device_id: Optional[str]
|
self, user_id: str, device_id: Optional[str]
|
||||||
) -> Dict[Tuple[str, str], dict]:
|
) -> Dict[Tuple[str, str], dict]:
|
||||||
|
|
Loading…
Reference in a new issue