summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2016-04-29 12:54:33 +0200
committerRobin Appelman <icewind@owncloud.com>2016-04-29 12:54:33 +0200
commit49ad0fcfa9eba188d5032f8ffcd95d7cc235db80 (patch)
tree85fa60741fde62a3630ad202421a1fafd6096cce
parent5b45f0f91448f109ff33d4fb03368a0405e1da10 (diff)
downloadnextcloud-server-49ad0fcfa9eba188d5032f8ffcd95d7cc235db80.tar.gz
nextcloud-server-49ad0fcfa9eba188d5032f8ffcd95d7cc235db80.zip
optimize releaselock for memcache based locking backends
-rw-r--r--lib/private/Lock/AbstractLockingProvider.php4
-rw-r--r--lib/private/Lock/MemcacheLockingProvider.php9
2 files changed, 11 insertions, 2 deletions
diff --git a/lib/private/Lock/AbstractLockingProvider.php b/lib/private/Lock/AbstractLockingProvider.php
index f96358778c1..1886fbea082 100644
--- a/lib/private/Lock/AbstractLockingProvider.php
+++ b/lib/private/Lock/AbstractLockingProvider.php
@@ -116,4 +116,8 @@ abstract class AbstractLockingProvider implements ILockingProvider {
$this->releaseLock($path, self::LOCK_EXCLUSIVE);
}
}
+
+ protected function getOwnSharedLockCount($path) {
+ return isset($this->acquiredLocks['shared'][$path]) ? $this->acquiredLocks['shared'][$path] : 0;
+ }
}
diff --git a/lib/private/Lock/MemcacheLockingProvider.php b/lib/private/Lock/MemcacheLockingProvider.php
index 536b29e2c28..56e581b2192 100644
--- a/lib/private/Lock/MemcacheLockingProvider.php
+++ b/lib/private/Lock/MemcacheLockingProvider.php
@@ -88,9 +88,14 @@ class MemcacheLockingProvider extends AbstractLockingProvider {
*/
public function releaseLock($path, $type) {
if ($type === self::LOCK_SHARED) {
- if (isset($this->acquiredLocks['shared'][$path]) and $this->acquiredLocks['shared'][$path] > 0) {
+ if ($this->getOwnSharedLockCount($path) === 1) {
+ $removed = $this->memcache->cad($path, 1); // if we're the only one having a shared lock we can remove it in one go
+ if (!$removed) { //someone else also has a shared lock, decrease only
+ $this->memcache->dec($path);
+ }
+ } else {
+ // if we own more than one lock ourselves just decrease
$this->memcache->dec($path);
- $this->memcache->cad($path, 0);
}
} else if ($type === self::LOCK_EXCLUSIVE) {
$this->memcache->cad($path, 'exclusive');
n class="p">{ "Users" : "பயனாளர்", "Groups" : "குழுக்கள்", "Help" : "உதவி", "Host" : "ஓம்புனர்", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "நீங்கள் SSL சேவையை தவிர உடன்படு வரைமுறையை தவிர்க்க முடியும். பிறகு ldaps:.// உடன் ஆரம்பிக்கவும்", "Port" : "துறை ", "User DN" : "பயனாளர் DN", "Password" : "கடவுச்சொல்", "You can specify Base DN for users and groups in the Advanced tab" : "நீங்கள் பயனாளர்களுக்கும் மேன்மை தத்தலில் உள்ள குழுவிற்கும் தள DN ஐ குறிப்பிடலாம் ", "Back" : "பின்னுக்கு", "Advanced" : "உயர்ந்த", "Turn off SSL certificate validation." : "SSL சான்றிதழின் செல்லுபடியை நிறுத்திவிடவும்", "in seconds. A change empties the cache." : "செக்கன்களில். ஒரு மாற்றம் இடைமாற்றுநினைவகத்தை வெற்றிடமாக்கும்.", "User Display Name Field" : "பயனாளர் காட்சிப்பெயர் புலம்", "Base User Tree" : "தள பயனாளர் மரம்", "Group Display Name Field" : "குழுவின் காட்சி பெயர் புலம் ", "Base Group Tree" : "தள குழு மரம்", "Group-Member association" : "குழு உறுப்பினர் சங்கம்", "in bytes" : "bytes களில் ", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "பயனாளர் பெயரிற்கு வெற்றிடமாக விடவும் (பொது இருப்பு). இல்லாவிடின் LDAP/AD பண்புக்கூறை குறிப்பிடவும்." }, "nplurals=2; plural=(n != 1);");