mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-12-15 12:59:46 +01:00
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:
committed by
Thomas Zerr
parent
2e5831a1a3
commit
31fa1ba0a4
2
gradle/changelog/repo_permissions.yaml
Normal file
2
gradle/changelog/repo_permissions.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
- type: fixed
|
||||
description: Significantly improved repository load times for large numbers of repositories
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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==
|
||||
|
||||
Reference in New Issue
Block a user