]> source.dussan.org Git - nextcloud-server.git/commitdiff
Do not keep searching for recent 16432/head
authorRoeland Jago Douma <roeland@famdouma.nl>
Tue, 16 Jul 2019 17:10:09 +0000 (19:10 +0200)
committerBackportbot <backportbot-noreply@rullzer.com>
Wed, 17 Jul 2019 05:47:57 +0000 (05:47 +0000)
If userA has a lot of recent files. But only shares 1 file with userB
(that has no files at all). We could keep searching until we run out of
recent files for userA.

Now assume the inactive userB has 20 incomming shares like that from
different users. getRecent then basically keeps consuming huge amounts
of resources and with each iteration the load on the DB increases
(because of the offset).

This makes sure we do not get more than 3 times the limit we search for
or more than 5 queries.

This means we might miss some recent entries but we should fix that
separatly. This is just to make sure the load on the DB stays sane.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
lib/private/Files/Node/Folder.php

index 1e9088a7c19a03875c66f67b1667715df1fd6391..b0569a24aa140816084a1fd4df840304afe4cb87 100644 (file)
@@ -383,6 +383,8 @@ class Folder extends Node implements \OCP\Files\Folder {
                // Search in batches of 500 entries
                $searchLimit = 500;
                $results = [];
+               $searchResultCount = 0;
+               $count = 0;
                do {
                        $searchResult = $this->recentSearch($searchLimit, $offset, $storageIds, $folderMimetype);
 
@@ -391,6 +393,8 @@ class Folder extends Node implements \OCP\Files\Folder {
                                break;
                        }
 
+                       $searchResultCount += count($searchResult);
+
                        $parseResult = $this->recentParse($searchResult, $mountMap, $mimetypeLoader);
 
                        foreach ($parseResult as $result) {
@@ -398,7 +402,8 @@ class Folder extends Node implements \OCP\Files\Folder {
                        }
 
                        $offset += $searchLimit;
-               } while (count($results) < $limit);
+                       $count++;
+               } while (count($results) < $limit && ($searchResultCount < (3 * $limit) || $count < 5));
 
                return array_slice($results, 0, $limit);
        }