]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(userstatus): catch unique constrain violation on revert 45206/head
authorAnna Larch <anna@nextcloud.com>
Fri, 26 Apr 2024 12:05:38 +0000 (14:05 +0200)
committerFerdinand Thiessen <opensource@fthiessen.de>
Wed, 29 May 2024 08:31:14 +0000 (10:31 +0200)
Signed-off-by: Anna Larch <anna@nextcloud.com>
apps/dav/lib/CalDAV/Status/StatusService.php

index 29129a3b0732b01575df1b102496d385c254dcfd..ed2c233055c9cfdfa4269ef9ad9de9107ce4c953 100644 (file)
@@ -32,6 +32,7 @@ use OCA\UserStatus\Service\StatusService as UserStatusService;
 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 @@ class StatusService {
                }
 
                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 @@ class StatusService {
                });
 
                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;
                }