]> source.dussan.org Git - nextcloud-server.git/commitdiff
Update the parent folders storage_mtime on write and delete to prevent rescans
authorRobin Appelman <icewind@owncloud.com>
Tue, 29 Oct 2013 13:18:57 +0000 (14:18 +0100)
committerRobin Appelman <icewind@owncloud.com>
Tue, 29 Oct 2013 13:18:57 +0000 (14:18 +0100)
lib/private/files/cache/updater.php
tests/lib/files/cache/updater.php

index 1f30173a8f8b18d1a1741e4171217d45813bb3b0..b491b60b0d0d67fba63b994a27b9aafefcc496e3 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 namespace OC\Files\Cache;
+
 use OCP\Util;
 
 /**
@@ -42,6 +43,7 @@ class Updater {
                        $scanner->scan($internalPath, Scanner::SCAN_SHALLOW);
                        $cache->correctFolderSize($internalPath);
                        self::correctFolder($path, $storage->filemtime($internalPath));
+                       self::correctParentStorageMtime($storage, $internalPath);
                }
        }
 
@@ -61,6 +63,7 @@ class Updater {
                        $cache->remove($internalPath);
                        $cache->correctFolderSize($internalPath);
                        self::correctFolder($path, time());
+                       self::correctParentStorageMtime($storage, $internalPath);
                }
        }
 
@@ -87,6 +90,8 @@ class Updater {
                                $cache->correctFolderSize($internalTo);
                                self::correctFolder($from, time());
                                self::correctFolder($to, time());
+                               self::correctParentStorageMtime($storageFrom, $internalFrom);
+                               self::correctParentStorageMtime($storageTo, $internalTo);
                        } else {
                                self::deleteUpdate($from);
                                self::writeUpdate($to);
@@ -118,12 +123,27 @@ class Updater {
                                        $cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath)));
                                        self::correctFolder($parent, $time);
                                } else {
-                                       Util::writeLog('core', 'Path not in cache: '.$internalPath, Util::ERROR);
+                                       Util::writeLog('core', 'Path not in cache: ' . $internalPath, Util::ERROR);
                                }
                        }
                }
        }
 
+       /**
+        * update the storage_mtime of the parent
+        *
+        * @param \OC\Files\Storage\Storage $storage
+        * @param string $internalPath
+        */
+       static private function correctParentStorageMtime($storage, $internalPath) {
+               $cache = $storage->getCache();
+               $parentId = $cache->getParentId($internalPath);
+               $parent = dirname($internalPath);
+               if ($parentId != -1) {
+                       $cache->update($parentId, array('storage_mtime' => $storage->filemtime($parent)));
+               }
+       }
+
        /**
         * @param array $params
         */
index 5d7997b054481219d06867713f6c25d8bfa4b7c3..a891f2560c45a860d0cad8772f8c812a06afb9d9 100644 (file)
@@ -9,6 +9,7 @@
 namespace Test\Files\Cache;
 
 use \OC\Files\Filesystem as Filesystem;
+use OC\Files\Storage\Temporary;
 
 class Updater extends \PHPUnit_Framework_TestCase {
        /**
@@ -265,4 +266,35 @@ class Updater extends \PHPUnit_Framework_TestCase {
                $this->assertEquals($time, $cachedData['mtime']);
        }
 
+       public function testUpdatePermissionsOnRescanOnlyForUpdatedFile() {
+               $permissionsCache = $this->storage->getPermissionsCache();
+               $scanner = $this->storage->getScanner();
+               $scanner->scan('');
+               $cache = $this->storage->getCache();
+               $loggedInUser = \OC_User::getUser();
+               \OC_User::setUserId(self::$user);
+               FileSystem::getDirectoryContent('/');
+               $past = time() - 600;
+               $cache->put('', array('storage_mtime' => $past));
+
+               $this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
+               $this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+               $permissionsCache->set($cache->getId('foo.png'), self::$user, 15);
+               FileSystem::file_put_contents('/foo.txt', 'asd');
+
+               $this->assertEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
+               $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+               FileSystem::getDirectoryContent('/');
+
+               $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+               FileSystem::file_put_contents('/qwerty.txt', 'asd');
+               FileSystem::getDirectoryContent('/');
+
+               $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+               \OC_User::setUserId($loggedInUser);
+       }
 }