From 9bea6eca981df9b386c212b6678f3c9be7d43672 Mon Sep 17 00:00:00 2001 From: Anna Larch Date: Fri, 26 Apr 2024 14:05:38 +0200 Subject: [PATCH] fix(userstatus): catch unique constrain violation on revert Signed-off-by: Anna Larch --- apps/dav/lib/CalDAV/Status/StatusService.php | 27 ++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/dav/lib/CalDAV/Status/StatusService.php b/apps/dav/lib/CalDAV/Status/StatusService.php index 29129a3b0732b..ed2c233055c9c 100644 --- a/apps/dav/lib/CalDAV/Status/StatusService.php +++ b/apps/dav/lib/CalDAV/Status/StatusService.php @@ -32,6 +32,7 @@ use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Calendar\IManager; +use OCP\DB\Exception; use OCP\ICache; use OCP\ICacheFactory; use OCP\IUser as User; @@ -72,7 +73,18 @@ public function processCalendarStatus(string $userId): void { } if(empty($calendarEvents)) { - $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + try { + $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + } catch (Exception $e) { + if ($e->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + // A different process might have written another status + // update to the DB while we're processing our stuff. + // We cannot safely restore the status as we don't know which one is valid at this point + // So let's silently log this one and exit + $this->logger->debug('Unique constraint violation for live user status', ['exception' => $e]); + return; + } + } $this->logger->debug('No calendar events found for status check', ['user' => $userId]); return; } @@ -118,7 +130,18 @@ public function processCalendarStatus(string $userId): void { }); if(empty($applicableEvents)) { - $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + try { + $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + } catch (Exception $e) { + if ($e->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + // A different process might have written another status + // update to the DB while we're processing our stuff. + // We cannot safely restore the status as we don't know which one is valid at this point + // So let's silently log this one and exit + $this->logger->debug('Unique constraint violation for live user status', ['exception' => $e]); + return; + } + } $this->logger->debug('No status relevant events found, skipping calendar status change', ['user' => $userId]); return; }