propagate changes in the scanner

This commit is contained in:
Robin Appelman 2014-06-02 15:17:00 +02:00
parent 0158788a2a
commit e002ff6065
3 changed files with 77 additions and 1 deletions

View File

@ -189,6 +189,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);
}

View File

@ -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;
@ -26,11 +28,17 @@ 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);
}
/**
@ -82,6 +99,7 @@ class Scanner extends PublicEmitter {
$this->attachListener($mount);
$scanner->backgroundScan();
}
$this->propagator->propagateChanges(time());
}
/**
@ -95,8 +113,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());
}
}

View File

@ -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']);
}
}