From d26a427f92259ab067da64803c00e7f1589060b0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Oct 2014 17:15:46 +0200 Subject: [PATCH] Also propagate etag changes when the watcher finds a changed file --- lib/private/files/cache/updater.php | 5 +++++ lib/private/files/view.php | 2 ++ tests/lib/files/view.php | 31 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index c303ff24b1f..31a4a7c21e7 100644 --- a/lib/private/files/cache/updater.php +++ b/lib/private/files/cache/updater.php @@ -30,6 +30,11 @@ class Updater { $this->propagator = new ChangePropagator($view); } + public function propagate($path, $time = null) { + $this->propagator->addChange($path); + $this->propagator->propagateChanges($time); + } + /** * Update the cache for $path * diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 5f5f29ded4f..e15a3063e94 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -903,6 +903,7 @@ class View { $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); $data = $cache->get($internalPath); } else if ($watcher->checkUpdate($internalPath, $data)) { + $this->updater->propagate($path); $data = $cache->get($internalPath); } @@ -974,6 +975,7 @@ class View { $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); $data = $cache->get($internalPath); } else if ($watcher->checkUpdate($internalPath, $data)) { + $this->updater->propagate($path); $data = $cache->get($internalPath); } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index 5f030f29fa7..086ac873bfb 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -8,6 +8,7 @@ namespace Test\Files; use OC\Files\Cache\Watcher; +use OC\Files\Storage\Temporary; class TemporaryNoTouch extends \OC\Files\Storage\Temporary { public function touch($path, $mtime = null) { @@ -652,6 +653,36 @@ class View extends \PHPUnit_Framework_TestCase { $this->assertSame($info['etag'], $info2['etag']); } + public function testWatcherEtagCrossStorage() { + $storage1 = new Temporary(array()); + $storage2 = new Temporary(array()); + $scanner1 = $storage1->getScanner(); + $scanner2 = $storage2->getScanner(); + $storage1->mkdir('sub'); + \OC\Files\Filesystem::mount($storage1, array(), '/test/'); + \OC\Files\Filesystem::mount($storage2, array(), '/test/sub/storage'); + + $past = time() - 100; + $storage2->file_put_contents('test.txt', 'foobar'); + $scanner1->scan(''); + $scanner2->scan(''); + $view = new \OC\Files\View(''); + + $storage2->getWatcher('')->setPolicy(Watcher::CHECK_ALWAYS); + + $oldFileInfo = $view->getFileInfo('/test/sub/storage/test.txt'); + $oldFolderInfo = $view->getFileInfo('/test'); + + $storage2->getCache()->update($oldFileInfo->getId(), array( + 'storage_mtime' => $past + )); + + $view->getFileInfo('/test/sub/storage/test.txt'); + $newFolderInfo = $view->getFileInfo('/test'); + + $this->assertNotEquals($newFolderInfo->getEtag(), $oldFolderInfo->getEtag()); + } + /** * @dataProvider absolutePathProvider */ -- 2.39.5