Skip to content
Snippets Groups Projects
Commit c8f9efeb authored by Thomas Müller's avatar Thomas Müller
Browse files

etag changes are now propagated up the file tree

parent 3b42ac8e
No related branches found
No related tags found
No related merge requests found
......@@ -99,8 +99,10 @@ class Scanner extends BasicEmitter {
if ($reuseExisting and $cacheData = $this->cache->get($file)) {
// prevent empty etag
$etag = $cacheData['etag'];
$propagateETagChange = false;
if (empty($etag)) {
$etag = $data['etag'];
$propagateETagChange = true;
}
// only reuse data if the file hasn't explicitly changed
......@@ -110,6 +112,18 @@ class Scanner extends BasicEmitter {
}
if ($reuseExisting & self::REUSE_ETAG) {
$data['etag'] = $etag;
if ($propagateETagChange) {
$parent = $file;
while ($parent !== '') {
$parent = dirname($parent);
if ($parent === '.') {
$parent = '';
}
$parentCacheData = $this->cache->get($parent);
$parentCacheData['etag'] = $this->storage->getETag($parent);
$this->cache->put($parent, $parentCacheData);
}
}
}
}
// Only update metadata that has changed
......
......@@ -187,17 +187,26 @@ class Scanner extends \PHPUnit_Framework_TestCase {
public function testETagRecreation() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->scanner->scan('folder/bar.txt');
// manipulate etag to simulate an empty etag
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
$data['etag'] = '';
$this->cache->put('', $data);
$data0 = $this->cache->get('folder/bar.txt');
$data1 = $this->cache->get('folder');
$data2 = $this->cache->get('');
$data0['etag'] = '';
$this->cache->put('folder/bar.txt', $data0);
// rescan
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
$newData = $this->cache->get('');
$this->assertNotEmpty($newData['etag']);
$this->scanner->scan('folder/bar.txt', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
// verify cache content
$newData0 = $this->cache->get('folder/bar.txt');
$newData1 = $this->cache->get('folder');
$newData2 = $this->cache->get('');
$this->assertNotEmpty($newData0['etag']);
$this->assertNotEquals($data1['etag'], $newData1['etag']);
$this->assertNotEquals($data2['etag'], $newData2['etag']);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment