Skip local shares in bkg scan and occ files:scan (#26590)

Local shares should only be scanned when doing it for the owner to
avoid repeatedly rescanning the same shared storage over and over again
for every recipient.
This commit is contained in:
Vincent Petry 2016-11-10 15:44:18 +01:00 committed by Roeland Jago Douma
parent b727edf17e
commit 706655ef20
No known key found for this signature in database
GPG key ID: F941078878347C0C
2 changed files with 35 additions and 5 deletions

View file

@ -118,14 +118,19 @@ class Scanner extends PublicEmitter {
public function backgroundScan($dir) {
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
if (is_null($mount->getStorage())) {
$storage = $mount->getStorage();
if (is_null($storage)) {
continue;
}
// don't scan the root storage
if ($mount->getStorage()->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
if ($storage->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
continue;
}
// don't scan received local shares, these can be scanned when scanning the owner's storage
if ($storage->instanceOfStorage('OCA\Files_Sharing\ISharedStorage')) {
continue;
}
$storage = $mount->getStorage();
$scanner = $storage->getScanner();
$this->attachListener($mount);
@ -156,10 +161,10 @@ class Scanner extends PublicEmitter {
}
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
if (is_null($mount->getStorage())) {
$storage = $mount->getStorage();
if (is_null($storage)) {
continue;
}
$storage = $mount->getStorage();
// if the home storage isn't writable then the scanner is run as the wrong user
if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and
(!$storage->isCreatable('') or !$storage->isCreatable('files'))
@ -171,6 +176,11 @@ class Scanner extends PublicEmitter {
}
}
// don't scan received local shares, these can be scanned when scanning the owner's storage
if ($storage->instanceOfStorage('OCA\Files_Sharing\ISharedStorage')) {
continue;
}
$relativePath = $mount->getInternalPath($dir);
$scanner = $storage->getScanner();
$scanner->setUseTransactions(false);

View file

@ -188,4 +188,24 @@ class ScannerTest extends \Test\TestCase {
$this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag());
}
public function testSkipLocalShares() {
$sharedStorage = $this->createMock('OCA\Files_Sharing\SharedStorage');
$sharedMount = new MountPoint($sharedStorage, '/share');
Filesystem::getMountManager()->addMount($sharedMount);
$sharedStorage->expects($this->any())
->method('instanceOfStorage')
->will($this->returnValueMap([
['OCA\Files_Sharing\ISharedStorage', true],
]));
$sharedStorage->expects($this->never())
->method('getScanner');
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
$scanner->addMount($sharedMount);
$scanner->scan('');
$scanner->backgroundScan('');
}
}