From 31fa1ba0a4d13a4307b7bf2dd44c1cf16b0fd069 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 28 Nov 2025 11:02:31 +0000 Subject: [PATCH] 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. --- gradle/changelog/repo_permissions.yaml | 2 ++ scm-ui/ui-api/package.json | 2 +- scm-ui/ui-buttons/package.json | 2 +- scm-ui/ui-components/package.json | 2 +- scm-ui/ui-core/package.json | 4 ++-- scm-ui/ui-extensions/package.json | 2 +- scm-ui/ui-forms/package.json | 2 +- scm-ui/ui-layout/package.json | 2 +- scm-ui/ui-overlays/package.json | 2 +- scm-ui/ui-plugins/package.json | 2 +- scm-ui/ui-shortcuts/package.json | 2 +- scm-ui/ui-syntaxhighlighting/package.json | 2 +- scm-ui/ui-tests/package.json | 2 +- scm-ui/ui-text/package.json | 2 +- scm-ui/ui-types/package.json | 2 +- .../repository/DefaultRepositoryManager.java | 18 +++++++++++++++--- yarn.lock | 2 +- 17 files changed, 33 insertions(+), 19 deletions(-) create mode 100644 gradle/changelog/repo_permissions.yaml diff --git a/gradle/changelog/repo_permissions.yaml b/gradle/changelog/repo_permissions.yaml new file mode 100644 index 0000000000..f589356760 --- /dev/null +++ b/gradle/changelog/repo_permissions.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Significantly improved repository load times for large numbers of repositories diff --git a/scm-ui/ui-api/package.json b/scm-ui/ui-api/package.json index 104e941749..390b8908e8 100644 --- a/scm-ui/ui-api/package.json +++ b/scm-ui/ui-api/package.json @@ -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", diff --git a/scm-ui/ui-buttons/package.json b/scm-ui/ui-buttons/package.json index 0478e631f5..95de0337d2 100644 --- a/scm-ui/ui-buttons/package.json +++ b/scm-ui/ui-buttons/package.json @@ -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": { diff --git a/scm-ui/ui-components/package.json b/scm-ui/ui-components/package.json index d2bb7cbf2b..bb7b86747a 100644 --- a/scm-ui/ui-components/package.json +++ b/scm-ui/ui-components/package.json @@ -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" diff --git a/scm-ui/ui-core/package.json b/scm-ui/ui-core/package.json index 393b63ce79..4a86df2e5f 100644 --- a/scm-ui/ui-core/package.json +++ b/scm-ui/ui-core/package.json @@ -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" ] } -} \ No newline at end of file +} diff --git a/scm-ui/ui-extensions/package.json b/scm-ui/ui-extensions/package.json index 9029efcf32..4bfd99d462 100644 --- a/scm-ui/ui-extensions/package.json +++ b/scm-ui/ui-extensions/package.json @@ -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", diff --git a/scm-ui/ui-forms/package.json b/scm-ui/ui-forms/package.json index 9ad0b20755..e81567ff7c 100644 --- a/scm-ui/ui-forms/package.json +++ b/scm-ui/ui-forms/package.json @@ -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": { diff --git a/scm-ui/ui-layout/package.json b/scm-ui/ui-layout/package.json index 091149815e..375b6af9c9 100644 --- a/scm-ui/ui-layout/package.json +++ b/scm-ui/ui-layout/package.json @@ -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": { diff --git a/scm-ui/ui-overlays/package.json b/scm-ui/ui-overlays/package.json index fe5e78e329..343c7f9ba7 100644 --- a/scm-ui/ui-overlays/package.json +++ b/scm-ui/ui-overlays/package.json @@ -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": { diff --git a/scm-ui/ui-plugins/package.json b/scm-ui/ui-plugins/package.json index 7f0d8b2825..878e09a93d 100644 --- a/scm-ui/ui-plugins/package.json +++ b/scm-ui/ui-plugins/package.json @@ -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", diff --git a/scm-ui/ui-shortcuts/package.json b/scm-ui/ui-shortcuts/package.json index 8af2f37057..e314aeda8b 100644 --- a/scm-ui/ui-shortcuts/package.json +++ b/scm-ui/ui-shortcuts/package.json @@ -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" diff --git a/scm-ui/ui-syntaxhighlighting/package.json b/scm-ui/ui-syntaxhighlighting/package.json index 985131b3ff..8be1e07643 100644 --- a/scm-ui/ui-syntaxhighlighting/package.json +++ b/scm-ui/ui-syntaxhighlighting/package.json @@ -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", diff --git a/scm-ui/ui-tests/package.json b/scm-ui/ui-tests/package.json index bb082e1758..edbba3f05c 100644 --- a/scm-ui/ui-tests/package.json +++ b/scm-ui/ui-tests/package.json @@ -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" }, diff --git a/scm-ui/ui-text/package.json b/scm-ui/ui-text/package.json index 913b75f9ed..2b554d9d7b 100644 --- a/scm-ui/ui-text/package.json +++ b/scm-ui/ui-text/package.json @@ -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": { diff --git a/scm-ui/ui-types/package.json b/scm-ui/ui-types/package.json index 977eca8707..b0985edc78 100644 --- a/scm-ui/ui-types/package.json +++ b/scm-ui/ui-types/package.json @@ -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": { diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 3267ede87c..b511ff2e3a 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -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 streamAll(Predicate 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 getAll() { return getAll(repository -> true, null); @@ -402,9 +413,10 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { @Deprecated @Override public Collection getAllNamespaces() { - return getAll().stream() - .map(Repository::getNamespace) - .collect(LINKED_HASH_SET_COLLECTOR); + Set foundNamespaces = new HashSet<>(); + streamAll(repository -> !foundNamespaces.contains(repository.getNamespace())) + .forEach(repository -> foundNamespaces.add(repository.getNamespace())); + return foundNamespaces; } @Override diff --git a/yarn.lock b/yarn.lock index 39145fd5e6..4436b1729c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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==