From ddbbe1742fda9b508da5c6369dc2a2d5e19cec95 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 7 Jan 2016 18:13:35 +0100 Subject: [PATCH] propagate folder size in the same query for write updates --- apps/files_sharing/lib/sharedpropagator.php | 7 ++++--- lib/private/files/cache/propagator.php | 12 +++++++++--- lib/private/files/cache/scanner.php | 1 + lib/private/files/cache/updater.php | 10 ++++++++-- tests/lib/cache/file.php | 4 +++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/apps/files_sharing/lib/sharedpropagator.php b/apps/files_sharing/lib/sharedpropagator.php index fd3e14b28f..2973593449 100644 --- a/apps/files_sharing/lib/sharedpropagator.php +++ b/apps/files_sharing/lib/sharedpropagator.php @@ -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); } } diff --git a/lib/private/files/cache/propagator.php b/lib/private/files/cache/propagator.php index 1e85a2ecc8..50264e54d4 100644 --- a/lib/private/files/cache/propagator.php +++ b/lib/private/files/cache/propagator.php @@ -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']; } diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php index 1c50978a2e..60daa323b4 100644 --- a/lib/private/files/cache/scanner.php +++ b/lib/private/files/cache/scanner.php @@ -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') { diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index 58d8e53cfd..80ba704883 100644 --- a/lib/private/files/cache/updater.php +++ b/lib/private/files/cache/updater.php @@ -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); } /** diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php index 0880e7e128..92b784bf8e 100644 --- a/tests/lib/cache/file.php +++ b/tests/lib/cache/file.php @@ -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);