]> source.dussan.org Git - nextcloud-server.git/commitdiff
Allow setting the frequency of which the file watcher checks for updates
authorRobin Appelman <icewind@owncloud.com>
Tue, 18 Feb 2014 15:31:40 +0000 (16:31 +0100)
committerRobin Appelman <icewind@owncloud.com>
Tue, 18 Feb 2014 15:34:25 +0000 (16:34 +0100)
lib/private/files/cache/watcher.php
tests/lib/files/view.php

index 251ecbe7071335cc3cf3165d9315dec986021540..48aa6f853ce8db9ae9052ef65859ebc1e4cf059c 100644 (file)
@@ -12,6 +12,14 @@ namespace OC\Files\Cache;
  * check the storage backends for updates and change the cache accordingly
  */
 class Watcher {
+       const CHECK_NEVER = 0; // never check the underlying filesystem for updates
+       const CHECK_ONCE = 1; // check the underlying filesystem for updates once every request for each file
+       const CHECK_ALWAYS = 2; // always check the underlying filesystem for updates
+
+       protected $watchPolicy = self::CHECK_ONCE;
+
+       protected $checkedPaths = array();
+
        /**
         * @var \OC\Files\Storage\Storage $storage
         */
@@ -23,7 +31,7 @@ class Watcher {
        protected $cache;
 
        /**
-        * @var Scanner $scanner;
+        * @var Scanner $scanner ;
         */
        protected $scanner;
 
@@ -36,6 +44,13 @@ class Watcher {
                $this->scanner = $storage->getScanner();
        }
 
+       /**
+        * @param int $policy either \OC\Files\Cache\Watcher::UPDATE_NEVER, \OC\Files\Cache\Watcher::UPDATE_ONCE, \OC\Files\Cache\Watcher::UPDATE_ALWAYS
+        */
+       public function setPolicy($policy) {
+               $this->watchPolicy = $policy;
+       }
+
        /**
         * check $path for updates
         *
@@ -43,20 +58,25 @@ class Watcher {
         * @return boolean | array true if path was updated, otherwise the cached data is returned
         */
        public function checkUpdate($path) {
-               $cachedEntry = $this->cache->get($path);
-               if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) {
-                       if ($this->storage->is_dir($path)) {
-                               $this->scanner->scan($path, Scanner::SCAN_SHALLOW);
-                       } else {
-                               $this->scanner->scanFile($path);
-                       }
-                       if ($cachedEntry['mimetype'] === 'httpd/unix-directory') {
-                               $this->cleanFolder($path);
+               if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) {
+                       $cachedEntry = $this->cache->get($path);
+                       $this->checkedPaths[] = $path;
+                       if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) {
+                               if ($this->storage->is_dir($path)) {
+                                       $this->scanner->scan($path, Scanner::SCAN_SHALLOW);
+                               } else {
+                                       $this->scanner->scanFile($path);
+                               }
+                               if ($cachedEntry['mimetype'] === 'httpd/unix-directory') {
+                                       $this->cleanFolder($path);
+                               }
+                               $this->cache->correctFolderSize($path);
+                               return true;
                        }
-                       $this->cache->correctFolderSize($path);
-                       return true;
+                       return $cachedEntry;
+               } else {
+                       return false;
                }
-               return $cachedEntry;
        }
 
        /**
index 72a2f854cb2d22e639f3fc8d0fc12f49aba5f07a..371d1ed1798af34c723f391bde011777e8d10734 100644 (file)
@@ -7,6 +7,8 @@
 
 namespace Test\Files;
 
+use OC\Files\Cache\Watcher;
+
 class TemporaryNoTouch extends \OC\Files\Storage\Temporary {
        public function touch($path, $mtime = null) {
                return false;
@@ -249,6 +251,7 @@ class View extends \PHPUnit_Framework_TestCase {
        function testWatcher() {
                $storage1 = $this->getTestStorage();
                \OC\Files\Filesystem::mount($storage1, array(), '/');
+               $storage1->getWatcher()->setPolicy(Watcher::CHECK_ALWAYS);
 
                $rootView = new \OC\Files\View('');