Merge pull request #21519 from owncloud/propagate-folder-size
propagate folder size in the same query for write updates
This commit is contained in:
commit
14c98b4df7
|
@ -22,10 +22,14 @@
|
|||
|
||||
namespace OC\Files\Cache;
|
||||
|
||||
use OC\Files\ObjectStore\NoopScanner;
|
||||
use OC\Files\Storage\Shared;
|
||||
|
||||
/**
|
||||
* Scanner for SharedStorage
|
||||
*/
|
||||
class SharedScanner extends Scanner {
|
||||
private $sourceScanner;
|
||||
|
||||
/**
|
||||
* Returns metadata from the shared storage, but
|
||||
|
@ -35,12 +39,35 @@ class SharedScanner extends Scanner {
|
|||
*
|
||||
* @return array an array of metadata of the file
|
||||
*/
|
||||
protected function getData($path){
|
||||
public function getData($path) {
|
||||
$data = parent::getData($path);
|
||||
$sourcePath = $this->storage->getSourcePath($path);
|
||||
list($sourceStorage, $internalPath) = \OC\Files\Filesystem::resolvePath($sourcePath);
|
||||
$data['permissions'] = $sourceStorage->getPermissions($internalPath);
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function getSourceScanner() {
|
||||
if ($this->sourceScanner) {
|
||||
return $this->sourceScanner;
|
||||
}
|
||||
if ($this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
|
||||
/** @var \OC\Files\Storage\Storage $storage */
|
||||
list($storage) = $this->storage->resolvePath('');
|
||||
$this->sourceScanner = $storage->getScanner();
|
||||
return $this->sourceScanner;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
|
||||
$sourceScanner = $this->getSourceScanner();
|
||||
if ($sourceScanner instanceof NoopScanner) {
|
||||
return [];
|
||||
} else {
|
||||
return parent::scanFile($file, $reuseExisting, $parentId, $cacheData, $lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,12 +32,13 @@ class SharedPropagator extends Propagator {
|
|||
/**
|
||||
* @param string $internalPath
|
||||
* @param int $time
|
||||
* @return array[] all propagated entries
|
||||
* @param int $sizeDifference
|
||||
* @return \array[] all propagated entries
|
||||
*/
|
||||
public function propagateChange($internalPath, $time) {
|
||||
public function propagateChange($internalPath, $time, $sizeDifference = 0) {
|
||||
$source = $this->storage->getSourcePath($internalPath);
|
||||
/** @var \OC\Files\Storage\Storage $storage */
|
||||
list($storage, $sourceInternalPath) = \OC\Files\Filesystem::resolvePath($source);
|
||||
return $storage->getPropagator()->propagateChange($sourceInternalPath, $time);
|
||||
return $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -609,7 +609,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
|
|||
* @param string $path
|
||||
* @return array
|
||||
*/
|
||||
private function resolvePath($path) {
|
||||
public function resolvePath($path) {
|
||||
$source = $this->getSourcePath($path);
|
||||
return \OC\Files\Filesystem::resolvePath($source);
|
||||
}
|
||||
|
|
|
@ -43,9 +43,10 @@ class Propagator implements IPropagator {
|
|||
/**
|
||||
* @param string $internalPath
|
||||
* @param int $time
|
||||
* @return array[] all propagated cache entries
|
||||
* @param int $sizeDifference number of bytes the file has grown
|
||||
* @return array[] all propagated entries
|
||||
*/
|
||||
public function propagateChange($internalPath, $time) {
|
||||
public function propagateChange($internalPath, $time, $sizeDifference = 0) {
|
||||
$cache = $this->storage->getCache($internalPath);
|
||||
|
||||
$parentId = $cache->getParentId($internalPath);
|
||||
|
@ -58,7 +59,12 @@ class Propagator implements IPropagator {
|
|||
}
|
||||
$mtime = max($time, $entry['mtime']);
|
||||
|
||||
$cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path'])]);
|
||||
if ($entry['size'] === -1) {
|
||||
$newSize = -1;
|
||||
} else {
|
||||
$newSize = $entry['size'] + $sizeDifference;
|
||||
}
|
||||
$cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path']), 'size' => $newSize]);
|
||||
|
||||
$parentId = $entry['parent'];
|
||||
}
|
||||
|
|
|
@ -198,6 +198,7 @@ class Scanner extends BasicEmitter implements IScanner {
|
|||
if (!empty($newData)) {
|
||||
$data['fileid'] = $this->addToCache($file, $newData, $fileId);
|
||||
}
|
||||
$data['oldSize'] = $cacheData['size'];
|
||||
|
||||
// post-emit only if it was a file. By that we avoid counting/treating folders as files
|
||||
if ($data['mimetype'] !== 'httpd/unix-directory') {
|
||||
|
|
|
@ -118,9 +118,15 @@ class Updater implements IUpdater {
|
|||
}
|
||||
|
||||
$data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
|
||||
if (isset($data['oldSize']) && isset($data['size'])) {
|
||||
$sizeDifference = $data['size'] - $data['oldSize'];
|
||||
} else {
|
||||
// scanner didn't provide size info, fallback to full size calculation
|
||||
$sizeDifference = 0;
|
||||
$this->cache->correctFolderSize($path, $data);
|
||||
}
|
||||
$this->correctParentStorageMtime($path);
|
||||
$this->cache->correctFolderSize($path, $data);
|
||||
$this->propagator->propagateChange($path, $time);
|
||||
$this->propagator->propagateChange($path, $time, $sizeDifference);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -87,7 +87,9 @@ class FileCache extends \Test_Cache {
|
|||
}
|
||||
|
||||
protected function tearDown() {
|
||||
$this->instance->remove('hack', 'hack');
|
||||
if ($this->instance) {
|
||||
$this->instance->remove('hack', 'hack');
|
||||
}
|
||||
|
||||
\OC_User::setUserId($this->user);
|
||||
\OC::$server->getConfig()->setSystemValue('cachedirectory', $this->datadir);
|
||||
|
|
Loading…
Reference in New Issue