zaebalsaаа
This commit is contained in:
parent
1f9699ecc4
commit
aa1c40a148
5 changed files with 22 additions and 15 deletions
|
|
@ -100,7 +100,7 @@ func (s *OptimizedAutoBuildSession) initialize() error {
|
|||
fmt.Printf("🚀 Initializing fast dependency resolver...\n")
|
||||
|
||||
// Initialize global resolver (singleton)
|
||||
r, err := resolver.GetGlobalResolver(s.cacheDir, "https://deb.debian.org/debian", "stable", "main")
|
||||
r, err := resolver.GetResolver(s.cacheDir, "https://deb.debian.org/debian", "stable", "main")
|
||||
if err != nil {
|
||||
fmt.Printf("⚠️ Failed to initialize global resolver: %v (will use fallback)\n", err)
|
||||
// Continue with fallback resolver
|
||||
|
|
|
|||
3
pkg/cache/package_index.go
vendored
3
pkg/cache/package_index.go
vendored
|
|
@ -111,6 +111,9 @@ func (idx *PackageIndex) AddPackage(entry *PackageEntry) {
|
|||
defer idx.mu.Unlock()
|
||||
|
||||
idx.packages[entry.Package] = entry
|
||||
// Mark index as updated so IsExpired() works correctly and
|
||||
// we don't re-parse Sources.xz on every program run.
|
||||
idx.lastUpdate = time.Now()
|
||||
|
||||
// Index binaries for fast lookup
|
||||
for _, binary := range entry.Binaries {
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ func (l *PackageLoader) LoadSources(mirror, suite, component string) error {
|
|||
fmt.Printf("✅ Using fresh cache: %d packages, %d binaries\n", pkgCount, binCount)
|
||||
|
||||
// Load into global resolver (singleton)
|
||||
if _, err := resolver.GetGlobalResolver(l.cacheDir, mirror, suite, component); err != nil {
|
||||
if _, err := resolver.GetResolver(l.cacheDir, mirror, suite, component); err != nil {
|
||||
return fmt.Errorf("failed to load global resolver: %w", err)
|
||||
}
|
||||
|
||||
|
|
@ -76,7 +76,7 @@ func (l *PackageLoader) LoadSources(mirror, suite, component string) error {
|
|||
fmt.Printf("✅ Loaded %d packages, %d binaries\n", pkgCount, binCount)
|
||||
|
||||
// Load into global resolver (singleton)
|
||||
if _, err := resolver.GetGlobalResolver(l.cacheDir, mirror, suite, component); err != nil {
|
||||
if _, err := resolver.GetResolver(l.cacheDir, mirror, suite, component); err != nil {
|
||||
return fmt.Errorf("failed to load global resolver: %w", err)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,12 +12,10 @@ var (
|
|||
resolverErr error
|
||||
)
|
||||
|
||||
// GetGlobalResolver returns a singleton FastResolver instance.
|
||||
// Sources.xz will only be parsed once per process.
|
||||
func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
||||
|
||||
// GetResolver returns a process-wide singleton FastResolver instance.
|
||||
// Package index loading (and thus Sources.xz parsing) will happen at most once per process.
|
||||
func GetResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
||||
resolverOnce.Do(func() {
|
||||
|
||||
log.Println("[resolver] Initializing global resolver (loading package index)")
|
||||
|
||||
r := NewFastResolver(cacheDir)
|
||||
|
|
@ -42,3 +40,9 @@ func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver
|
|||
|
||||
return globalResolver, nil
|
||||
}
|
||||
|
||||
// GetGlobalResolver is kept for backward compatibility.
|
||||
// New code should use GetResolver instead.
|
||||
func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
||||
return GetResolver(cacheDir, mirror, suite, component)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,14 +20,14 @@ func main() {
|
|||
// Remove any existing cache
|
||||
os.RemoveAll(cacheDir)
|
||||
|
||||
// Test 1: Multiple GetGlobalResolver calls should only parse once
|
||||
fmt.Printf("\n📦 Test 1: Multiple GetGlobalResolver calls...\n")
|
||||
// Test 1: Multiple GetResolver calls should only parse once
|
||||
fmt.Printf("\n📦 Test 1: Multiple GetResolver calls...\n")
|
||||
|
||||
start := time.Now()
|
||||
|
||||
// First call - should parse Sources.xz
|
||||
// First call - should parse Sources.xz or load JSON cache
|
||||
fmt.Printf("Call 1: ")
|
||||
r1, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
||||
r1, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||
if err != nil {
|
||||
fmt.Printf("❌ Error: %v\n", err)
|
||||
return
|
||||
|
|
@ -38,7 +38,7 @@ func main() {
|
|||
// Second call - should be instant
|
||||
start = time.Now()
|
||||
fmt.Printf("Call 2: ")
|
||||
r2, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
||||
r2, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||
if err != nil {
|
||||
fmt.Printf("❌ Error: %v\n", err)
|
||||
return
|
||||
|
|
@ -49,7 +49,7 @@ func main() {
|
|||
// Third call - should also be instant
|
||||
start = time.Now()
|
||||
fmt.Printf("Call 3: ")
|
||||
r3, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
||||
r3, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||
if err != nil {
|
||||
fmt.Printf("❌ Error: %v\n", err)
|
||||
return
|
||||
|
|
@ -116,6 +116,6 @@ func main() {
|
|||
|
||||
fmt.Printf("\n📋 Expected behavior:\n")
|
||||
fmt.Printf("• LoadIndex() should execute only once inside sync.Once\n")
|
||||
fmt.Printf("• Subsequent GetGlobalResolver() calls should be <1ms\n")
|
||||
fmt.Printf("• Subsequent GetResolver() calls should be <1ms\n")
|
||||
fmt.Printf("• Dependency resolutions should not trigger re-parsing\n")
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue