summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2018-11-12 15:13:10 +0100
committerMorris Jobke <hey@morrisjobke.de>2018-11-12 15:13:10 +0100
commitf7e3cf20854402806f8d735ca498a2f240f2615c (patch)
treee366a1e564454331cd7aac0f7b915a84c526c119 /lib
parent859dd1e742c4c71b3fbd7035a866c230b80142c2 (diff)
downloadnextcloud-server-f7e3cf20854402806f8d735ca498a2f240f2615c.tar.gz
nextcloud-server-f7e3cf20854402806f8d735ca498a2f240f2615c.zip
Fix UniqueConstraintViolationException while insert into oc_file_locks
* fixes #9305 by not being prone to the race condition in insertIfNotExists * fixes #6899 by not using a query that can result in a deadlock * replaces the insertIfNotExists call with an insert which is wrapped into a try-catch block * followup to #12371 Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Lock/DBLockingProvider.php13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/private/Lock/DBLockingProvider.php b/lib/private/Lock/DBLockingProvider.php
index 6adb7488217..79f2ff274cf 100644
--- a/lib/private/Lock/DBLockingProvider.php
+++ b/lib/private/Lock/DBLockingProvider.php
@@ -26,6 +26,7 @@
namespace OC\Lock;
+use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OC\DB\QueryBuilder\Literal;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -133,7 +134,17 @@ class DBLockingProvider extends AbstractLockingProvider {
protected function initLockField(string $path, int $lock = 0): int {
$expire = $this->getExpireTime();
- return $this->connection->insertIfNotExist('*PREFIX*file_locks', ['key' => $path, 'lock' => $lock, 'ttl' => $expire], ['key']);
+
+ try {
+ $builder = $this->connection->getQueryBuilder();
+ return $builder->insert('file_locks')
+ ->setValue('key', $builder->createNamedParameter($path))
+ ->setValue('lock', $builder->createNamedParameter($lock))
+ ->setValue('ttl', $builder->createNamedParameter($expire))
+ ->execute();
+ } catch(UniqueConstraintViolationException $e) {
+ return 0;
+ }
}
/**