langchain-0001: MultiVectorRetriever._get_relevant_documents() dedup IDs from vectorstore sub_docs uses list.contains() inside loop, O(k^2). k is unbounded in production RAG pipelines (configurable via search_kwargs). Fix: track seen IDs in a set, keep list for order. 499.5x at k=1000. forgejo-0002: LoadRepoConfig() license sort O(P*L) where L=776 licenses. Two SliceContainsString calls in back-to-back loops iterate full license list for each preferred license and vice versa. Fix: build lookup sets before loops. 19.5x at P=20 preferred licenses. forgejo-0003: synchronizePublicKeys() three O(N*M) scans per LDAP sync. Dedup of providedKeys is O(K^2), plus two O(P*G) set-difference loops. Runs per user per sync cycle. Fix: use maps for O(1) membership. 178.6x at K=G=500. forgejo-0001 (search.go RepoIDs) already patched in prior scan. MOADs 0002-0005 CLEAN for both targets.
27 lines
1.1 KiB
Diff
27 lines
1.1 KiB
Diff
--- a/modules/repository/init.go
|
|
+++ b/modules/repository/init.go
|
|
@@ -104,13 +104,16 @@ func LoadRepoConfig() error {
|
|
|
|
// Filter out invalid names and promote preferred licenses.
|
|
+ // Build a set for O(1) lookups to avoid O(P*L) and O(L*P) scans.
|
|
+ licensesSet := make(map[string]struct{}, len(Licenses))
|
|
+ for _, name := range Licenses {
|
|
+ licensesSet[strings.ToLower(name)] = struct{}{}
|
|
+ }
|
|
+ preferredSet := make(map[string]struct{}, len(setting.Repository.PreferredLicenses))
|
|
+ for _, name := range setting.Repository.PreferredLicenses {
|
|
+ preferredSet[strings.ToLower(name)] = struct{}{}
|
|
+ }
|
|
sortedLicenses := make([]string, 0, len(Licenses))
|
|
for _, name := range setting.Repository.PreferredLicenses {
|
|
- if util.SliceContainsString(Licenses, name, true) {
|
|
+ if _, ok := licensesSet[strings.ToLower(name)]; ok {
|
|
sortedLicenses = append(sortedLicenses, name)
|
|
}
|
|
}
|
|
for _, name := range Licenses {
|
|
- if !util.SliceContainsString(setting.Repository.PreferredLicenses, name, true) {
|
|
+ if _, ok := preferredSet[strings.ToLower(name)]; !ok {
|
|
sortedLicenses = append(sortedLicenses, name)
|
|
}
|
|
}
|