/**
* @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);
}
}
/**
* @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);
}
$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'];
}
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') {
}
$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);
}
/**
}
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);