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