Merge pull request #4917 from owncloud/scan-clear-permissions

clear permissions cache when scanning a file
remotes/origin/stable6
Thomas Müller 13 years ago
commit 759f732aaa
  1. 65
      lib/files/cache/scanner.php
  2. 17
      tests/lib/files/cache/permissions.php

@ -36,6 +36,11 @@ class Scanner extends BasicEmitter {
*/
private $cache;
/**
* @var \OC\Files\Cache\Permissions $permissionsCache
*/
private $permissionsCache;
const SCAN_RECURSIVE = true;
const SCAN_SHALLOW = false;
@ -46,6 +51,7 @@ class Scanner extends BasicEmitter {
$this->storage = $storage;
$this->storageId = $this->storage->getId();
$this->cache = $storage->getCache();
$this->permissionsCache = $storage->getPermissionsCache();
}
/**
@ -96,39 +102,42 @@ 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'];
$cacheData = $this->cache->get($file);
if ($cacheData) {
$this->permissionsCache->remove($cacheData['fileid']);
if ($reuseExisting) {
// prevent empty etag
$etag = $cacheData['etag'];
$propagateETagChange = false;
if (empty($etag)) {
$etag = $data['etag'];
$propagateETagChange = true;
}
if ($reuseExisting & self::REUSE_ETAG) {
$data['etag'] = $etag;
if ($propagateETagChange) {
$parent = $file;
while ($parent !== '') {
$parent = dirname($parent);
if ($parent === '.') {
$parent = '';
// 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'] = $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),
));
}
$parentCacheData = $this->cache->get($parent);
$this->cache->update($parentCacheData['fileid'], array(
'etag' => $this->storage->getETag($parent),
));
}
}
}
// Only update metadata that has changed
$newData = array_diff($data, $cacheData);
}
// Only update metadata that has changed
$newData = array_diff($data, $cacheData);
}
if (!empty($newData)) {
$this->cache->put($file, $newData);
@ -182,7 +191,7 @@ class Scanner extends BasicEmitter {
$newChildren = array();
if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) {
\OC_DB::beginTransaction();
if(is_resource($dh)) {
if (is_resource($dh)) {
while (($file = readdir($dh)) !== false) {
$child = ($path) ? $path . '/' . $file : $file;
if (!Filesystem::isIgnoredDir($file)) {

@ -8,6 +8,8 @@
namespace Test\Files\Cache;
use OC\Files\Storage\Temporary;
class Permissions extends \PHPUnit_Framework_TestCase {
/***
* @var \OC\Files\Cache\Permissions $permissionsCache
@ -55,4 +57,19 @@ class Permissions extends \PHPUnit_Framework_TestCase {
$this->permissionsCache->removeMultiple($ids, $user);
}
public function testUpdatePermissionsOnRescan() {
$storage = new Temporary(array());
$scanner = $storage->getScanner();
$cache = $storage->getCache();
$permissionsCache = $storage->getPermissionsCache();
$storage->file_put_contents('foo.txt', 'bar');
$scanner->scan('');
$id = $cache->getId('foo.txt');
$permissionsCache->set($id, 'test', 1);
$scanner->scan('');
$this->assertEquals(-1, $permissionsCache->get($id, 'test'));
}
}

Loading…
Cancel
Save