Improve repository load times

This performance optimization results from the fact that during namespace loading, read permissions are no longer verified for every repository, but only for those that would result in a new namespace. Simply put: If a namespace has already been discovered, no further repositories within that namespace are checked.

We need the new function `streamAll` for this, because the `getAllRepositories` would create all repositories before returning them, which would make it impossible to intervene in time using the filter parameter.
This commit is contained in:
Rene Pfeuffer
2025-11-28 11:02:31 +00:00
committed by Thomas Zerr
parent 2e5831a1a3
commit 31fa1ba0a4
17 changed files with 33 additions and 19 deletions

View File

@@ -0,0 +1,2 @@
- type: fixed
description: Significantly improved repository load times for large numbers of repositories

View File

@@ -33,7 +33,7 @@
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/jest-preset": "^2.14.1",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@testing-library/react-hooks": "8.0.1",
"@types/react": "^17.0.1",
"react-test-renderer": "^17.0.1",

View File

@@ -18,7 +18,7 @@
"devDependencies": {
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"prettier": "@scm-manager/prettier-config",
"eslintConfig": {

View File

@@ -66,7 +66,7 @@
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/jest-preset": "^2.14.1",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@scm-manager/ui-syntaxhighlighting": "3.7.7-SNAPSHOT",
"@scm-manager/ui-shortcuts": "3.7.7-SNAPSHOT",
"@scm-manager/ui-text": "3.7.7-SNAPSHOT"

View File

@@ -35,7 +35,7 @@
"devDependencies": {
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@scm-manager/babel-preset": "^2.13.1",
"@scm-manager/ui-types": "3.7.7-SNAPSHOT",
"@types/mousetrap": "1.6.5",
@@ -80,4 +80,4 @@
"jest-extended/all"
]
}
}
}

View File

@@ -27,7 +27,7 @@
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/jest-preset": "^2.14.1",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@types/enzyme": "^3.10.18",
"@types/react": "^17.0.1",
"tsup": "^5.12.6",

View File

@@ -26,7 +26,7 @@
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"prettier": "@scm-manager/prettier-config",
"eslintConfig": {

View File

@@ -19,7 +19,7 @@
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"prettier": "@scm-manager/prettier-config",
"eslintConfig": {

View File

@@ -24,7 +24,7 @@
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"prettier": "@scm-manager/prettier-config",
"eslintConfig": {

View File

@@ -42,7 +42,7 @@
"@scm-manager/jest-preset": "^2.14.1",
"@scm-manager/plugin-scripts": "^1.6.1",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@scm-manager/ui-tests": "3.7.7-SNAPSHOT",
"@scm-manager/ui-types": "3.7.7-SNAPSHOT",
"@types/classnames": "^2.3.1",

View File

@@ -15,7 +15,7 @@
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"dependencies": {
"@scm-manager/ui-core": "3.7.7-SNAPSHOT"

View File

@@ -28,7 +28,7 @@
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/jest-preset": "^2.14.1",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@storybook/addon-essentials": "^6.5.10",
"@storybook/builder-webpack5": "^6.5.10",
"@storybook/manager-webpack5": "^6.5.10",

View File

@@ -17,7 +17,7 @@
"raf": "^3.4.1"
},
"peerDependencies": {
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@scm-manager/prettier-config": "^2.12.0",
"@types/enzyme": "^3.10.18"
},

View File

@@ -15,7 +15,7 @@
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/prettier-config": "^2.12.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT"
"@scm-manager/tsconfig": "^2.13.0"
},
"prettier": "@scm-manager/prettier-config",
"eslintConfig": {

View File

@@ -17,7 +17,7 @@
},
"devDependencies": {
"@scm-manager/eslint-config": "^2.17.0",
"@scm-manager/tsconfig": "3.7.7-SNAPSHOT",
"@scm-manager/tsconfig": "^2.13.0",
"@scm-manager/prettier-config": "^2.12.0"
},
"babel": {

View File

@@ -55,6 +55,7 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Stream;
import static java.util.Collections.emptySet;
import static sonia.scm.AlreadyExistsException.alreadyExists;
@@ -373,6 +374,16 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
return repositories;
}
private Stream<Repository> streamAll(Predicate<Repository> filter) {
return repositoryDAO
.getAll()
.stream()
.filter(repository -> handlerMap.containsKey(repository.getType()))
.filter(filter)
.filter(repository -> RepositoryPermissions.read().isPermitted(repository))
.map(this::postProcess);
}
@Override
public Collection<Repository> getAll() {
return getAll(repository -> true, null);
@@ -402,9 +413,10 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
@Deprecated
@Override
public Collection<String> getAllNamespaces() {
return getAll().stream()
.map(Repository::getNamespace)
.collect(LINKED_HASH_SET_COLLECTOR);
Set<String> foundNamespaces = new HashSet<>();
streamAll(repository -> !foundNamespaces.contains(repository.getNamespace()))
.forEach(repository -> foundNamespaces.add(repository.getNamespace()));
return foundNamespaces;
}
@Override

View File

@@ -3131,7 +3131,7 @@
unist-util-generated "^1.1.6"
unist-util-visit "^2.0.3"
"@scm-manager/tsconfig@^2.12.0", "@scm-manager/tsconfig@^2.13.0":
"@scm-manager/tsconfig@^2.13.0":
version "2.13.0"
resolved "https://registry.npmjs.org/@scm-manager/tsconfig/-/tsconfig-2.13.0.tgz"
integrity sha512-Tc9LZAxHUKd+yVBHcCMyRVYTBjhJez+zj+ABxiTOdZOQp/WtJ2Zt084HWxWEOyrXHI6dgo3qv+1H6P1m+UcpoQ==