propagate changes in the scanner
This commit is contained in:
parent
0158788a2a
commit
e002ff6065
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue