Merge pull request #9537 from annando/item-lock
Fallback to database lock if locking fails
This commit is contained in:
commit
ba0d3b2435
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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']];
|
$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;
|
||||||
}
|
}
|
||||||
|
@ -1900,7 +1906,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;
|
||||||
|
|
Loading…
Reference in a new issue