Merge pull request #4869 from owncloud/fixing-4866-master
recreate an etag within the scanner if the cache contains an empty etag
This commit is contained in:
commit
5d671a84b2
|
@ -201,7 +201,6 @@ class Cache {
|
|||
$data['path'] = $file;
|
||||
$data['parent'] = $this->getParentId($file);
|
||||
$data['name'] = \OC_Util::basename($file);
|
||||
$data['encrypted'] = isset($data['encrypted']) ? ((int)$data['encrypted']) : 0;
|
||||
|
||||
list($queryParts, $params) = $this->buildParts($data);
|
||||
$queryParts[] = '`storage`';
|
||||
|
@ -265,6 +264,9 @@ class Cache {
|
|||
$params[] = $value;
|
||||
$queryParts[] = '`mtime`';
|
||||
}
|
||||
} elseif ($name === 'encrypted') {
|
||||
// Boolean to integer conversion
|
||||
$value = $value ? 1 : 0;
|
||||
}
|
||||
$params[] = $value;
|
||||
$queryParts[] = '`' . $name . '`';
|
||||
|
|
|
@ -97,13 +97,34 @@ class Scanner extends BasicEmitter {
|
|||
}
|
||||
$newData = $data;
|
||||
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 (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
|
||||
if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
|
||||
$data['size'] = $cacheData['size'];
|
||||
}
|
||||
if ($reuseExisting & self::REUSE_ETAG) {
|
||||
$data['etag'] = $cacheData['etag'];
|
||||
$data['etag'] = $etag;
|
||||
if ($propagateETagChange) {
|
||||
$parent = $file;
|
||||
while ($parent !== '') {
|
||||
$parent = dirname($parent);
|
||||
if ($parent === '.') {
|
||||
$parent = '';
|
||||
}
|
||||
$parentCacheData = $this->cache->get($parent);
|
||||
$this->cache->update($parentCacheData['fileid'], array(
|
||||
'etag' => $this->storage->getETag($parent),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Only update metadata that has changed
|
||||
|
|
|
@ -24,6 +24,21 @@ class Scanner extends \PHPUnit_Framework_TestCase {
|
|||
*/
|
||||
private $cache;
|
||||
|
||||
function setUp() {
|
||||
$this->storage = new \OC\Files\Storage\Temporary(array());
|
||||
$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
|
||||
$this->cache = new \OC\Files\Cache\Cache($this->storage);
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
if ($this->cache) {
|
||||
$ids = $this->cache->getAll();
|
||||
$permissionsCache = $this->storage->getPermissionsCache();
|
||||
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
|
||||
$this->cache->clear();
|
||||
}
|
||||
}
|
||||
|
||||
function testFile() {
|
||||
$data = "dummy file data\n";
|
||||
$this->storage->file_put_contents('foo.txt', $data);
|
||||
|
@ -194,18 +209,28 @@ class Scanner extends \PHPUnit_Framework_TestCase {
|
|||
$this->assertFalse($this->cache->inCache('folder/bar.txt'));
|
||||
}
|
||||
|
||||
function setUp() {
|
||||
$this->storage = new \OC\Files\Storage\Temporary(array());
|
||||
$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
|
||||
$this->cache = new \OC\Files\Cache\Cache($this->storage);
|
||||
}
|
||||
public function testETagRecreation() {
|
||||
$this->fillTestFolders();
|
||||
|
||||
function tearDown() {
|
||||
if ($this->cache) {
|
||||
$ids = $this->cache->getAll();
|
||||
$permissionsCache = $this->storage->getPermissionsCache();
|
||||
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
|
||||
$this->cache->clear();
|
||||
}
|
||||
$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);
|
||||
$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('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