/** * Do a batch lookup from cache for file stats for all paths * used in a list of storage paths or FileOp objects. * This loads the persistent cache values into the process cache. * * @param array $items List of storage paths */ protected final function primeFileCache(array $items) { $ps = $this->scopedProfileSection(__METHOD__ . "-{$this->name}"); $paths = []; // list of storage paths $pathNames = []; // (cache key => storage path) // Get all the paths/containers from the items... foreach ($items as $item) { if (self::isStoragePath($item)) { $paths[] = FileBackend::normalizeStoragePath($item); } } // Get rid of any paths that failed normalization... $paths = array_filter($paths, 'strlen'); // remove nulls // Get all the corresponding cache keys for paths... foreach ($paths as $path) { list(, $rel, ) = $this->resolveStoragePath($path); if ($rel !== null) { // valid path for this backend $pathNames[$this->fileCacheKey($path)] = $path; } } // Get all cache entries for these file cache keys... $values = $this->memCache->getMulti(array_keys($pathNames)); foreach ($values as $cacheKey => $val) { $path = $pathNames[$cacheKey]; if (is_array($val)) { $val['latest'] = false; // never completely trust cache $this->cheapCache->set($path, 'stat', $val); if (isset($val['sha1'])) { // some backends store SHA-1 as metadata $this->cheapCache->set($path, 'sha1', ['hash' => $val['sha1'], 'latest' => false]); } if (isset($val['xattr'])) { // some backends store headers/metadata $val['xattr'] = self::normalizeXAttributes($val['xattr']); $this->cheapCache->set($path, 'xattr', ['map' => $val['xattr'], 'latest' => false]); } } } }
/** * @dataProvider provider_normalizeStoragePath */ public function testNormalizeStoragePath($path, $res) { $this->assertEquals($res, FileBackend::normalizeStoragePath($path), "FileBackend::normalizeStoragePath on path '{$path}'"); }
/** * Normalize a string if it is a valid storage path * * @param $path string * @return string */ protected static function normalizeIfValidStoragePath($path) { if (FileBackend::isStoragePath($path)) { $res = FileBackend::normalizeStoragePath($path); return $res !== null ? $res : $path; } return $path; }
/** * Do a batch lookup from cache for file stats for all paths * used in a list of storage paths or FileOp objects. * This loads the persistent cache values into the process cache. * * @param array $items List of storage paths or FileOps * @return void */ protected final function primeFileCache(array $items) { wfProfileIn(__METHOD__); wfProfileIn(__METHOD__ . '-' . $this->name); $paths = array(); // list of storage paths $pathNames = array(); // (cache key => storage path) // Get all the paths/containers from the items... foreach ($items as $item) { if ($item instanceof FileOp) { $paths = array_merge($paths, $item->storagePathsRead()); $paths = array_merge($paths, $item->storagePathsChanged()); } elseif (self::isStoragePath($item)) { $paths[] = FileBackend::normalizeStoragePath($item); } } // Get rid of any paths that failed normalization... $paths = array_filter($paths, 'strlen'); // remove nulls // Get all the corresponding cache keys for paths... foreach ($paths as $path) { list(, $rel, ) = $this->resolveStoragePath($path); if ($rel !== null) { // valid path for this backend $pathNames[$this->fileCacheKey($path)] = $path; } } // Get all cache entries for these container cache keys... $values = $this->memCache->getMulti(array_keys($pathNames)); foreach ($values as $cacheKey => $val) { if (is_array($val)) { $path = $pathNames[$cacheKey]; $this->cheapCache->set($path, 'stat', $val); if (isset($val['sha1'])) { // some backends store SHA-1 as metadata $this->cheapCache->set($path, 'sha1', array('hash' => $val['sha1'], 'latest' => $val['latest'])); } } } wfProfileOut(__METHOD__ . '-' . $this->name); wfProfileOut(__METHOD__); }