Skip to content

Commit e1dfbb2

Browse files
authored
Merge pull request #60930 from nextcloud/test/noid/user-ldap-large-annotation
perf(user_ldap): chunk oracle queries for lower bind cost
2 parents b6d0e19 + 967d8de commit e1dfbb2

2 files changed

Lines changed: 8 additions & 2 deletions

File tree

apps/user_ldap/lib/Mapping/AbstractMapping.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,13 @@ protected function collectResultsFromListOfIdsQuery(IQueryBuilder $qb, array &$r
290290
public function getListOfIdsByDn(array $fdns): array {
291291
$totalDBParamLimit = 65000;
292292
$sliceSize = 1000;
293-
$maxSlices = $this->dbc->getDatabaseProvider() === IDBConnection::PLATFORM_SQLITE ? 9 : $totalDBParamLimit / $sliceSize;
293+
// SQLite's variable limit is very low; Oracle's OCI8 driver has high per-bind overhead,
294+
// making large parameter lists (65k) extremely slow — use smaller batches for both.
295+
$maxSlices = match ($this->dbc->getDatabaseProvider()) {
296+
IDBConnection::PLATFORM_SQLITE => 9,
297+
IDBConnection::PLATFORM_ORACLE => 5,
298+
default => $totalDBParamLimit / $sliceSize,
299+
};
294300
$results = [];
295301

296302
$slice = 1;

apps/user_ldap/tests/Mapping/AbstractMappingTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public function testGetListOfIdsByDn(): void {
284284
[$mapper,] = $this->initTest();
285285

286286
$listOfDNs = [];
287-
// List size exceeds the implementation's 65000-parameter chunk limit, forcing multiple chunked queries
287+
// List size exceeds any single-query chunk limit (65k for most DBs, 9k for SQLite, 5k for Oracle), forcing multiple chunked queries
288288
for ($i = 0; $i < 66640; $i++) {
289289
$name = 'as_' . $i;
290290
$dn = 'uid=' . $name . ',dc=example,dc=org';

0 commit comments

Comments
 (0)