Try to avoid race conditions with supergroup upgrades
This commit is contained in:
@@ -596,15 +596,27 @@ class AbstractUser(ABC):
|
|||||||
await portal.delete_telegram_user(self.tgid, sender=None)
|
await portal.delete_telegram_user(self.tgid, sender=None)
|
||||||
elif chan := getattr(update, "mau_channel", None):
|
elif chan := getattr(update, "mau_channel", None):
|
||||||
if not portal.mxid:
|
if not portal.mxid:
|
||||||
self.log.info(
|
asyncio.create_task(self._delayed_create_channel(chan))
|
||||||
"Creating Matrix room with data fetched by Telethon due to UpdateChannel"
|
|
||||||
)
|
|
||||||
await portal.create_matrix_room(self, chan)
|
|
||||||
else:
|
else:
|
||||||
self.log.debug("Updating channel info with data fetched by Telethon")
|
self.log.debug("Updating channel info with data fetched by Telethon")
|
||||||
await portal.update_info(self, chan)
|
await portal.update_info(self, chan)
|
||||||
await portal.invite_to_matrix(self.mxid)
|
await portal.invite_to_matrix(self.mxid)
|
||||||
|
|
||||||
|
async def _delayed_create_channel(self, chan: Channel) -> None:
|
||||||
|
self.log.debug("Waiting 5 seconds before handling UpdateChannel for non-existent portal")
|
||||||
|
await asyncio.sleep(5)
|
||||||
|
portal = await po.Portal.get_by_tgid(TelegramID(chan.id))
|
||||||
|
if portal.mxid:
|
||||||
|
self.log.debug(
|
||||||
|
"Portal started existing after waiting 5 seconds, dropping UpdateChannel"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.log.info(
|
||||||
|
"Creating Matrix room with data fetched by Telethon due to UpdateChannel"
|
||||||
|
)
|
||||||
|
await portal.create_matrix_room(self, chan)
|
||||||
|
|
||||||
async def update_message(self, original_update: UpdateMessage) -> None:
|
async def update_message(self, original_update: UpdateMessage) -> None:
|
||||||
update, sender, portal = await self.get_message_details(original_update)
|
update, sender, portal = await self.get_message_details(original_update)
|
||||||
if not portal:
|
if not portal:
|
||||||
|
|||||||
@@ -480,6 +480,11 @@ class Portal(DBPortal, BasePortal):
|
|||||||
await self.update_info(source, entity)
|
await self.update_info(source, entity)
|
||||||
|
|
||||||
async def _migrate_and_save_telegram(self, new_id: TelegramID) -> None:
|
async def _migrate_and_save_telegram(self, new_id: TelegramID) -> None:
|
||||||
|
async with self._async_get_locks[(new_id,)]:
|
||||||
|
await self._migrate_and_save_telegram_locked(new_id)
|
||||||
|
|
||||||
|
async def _migrate_and_save_telegram_locked(self, new_id: TelegramID) -> None:
|
||||||
|
self.log.info(f"Starting migration to {new_id}")
|
||||||
try:
|
try:
|
||||||
del self.by_tgid[self.tgid_full]
|
del self.by_tgid[self.tgid_full]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -490,7 +495,12 @@ class Portal(DBPortal, BasePortal):
|
|||||||
existing = None
|
existing = None
|
||||||
self.by_tgid[(new_id, new_id)] = self
|
self.by_tgid[(new_id, new_id)] = self
|
||||||
if existing:
|
if existing:
|
||||||
await existing.delete()
|
if existing.mxid:
|
||||||
|
self.log.warning(f"Deleting existing portal room {existing.mxid} for {new_id}")
|
||||||
|
await existing.cleanup_and_delete()
|
||||||
|
else:
|
||||||
|
self.log.debug(f"Deleting old database entry for {new_id}")
|
||||||
|
await existing.delete()
|
||||||
old_id = self.tgid
|
old_id = self.tgid
|
||||||
await self.update_id(new_id, "channel")
|
await self.update_id(new_id, "channel")
|
||||||
self.log = self.__class__.log.getChild(self.tgid_log)
|
self.log = self.__class__.log.getChild(self.tgid_log)
|
||||||
|
|||||||
Reference in New Issue
Block a user