]> source.dussan.org Git - nextcloud-server.git/commitdiff
clear permissions cache when scanning a file
authorRobin Appelman <icewind@owncloud.com>
Thu, 19 Sep 2013 19:37:52 +0000 (21:37 +0200)
committerJörn Friedrich Dreyer <jfd@butonic.de>
Mon, 25 Nov 2013 10:15:32 +0000 (11:15 +0100)
Conflicts:
lib/files/cache/scanner.php

lib/files/cache/scanner.php
tests/lib/files/cache/permissions.php

index a87d98eb7b8b510a9d6b4d7d15136a12c6b7630c..af819c47c6187255e8f820daa0c640959a09fe49 100644 (file)
@@ -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;
                }
        }
 }
index 56dbbc4518ef3627d6f8b5964939822e794d92d2..64a32fa6b71ce2f8106945fbf4461fbbd2e322f3 100644 (file)
@@ -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'));
+       }
 }