|
|
|
|
@ -30,7 +30,6 @@ use OCP\EventDispatcher\IEventDispatcher;
|
|
|
|
|
use OCP\IConfig;
|
|
|
|
|
use OCP\IDBConnection;
|
|
|
|
|
use OCP\ILogger;
|
|
|
|
|
use OCP\IUserManager;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class ScanFiles is a background job used to run the file scanner over the user
|
|
|
|
|
@ -41,8 +40,6 @@ use OCP\IUserManager;
|
|
|
|
|
class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
/** @var IConfig */
|
|
|
|
|
private $config;
|
|
|
|
|
/** @var IUserManager */
|
|
|
|
|
private $userManager;
|
|
|
|
|
/** @var IEventDispatcher */
|
|
|
|
|
private $dispatcher;
|
|
|
|
|
/** @var ILogger */
|
|
|
|
|
@ -54,14 +51,12 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param IConfig $config
|
|
|
|
|
* @param IUserManager $userManager
|
|
|
|
|
* @param IEventDispatcher $dispatcher
|
|
|
|
|
* @param ILogger $logger
|
|
|
|
|
* @param IDBConnection $connection
|
|
|
|
|
*/
|
|
|
|
|
public function __construct(
|
|
|
|
|
IConfig $config,
|
|
|
|
|
IUserManager $userManager,
|
|
|
|
|
IEventDispatcher $dispatcher,
|
|
|
|
|
ILogger $logger,
|
|
|
|
|
IDBConnection $connection
|
|
|
|
|
@ -70,7 +65,6 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
$this->setInterval(60 * 10);
|
|
|
|
|
|
|
|
|
|
$this->config = $config;
|
|
|
|
|
$this->userManager = $userManager;
|
|
|
|
|
$this->dispatcher = $dispatcher;
|
|
|
|
|
$this->logger = $logger;
|
|
|
|
|
$this->connection = $connection;
|
|
|
|
|
@ -82,10 +76,10 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
protected function runScanner(string $user) {
|
|
|
|
|
try {
|
|
|
|
|
$scanner = new Scanner(
|
|
|
|
|
$user,
|
|
|
|
|
null,
|
|
|
|
|
$this->dispatcher,
|
|
|
|
|
$this->logger
|
|
|
|
|
$user,
|
|
|
|
|
null,
|
|
|
|
|
$this->dispatcher,
|
|
|
|
|
$this->logger
|
|
|
|
|
);
|
|
|
|
|
$scanner->backgroundScan('');
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
@ -95,20 +89,20 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Find all storages which have unindexed files and return a user for each
|
|
|
|
|
* Find a storage which have unindexed files and return a user with access to the storage
|
|
|
|
|
*
|
|
|
|
|
* @return string[]
|
|
|
|
|
* @return string|false
|
|
|
|
|
*/
|
|
|
|
|
private function getUsersToScan(): array {
|
|
|
|
|
private function getUserToScan() {
|
|
|
|
|
$query = $this->connection->getQueryBuilder();
|
|
|
|
|
$query->select($query->func()->max('user_id'))
|
|
|
|
|
$query->select('user_id')
|
|
|
|
|
->from('filecache', 'f')
|
|
|
|
|
->innerJoin('f', 'mounts', 'm', $query->expr()->eq('storage_id', 'storage'))
|
|
|
|
|
->where($query->expr()->lt('size', $query->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
|
|
|
|
|
->groupBy('storage_id')
|
|
|
|
|
->setMaxResults(self::USERS_PER_SESSION);
|
|
|
|
|
->andWhere($query->expr()->gt('parent', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
|
|
|
|
|
->setMaxResults(1);
|
|
|
|
|
|
|
|
|
|
return $query->execute()->fetchAll(\PDO::FETCH_COLUMN);
|
|
|
|
|
return $query->execute()->fetchOne();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -120,10 +114,18 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$users = $this->getUsersToScan();
|
|
|
|
|
|
|
|
|
|
foreach ($users as $user) {
|
|
|
|
|
$usersScanned = 0;
|
|
|
|
|
$lastUser = '';
|
|
|
|
|
$user = $this->getUserToScan();
|
|
|
|
|
while ($user && $usersScanned < self::USERS_PER_SESSION && $lastUser !== $user) {
|
|
|
|
|
$this->runScanner($user);
|
|
|
|
|
$lastUser = $user;
|
|
|
|
|
$user = $this->getUserToScan();
|
|
|
|
|
$usersScanned += 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($lastUser === $user) {
|
|
|
|
|
$this->logger->warning("User $user still has unscanned files after running background scan, background scan might be stopped prematurely");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|