2121 * along with this program. If not, see <http://www.gnu.org/licenses/>
2222 *
2323 */
24+
2425namespace OCA \Files \BackgroundJob ;
2526
2627use OC \Files \Utils \Scanner ;
2930use OCP \IConfig ;
3031use OCP \IDBConnection ;
3132use OCP \ILogger ;
32- use OCP \IUserManager ;
3333
3434/**
3535 * Class ScanFiles is a background job used to run the file scanner over the user
4040class ScanFiles extends \OC \BackgroundJob \TimedJob {
4141 /** @var IConfig */
4242 private $ config ;
43- /** @var IUserManager */
44- private $ userManager ;
4543 /** @var IEventDispatcher */
4644 private $ dispatcher ;
4745 /** @var ILogger */
@@ -53,14 +51,12 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
5351
5452 /**
5553 * @param IConfig $config
56- * @param IUserManager $userManager
5754 * @param IEventDispatcher $dispatcher
5855 * @param ILogger $logger
5956 * @param IDBConnection $connection
6057 */
6158 public function __construct (
6259 IConfig $ config ,
63- IUserManager $ userManager ,
6460 IEventDispatcher $ dispatcher ,
6561 ILogger $ logger ,
6662 IDBConnection $ connection
@@ -69,7 +65,6 @@ public function __construct(
6965 $ this ->setInterval (60 * 10 );
7066
7167 $ this ->config = $ config ;
72- $ this ->userManager = $ userManager ;
7368 $ this ->dispatcher = $ dispatcher ;
7469 $ this ->logger = $ logger ;
7570 $ this ->connection = $ connection ;
@@ -81,10 +76,10 @@ public function __construct(
8176 protected function runScanner (string $ user ) {
8277 try {
8378 $ scanner = new Scanner (
84- $ user ,
85- null ,
86- $ this ->dispatcher ,
87- $ this ->logger
79+ $ user ,
80+ null ,
81+ $ this ->dispatcher ,
82+ $ this ->logger
8883 );
8984 $ scanner ->backgroundScan ('' );
9085 } catch (\Exception $ e ) {
@@ -94,20 +89,20 @@ protected function runScanner(string $user) {
9489 }
9590
9691 /**
97- * Find all storages which have unindexed files and return a user for each
92+ * Find a storage which have unindexed files and return a user with access to the storage
9893 *
99- * @return string[]
94+ * @return string|false
10095 */
101- private function getUsersToScan (): array {
96+ private function getUserToScan () {
10297 $ query = $ this ->connection ->getQueryBuilder ();
103- $ query ->select ($ query -> func ()-> max ( 'user_id ' ) )
98+ $ query ->select ('user_id ' )
10499 ->from ('filecache ' , 'f ' )
105100 ->innerJoin ('f ' , 'mounts ' , 'm ' , $ query ->expr ()->eq ('storage_id ' , 'storage ' ))
106101 ->where ($ query ->expr ()->lt ('size ' , $ query ->createNamedParameter (0 , IQueryBuilder::PARAM_INT )))
107- ->groupBy ( ' storage_id ' )
108- ->setMaxResults (self :: USERS_PER_SESSION );
102+ ->andWhere ( $ query -> expr ()-> gt ( ' parent ' , $ query -> createNamedParameter (- 1 , IQueryBuilder:: PARAM_INT )) )
103+ ->setMaxResults (1 );
109104
110- return $ query ->execute ()->fetchAll (\ PDO :: FETCH_COLUMN );
105+ return $ query ->execute ()->fetchOne ( );
111106 }
112107
113108 /**
@@ -119,10 +114,18 @@ protected function run($argument) {
119114 return ;
120115 }
121116
122- $ users = $ this ->getUsersToScan ();
123-
124- foreach ($ users as $ user ) {
117+ $ usersScanned = 0 ;
118+ $ lastUser = '' ;
119+ $ user = $ this ->getUserToScan ();
120+ while ($ user && $ usersScanned < self ::USERS_PER_SESSION && $ lastUser !== $ user ) {
125121 $ this ->runScanner ($ user );
122+ $ lastUser = $ user ;
123+ $ user = $ this ->getUserToScan ();
124+ $ usersScanned += 1 ;
125+ }
126+
127+ if ($ lastUser === $ user ) {
128+ $ this ->logger ->warning ("User $ user still has unscanned files after running background scan, background scan might be stopped prematurely " );
126129 }
127130 }
128131}
0 commit comments