diff options
author | Robin Appelman <robin@icewind.nl> | 2018-04-10 18:30:43 +0200 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2018-04-11 19:21:45 +0200 |
commit | 89a9d35d90b7264d66411dfefec0aa84491d5cf9 (patch) | |
tree | 8e433546babedc20917bb0b81fa59f7438a4dfc5 /lib | |
parent | 9260474ab69e85c292ac1b845a52e4ddf838d4ae (diff) | |
download | nextcloud-server-89a9d35d90b7264d66411dfefec0aa84491d5cf9.tar.gz nextcloud-server-89a9d35d90b7264d66411dfefec0aa84491d5cf9.zip |
dont keep shared database locks when running cli scripts
For cli scripts we don't have the assumption that the universe will be cleaned up soon
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php | 8 | ||||
-rw-r--r-- | lib/private/Lock/DBLockingProvider.php | 42 | ||||
-rw-r--r-- | lib/private/Server.php | 8 | ||||
-rw-r--r-- | lib/public/DB/QueryBuilder/IFunctionBuilder.php | 16 |
4 files changed, 66 insertions, 8 deletions
diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php index 1d745306351..bd367973097 100644 --- a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php +++ b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php @@ -63,4 +63,12 @@ class FunctionBuilder implements IFunctionBuilder { public function lower($field) { return new QueryFunction('LOWER(' . $this->helper->quoteColumnName($field) . ')'); } + + public function add($x, $y) { + return new QueryFunction($this->helper->quoteColumnName($x) . ' + ' . $this->helper->quoteColumnName($y)); + } + + public function subtract($x, $y) { + return new QueryFunction($this->helper->quoteColumnName($x) . ' - ' . $this->helper->quoteColumnName($y)); + } } diff --git a/lib/private/Lock/DBLockingProvider.php b/lib/private/Lock/DBLockingProvider.php index 016be64c097..6538dcbc2ce 100644 --- a/lib/private/Lock/DBLockingProvider.php +++ b/lib/private/Lock/DBLockingProvider.php @@ -56,6 +56,11 @@ class DBLockingProvider extends AbstractLockingProvider { private $sharedLocks = []; /** + * @var bool + */ + private $cacheSharedLocks; + + /** * Check if we have an open shared lock for a path * * @param string $path @@ -73,8 +78,10 @@ class DBLockingProvider extends AbstractLockingProvider { */ protected function markAcquire(string $path, int $type) { parent::markAcquire($path, $type); - if ($type === self::LOCK_SHARED) { - $this->sharedLocks[$path] = true; + if ($this->cacheSharedLocks) { + if ($type === self::LOCK_SHARED) { + $this->sharedLocks[$path] = true; + } } } @@ -86,10 +93,12 @@ class DBLockingProvider extends AbstractLockingProvider { */ protected function markChange(string $path, int $targetType) { parent::markChange($path, $targetType); - if ($targetType === self::LOCK_SHARED) { - $this->sharedLocks[$path] = true; - } else if ($targetType === self::LOCK_EXCLUSIVE) { - $this->sharedLocks[$path] = false; + if ($this->cacheSharedLocks) { + if ($targetType === self::LOCK_SHARED) { + $this->sharedLocks[$path] = true; + } else if ($targetType === self::LOCK_EXCLUSIVE) { + $this->sharedLocks[$path] = false; + } } } @@ -98,12 +107,20 @@ class DBLockingProvider extends AbstractLockingProvider { * @param \OCP\ILogger $logger * @param \OCP\AppFramework\Utility\ITimeFactory $timeFactory * @param int $ttl + * @param bool $cacheSharedLocks */ - public function __construct(IDBConnection $connection, ILogger $logger, ITimeFactory $timeFactory, int $ttl = 3600) { + public function __construct( + IDBConnection $connection, + ILogger $logger, + ITimeFactory $timeFactory, + int $ttl = 3600, + $cacheSharedLocks = true + ) { $this->connection = $connection; $this->logger = $logger; $this->timeFactory = $timeFactory; $this->ttl = $ttl; + $this->cacheSharedLocks = $cacheSharedLocks; } /** @@ -203,6 +220,13 @@ class DBLockingProvider extends AbstractLockingProvider { 'UPDATE `*PREFIX*file_locks` SET `lock` = 0 WHERE `key` = ? AND `lock` = -1', [$path] ); + } else if (!$this->cacheSharedLocks) { + $query = $this->connection->getQueryBuilder(); + $query->update('file_locks') + ->set('lock', $query->func()->subtract('lock', $query->createNamedParameter(1))) + ->where($query->expr()->eq('key', $query->createNamedParameter($path))) + ->andWhere($query->expr()->gt('lock', $query->createNamedParameter(0))); + $query->execute(); } } @@ -256,11 +280,15 @@ class DBLockingProvider extends AbstractLockingProvider { /** * release all lock acquired by this instance which were marked using the mark* methods + * * @suppress SqlInjectionChecker */ public function releaseAll() { parent::releaseAll(); + if (!$this->cacheSharedLocks) { + return; + } // since we keep shared locks we need to manually clean those $lockedPaths = array_keys($this->sharedLocks); $lockedPaths = array_filter($lockedPaths, function ($path) { diff --git a/lib/private/Server.php b/lib/private/Server.php index 109fb002ce5..fd32b09033e 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -847,7 +847,13 @@ class Server extends ServerContainer implements IServerContainer { if (!($memcache instanceof \OC\Memcache\NullCache)) { return new MemcacheLockingProvider($memcache, $ttl); } - return new DBLockingProvider($c->getDatabaseConnection(), $c->getLogger(), new TimeFactory(), $ttl); + return new DBLockingProvider( + $c->getDatabaseConnection(), + $c->getLogger(), + new TimeFactory(), + $ttl, + !\OC::$CLI + ); } return new NoopLockingProvider(); }); diff --git a/lib/public/DB/QueryBuilder/IFunctionBuilder.php b/lib/public/DB/QueryBuilder/IFunctionBuilder.php index d867d9e5edb..e0e331c0807 100644 --- a/lib/public/DB/QueryBuilder/IFunctionBuilder.php +++ b/lib/public/DB/QueryBuilder/IFunctionBuilder.php @@ -80,4 +80,20 @@ interface IFunctionBuilder { * @since 14.0.0 */ public function lower($field); + + /** + * @param mixed $x The first input field or number + * @param mixed $y The second input field or number + * @return IQueryFunction + * @since 14.0.0 + */ + public function add($x, $y); + + /** + * @param mixed $x The first input field or number + * @param mixed $y The second input field or number + * @return IQueryFunction + * @since 14.0.0 + */ + public function subtract($x, $y); } |