diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index c303ff24b1..31a4a7c21e 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 5f5f29ded4..e15a3063e9 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 5f030f29fa..086ac873bf 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 */