summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <morris.jobke@gmail.com>2013-11-25 23:37:42 -0800
committerMorris Jobke <morris.jobke@gmail.com>2013-11-25 23:37:42 -0800
commite016ac1d5f186b169c6fe51f3f872e1f4d761e53 (patch)
tree2430d84eb9d999b982476acaf4e0d06ecacfbcbf
parent880769976bbc8c75186c89268c78bc40efb80998 (diff)
parentb5d04b05a09522e60e171ce4a3616d1a3779bac0 (diff)
downloadnextcloud-server-e016ac1d5f186b169c6fe51f3f872e1f4d761e53.tar.gz
nextcloud-server-e016ac1d5f186b169c6fe51f3f872e1f4d761e53.zip
Merge pull request #5962 from owncloud/clean_permissions_cache_on_filescan
clean permissions cache on filescan
-rw-r--r--lib/files/cache/scanner.php20
-rw-r--r--tests/lib/files/cache/permissions.php17
2 files changed, 33 insertions, 4 deletions
diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index a87d98eb7b8..af819c47c61 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -36,6 +36,11 @@ class Scanner extends BasicEmitter {
*/
private $cache;
+ /**
+ * @var \OC\Files\Cache\Permissions $permissionsCache
+ */
+ private $permissionsCache;
+
const SCAN_RECURSIVE = true;
const SCAN_SHALLOW = false;
@@ -46,6 +51,7 @@ class Scanner extends BasicEmitter {
$this->storage = $storage;
$this->storageId = $this->storage->getId();
$this->cache = $storage->getCache();
+ $this->permissionsCache = $storage->getPermissionsCache();
}
/**
@@ -66,6 +72,7 @@ class Scanner extends BasicEmitter {
$data['size'] = $this->storage->filesize($path);
}
$data['etag'] = $this->storage->getETag($path);
+ $data['storage_mtime'] = $data['mtime'];
return $data;
}
@@ -95,7 +102,11 @@ class Scanner extends BasicEmitter {
}
}
$newData = $data;
- if ($reuseExisting and $cacheData = $this->cache->get($file)) {
+ $cacheData = $this->cache->get($file);
+ if ($cacheData) {
+ $this->permissionsCache->remove($cacheData['fileid']);
+ }
+ if ($reuseExisting and $cacheData) {
// prevent empty etag
$etag = $cacheData['etag'];
$propagateETagChange = false;
@@ -103,7 +114,6 @@ class Scanner extends BasicEmitter {
$etag = $data['etag'];
$propagateETagChange = true;
}
-
// only reuse data if the file hasn't explicitly changed
if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
@@ -181,7 +191,7 @@ class Scanner extends BasicEmitter {
$newChildren = array();
if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) {
\OC_DB::beginTransaction();
- if(is_resource($dh)) {
+ if (is_resource($dh)) {
while (($file = readdir($dh)) !== false) {
$child = ($path) ? $path . '/' . $file : $file;
if (!Filesystem::isIgnoredDir($file)) {
@@ -238,9 +248,11 @@ class Scanner extends BasicEmitter {
* walk over any folders that are not fully scanned yet and scan them
*/
public function backgroundScan() {
- while (($path = $this->cache->getIncomplete()) !== false) {
+ $lastPath = null;
+ while (($path = $this->cache->getIncomplete()) !== false && $path !== $lastPath) {
$this->scan($path);
$this->cache->correctFolderSize($path);
+ $lastPath = $path;
}
}
}
diff --git a/tests/lib/files/cache/permissions.php b/tests/lib/files/cache/permissions.php
index 56dbbc4518e..64a32fa6b71 100644
--- a/tests/lib/files/cache/permissions.php
+++ b/tests/lib/files/cache/permissions.php
@@ -8,6 +8,8 @@
namespace Test\Files\Cache;
+use OC\Files\Storage\Temporary;
+
class Permissions extends \PHPUnit_Framework_TestCase {
/***
* @var \OC\Files\Cache\Permissions $permissionsCache
@@ -53,4 +55,19 @@ class Permissions extends \PHPUnit_Framework_TestCase {
$this->permissionsCache->removeMultiple($ids, $user);
}
+
+ public function testUpdatePermissionsOnRescan() {
+ $storage = new Temporary(array());
+ $scanner = $storage->getScanner();
+ $cache = $storage->getCache();
+ $permissionsCache = $storage->getPermissionsCache();
+
+ $storage->file_put_contents('foo.txt', 'bar');
+ $scanner->scan('');
+ $id = $cache->getId('foo.txt');
+ $permissionsCache->set($id, 'test', 1);
+
+ $scanner->scan('');
+ $this->assertEquals(-1, $permissionsCache->get($id, 'test'));
+ }
}