]> source.dussan.org Git - nextcloud-server.git/commitdiff
propagate folder size in the same query for write updates
authorRobin Appelman <icewind@owncloud.com>
Thu, 7 Jan 2016 17:13:35 +0000 (18:13 +0100)
committerRobin Appelman <icewind@owncloud.com>
Fri, 15 Jan 2016 14:36:52 +0000 (15:36 +0100)
apps/files_sharing/lib/sharedpropagator.php
lib/private/files/cache/propagator.php
lib/private/files/cache/scanner.php
lib/private/files/cache/updater.php
tests/lib/cache/file.php

index fd3e14b28f8725293248ce4c7c071246c35589ec..29735934499fb4cf8f3303a37d830a489dbd0415 100644 (file)
@@ -32,12 +32,13 @@ class SharedPropagator extends Propagator {
        /**
         * @param string $internalPath
         * @param int $time
-        * @return array[] all propagated entries
+        * @param int $sizeDifference
+        * @return \array[] all propagated entries
         */
-       public function propagateChange($internalPath, $time) {
+       public function propagateChange($internalPath, $time, $sizeDifference = 0) {
                $source = $this->storage->getSourcePath($internalPath);
                /** @var \OC\Files\Storage\Storage $storage */
                list($storage, $sourceInternalPath) = \OC\Files\Filesystem::resolvePath($source);
-               return $storage->getPropagator()->propagateChange($sourceInternalPath, $time);
+               return $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference);
        }
 }
index 1e85a2ecc8bf2e412a96a1e7b155b9d42bca312b..50264e54d44de82a0845eb4e9ff9d1590e4f277e 100644 (file)
@@ -43,9 +43,10 @@ class Propagator implements IPropagator {
        /**
         * @param string $internalPath
         * @param int $time
-        * @return array[] all propagated cache entries
+        * @param int $sizeDifference number of bytes the file has grown
+        * @return array[] all propagated entries
         */
-       public function propagateChange($internalPath, $time) {
+       public function propagateChange($internalPath, $time, $sizeDifference = 0) {
                $cache = $this->storage->getCache($internalPath);
 
                $parentId = $cache->getParentId($internalPath);
@@ -58,7 +59,12 @@ class Propagator implements IPropagator {
                        }
                        $mtime = max($time, $entry['mtime']);
 
-                       $cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path'])]);
+                       if ($entry['size'] === -1) {
+                               $newSize = -1;
+                       } else {
+                               $newSize = $entry['size'] + $sizeDifference;
+                       }
+                       $cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path']), 'size' => $newSize]);
 
                        $parentId = $entry['parent'];
                }
index 1c50978a2e528fa7cddcc7cf7828c9b59f9a5472..60daa323b4b58067e68acf13a008fed7b2b41e98 100644 (file)
@@ -198,6 +198,7 @@ class Scanner extends BasicEmitter implements IScanner {
                                if (!empty($newData)) {
                                        $data['fileid'] = $this->addToCache($file, $newData, $fileId);
                                }
+                               $data['oldSize'] = $cacheData['size'];
 
                                // post-emit only if it was a file. By that we avoid counting/treating folders as files
                                if ($data['mimetype'] !== 'httpd/unix-directory') {
index 58d8e53cfd19947af5962b4979298f78c8e3179c..80ba704883e5c8cae455842fb0cc59aefd239f00 100644 (file)
@@ -118,9 +118,15 @@ class Updater implements IUpdater {
                }
 
                $data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
+               if (isset($data['oldSize']) && isset($data['size'])) {
+                       $sizeDifference = $data['size'] - $data['oldSize'];
+               } else {
+                       // scanner didn't provide size info, fallback to full size calculation
+                       $sizeDifference = 0;
+                       $this->cache->correctFolderSize($path, $data);
+               }
                $this->correctParentStorageMtime($path);
-               $this->cache->correctFolderSize($path, $data);
-               $this->propagator->propagateChange($path, $time);
+               $this->propagator->propagateChange($path, $time, $sizeDifference);
        }
 
        /**
index 0880e7e1282bb4ff0a927f5539d423ce27705505..92b784bf8ea92141cc559b71ddac583d55e2459a 100644 (file)
@@ -87,7 +87,9 @@ class FileCache extends \Test_Cache {
        }
 
        protected function tearDown() {
-               $this->instance->remove('hack', 'hack');
+               if ($this->instance) {
+                       $this->instance->remove('hack', 'hack');
+               }
 
                \OC_User::setUserId($this->user);
                \OC::$server->getConfig()->setSystemValue('cachedirectory', $this->datadir);