Merge pull request #9537 from annando/item-lock

Fallback to database lock if locking fails
This commit is contained in:
Hypolite Petovan 2020-11-16 16:05:24 -05:00 committed by GitHub
commit ba0d3b2435
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 5 deletions

View 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]);
}
}

View file

@ -1888,10 +1888,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;
}
@ -1900,7 +1906,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;