[Pkg-owncloud-commits] [owncloud] 49/85: propagate changes in the scanner

David Prévot taffit at moszumanska.debian.org
Tue Jun 17 19:12:44 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch 6.0
in repository owncloud.

commit 81f6e78c0c4d8feb173fef88f3b797c779369e95
Author: Robin Appelman <icewind at owncloud.com>
Date:   Mon Jun 2 15:17:00 2014 +0200

    propagate changes in the scanner
---
 lib/private/files/cache/scanner.php |  1 +
 lib/private/files/utils/scanner.php | 21 +++++++++++++-
 tests/lib/files/utils/scanner.php   | 56 +++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index 4404ba5..0acdf55 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -190,6 +190,7 @@ class Scanner extends BasicEmitter {
 	 */
 	protected function updateCache($path, $data) {
 		\OC_Hook::emit('Scanner', 'addToCache', array('file' => $path, 'data' => $data));
+		$this->emit('\OC\Files\Cache\Scanner', 'updateCache', array($path, $this->storageId, $data));
 		if ($this->cacheActive) {
 			$this->cache->put($path, $data);
 		}
diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index 2cad7dd..e4c35f9 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
@@ -8,6 +8,8 @@
 
 namespace OC\Files\Utils;
 
+use OC\Files\View;
+use OC\Files\Cache\ChangePropagator;
 use OC\Files\Filesystem;
 use OC\Hooks\PublicEmitter;
 
@@ -27,10 +29,16 @@ class Scanner extends PublicEmitter {
 	private $user;
 
 	/**
+	 * @var \OC\Files\Cache\ChangePropagator
+	 */
+	protected $propagator;
+
+	/**
 	 * @param string $user
 	 */
 	public function __construct($user) {
 		$this->user = $user;
+		$this->propagator = new ChangePropagator(new View(''));
 	}
 
 	/**
@@ -67,6 +75,15 @@ class Scanner extends PublicEmitter {
 		$scanner->listen('\OC\Files\Cache\Scanner', 'scanFolder', function ($path) use ($mount, $emitter) {
 			$emitter->emit('\OC\Files\Utils\Scanner', 'scanFolder', array($mount->getMountPoint() . $path));
 		});
+
+		// propagate etag and mtimes when files are changed or removed
+		$propagator = $this->propagator;
+		$propagatorListener = function ($path) use ($mount, $propagator) {
+			$fullPath = Filesystem::normalizePath($mount->getMountPoint() . $path);
+			$propagator->addChange($fullPath);
+		};
+		$scanner->listen('\OC\Files\Cache\Scanner', 'addToCache', $propagatorListener);
+		$scanner->listen('\OC\Files\Cache\Scanner', 'removeFromCache', $propagatorListener);
 	}
 
 	public function backgroundScan($dir) {
@@ -79,6 +96,7 @@ class Scanner extends PublicEmitter {
 			$this->attachListener($mount);
 			$scanner->backgroundScan();
 		}
+		$this->propagator->propagateChanges(time());
 	}
 
 	public function scan($dir) {
@@ -89,8 +107,9 @@ class Scanner extends PublicEmitter {
 			}
 			$scanner = $mount->getStorage()->getScanner();
 			$this->attachListener($mount);
-			$scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG);
+			$scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE);
 		}
+		$this->propagator->propagateChanges(time());
 	}
 }
 
diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php
index a021d21..4610e2b 100644
--- a/tests/lib/files/utils/scanner.php
+++ b/tests/lib/files/utils/scanner.php
@@ -8,6 +8,7 @@
 
 namespace Test\Files\Utils;
 
+use OC\Files\Filesystem;
 use OC\Files\Mount\Mount;
 use OC\Files\Storage\Temporary;
 
@@ -27,6 +28,14 @@ class TestScanner extends \OC\Files\Utils\Scanner {
 	protected function getMounts($dir) {
 		return $this->mounts;
 	}
+
+	public function getPropagator() {
+		return $this->propagator;
+	}
+
+	public function setPropagator($propagator) {
+		$this->propagator = $propagator;
+	}
 }
 
 class Scanner extends \PHPUnit_Framework_TestCase {
@@ -71,4 +80,51 @@ class Scanner extends \PHPUnit_Framework_TestCase {
 		$new = $cache->get('folder/bar.txt');
 		$this->assertEquals($old, $new);
 	}
+
+	public function testChangePropagator() {
+		/**
+		 * @var \OC\Files\Cache\ChangePropagator $propagator
+		 */
+		$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
+
+		$storage = new Temporary(array());
+		$mount = new Mount($storage, '/foo');
+		Filesystem::getMountManager()->addMount($mount);
+		$cache = $storage->getCache();
+
+		$storage->mkdir('folder');
+		$storage->file_put_contents('foo.txt', 'qwerty');
+		$storage->file_put_contents('folder/bar.txt', 'qwerty');
+
+		$scanner = new TestScanner('');
+		$originalPropagator = $scanner->getPropagator();
+		$scanner->setPropagator($propagator);
+		$scanner->addMount($mount);
+
+		$scanner->scan('');
+
+		$this->assertEquals(array('/foo', '/foo/foo.txt', '/foo/folder', '/foo/folder/bar.txt'), $propagator->getChanges());
+		$this->assertEquals(array('/', '/foo', '/foo/folder'), $propagator->getAllParents());
+
+		$cache->put('foo.txt', array('mtime' => time() - 50));
+
+		$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
+		$scanner->setPropagator($propagator);
+		$storage->file_put_contents('foo.txt', 'asdasd');
+
+		$scanner->scan('');
+
+		$this->assertEquals(array('/foo/foo.txt'), $propagator->getChanges());
+		$this->assertEquals(array('/', '/foo'), $propagator->getAllParents());
+
+		$scanner->setPropagator($originalPropagator);
+
+		$oldInfo = $cache->get('');
+		$cache->put('foo.txt', array('mtime' => time() - 70));
+		$storage->file_put_contents('foo.txt', 'asdasd');
+
+		$scanner->scan('');
+		$newInfo = $cache->get('');
+		$this->assertNotEquals($oldInfo['etag'], $newInfo['etag']);
+	}
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list