etag changes are now propagated up the file tree
This commit is contained in:
parent
3b42ac8eb6
commit
c8f9efeb94
|
@ -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']);
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue