]> git.mxchange.org Git - friendica.git/commitdiff
Fallback to database lock if locking fails
authorMichael <heluecht@pirati.ca>
Mon, 16 Nov 2020 19:46:20 +0000 (19:46 +0000)
committerMichael <heluecht@pirati.ca>
Mon, 16 Nov 2020 19:46:20 +0000 (19:46 +0000)
src/Factory/LockFactory.php
src/Model/Item.php

index afdf5213c60ae03b2784b4772e9155aa25f45c32..4a45656de6c4ba40acab6de9a6ab7cb02fc4c78c 100644 (file)
@@ -122,7 +122,7 @@ class LockFactory
                        try {
                                return new Lock\SemaphoreLock();
                        } catch (\Exception $exception) {
-                               $this->logger->debug('Using Semaphore driver for locking failed.', ['exception' => $exception]);
+                               $this->logger->warning('Using Semaphore driver for locking failed.', ['exception' => $exception]);
                        }
                }
 
@@ -135,7 +135,7 @@ class LockFactory
                                        return new Lock\CacheLock($cache);
                                }
                        } catch (\Exception $exception) {
-                               $this->logger->debug('Using Cache driver for locking failed.', ['exception' => $exception]);
+                               $this->logger->warning('Using Cache driver for locking failed.', ['exception' => $exception]);
                        }
                }
 
index d5f57cff757994fb3323fd435ae7cfacf8e95e4f..aba3c37599fe7c058b346492b54bd8887872de5d 100644 (file)
@@ -1905,10 +1905,16 @@ class Item
                        }
                }
 
-               if (DI::lock()->acquire(self::LOCK_INSERT, 0)) {
+               $locked = DI::lock()->acquire(self::LOCK_INSERT, 0);
+
+               if ($locked || DBA::lock('item')) {
                        $condition = ['uri-id' => $item['uri-id'], 'uid' => $item['uid'], 'network' => $item['network']];
                        if (DBA::exists('item', $condition)) {
-                               DI::lock()->release(self::LOCK_INSERT);
+                               if ($locked) {
+                                       DI::lock()->release(self::LOCK_INSERT);
+                               } else {
+                                       DBA::unlock();
+                               }
                                Logger::notice('Item is already inserted - aborting', $condition);
                                return 0;
                        }
@@ -1917,7 +1923,11 @@ class Item
 
                        // When the item was successfully stored we fetch the ID of the item.
                        $current_post = DBA::lastInsertId();
-                       DI::lock()->release(self::LOCK_INSERT);
+                       if ($locked) {
+                               DI::lock()->release(self::LOCK_INSERT);
+                       } else {
+                               DBA::unlock();
+                       }
                } else {
                        Logger::warning('Item lock had not been acquired');
                        $result = false;