Fallback to database lock if locking fails

This commit is contained in:
Michael 2020-11-16 19:46:20 +00:00
parent 0384bf3e76
commit deb6b7a7c3
2 changed files with 15 additions and 5 deletions

View File

@ -122,7 +122,7 @@ class LockFactory
try { try {
return new Lock\SemaphoreLock(); return new Lock\SemaphoreLock();
} catch (\Exception $exception) { } 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); return new Lock\CacheLock($cache);
} }
} catch (\Exception $exception) { } 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]);
} }
} }

View 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']]; $condition = ['uri-id' => $item['uri-id'], 'uid' => $item['uid'], 'network' => $item['network']];
if (DBA::exists('item', $condition)) { 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); Logger::notice('Item is already inserted - aborting', $condition);
return 0; return 0;
} }
@ -1917,7 +1923,11 @@ class Item
// When the item was successfully stored we fetch the ID of the item. // When the item was successfully stored we fetch the ID of the item.
$current_post = DBA::lastInsertId(); $current_post = DBA::lastInsertId();
DI::lock()->release(self::LOCK_INSERT); if ($locked) {
DI::lock()->release(self::LOCK_INSERT);
} else {
DBA::unlock();
}
} else { } else {
Logger::warning('Item lock had not been acquired'); Logger::warning('Item lock had not been acquired');
$result = false; $result = false;