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")
|
fmt.Printf("🚀 Initializing fast dependency resolver...\n")
|
||||||
|
|
||||||
// Initialize global resolver (singleton)
|
// 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 {
|
if err != nil {
|
||||||
fmt.Printf("⚠️ Failed to initialize global resolver: %v (will use fallback)\n", err)
|
fmt.Printf("⚠️ Failed to initialize global resolver: %v (will use fallback)\n", err)
|
||||||
// Continue with fallback resolver
|
// 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()
|
defer idx.mu.Unlock()
|
||||||
|
|
||||||
idx.packages[entry.Package] = entry
|
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
|
// Index binaries for fast lookup
|
||||||
for _, binary := range entry.Binaries {
|
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)
|
fmt.Printf("✅ Using fresh cache: %d packages, %d binaries\n", pkgCount, binCount)
|
||||||
|
|
||||||
// Load into global resolver (singleton)
|
// 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)
|
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)
|
fmt.Printf("✅ Loaded %d packages, %d binaries\n", pkgCount, binCount)
|
||||||
|
|
||||||
// Load into global resolver (singleton)
|
// 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)
|
return fmt.Errorf("failed to load global resolver: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,10 @@ var (
|
||||||
resolverErr error
|
resolverErr error
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetGlobalResolver returns a singleton FastResolver instance.
|
// GetResolver returns a process-wide singleton FastResolver instance.
|
||||||
// Sources.xz will only be parsed once per process.
|
// Package index loading (and thus Sources.xz parsing) will happen at most once per process.
|
||||||
func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
func GetResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
||||||
|
|
||||||
resolverOnce.Do(func() {
|
resolverOnce.Do(func() {
|
||||||
|
|
||||||
log.Println("[resolver] Initializing global resolver (loading package index)")
|
log.Println("[resolver] Initializing global resolver (loading package index)")
|
||||||
|
|
||||||
r := NewFastResolver(cacheDir)
|
r := NewFastResolver(cacheDir)
|
||||||
|
|
@ -42,3 +40,9 @@ func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver
|
||||||
|
|
||||||
return globalResolver, nil
|
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
|
// Remove any existing cache
|
||||||
os.RemoveAll(cacheDir)
|
os.RemoveAll(cacheDir)
|
||||||
|
|
||||||
// Test 1: Multiple GetGlobalResolver calls should only parse once
|
// Test 1: Multiple GetResolver calls should only parse once
|
||||||
fmt.Printf("\n📦 Test 1: Multiple GetGlobalResolver calls...\n")
|
fmt.Printf("\n📦 Test 1: Multiple GetResolver calls...\n")
|
||||||
|
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
// First call - should parse Sources.xz
|
// First call - should parse Sources.xz or load JSON cache
|
||||||
fmt.Printf("Call 1: ")
|
fmt.Printf("Call 1: ")
|
||||||
r1, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
r1, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("❌ Error: %v\n", err)
|
fmt.Printf("❌ Error: %v\n", err)
|
||||||
return
|
return
|
||||||
|
|
@ -38,7 +38,7 @@ func main() {
|
||||||
// Second call - should be instant
|
// Second call - should be instant
|
||||||
start = time.Now()
|
start = time.Now()
|
||||||
fmt.Printf("Call 2: ")
|
fmt.Printf("Call 2: ")
|
||||||
r2, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
r2, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("❌ Error: %v\n", err)
|
fmt.Printf("❌ Error: %v\n", err)
|
||||||
return
|
return
|
||||||
|
|
@ -49,7 +49,7 @@ func main() {
|
||||||
// Third call - should also be instant
|
// Third call - should also be instant
|
||||||
start = time.Now()
|
start = time.Now()
|
||||||
fmt.Printf("Call 3: ")
|
fmt.Printf("Call 3: ")
|
||||||
r3, err := resolver.GetGlobalResolver(cacheDir, mirror, suite, component)
|
r3, err := resolver.GetResolver(cacheDir, mirror, suite, component)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("❌ Error: %v\n", err)
|
fmt.Printf("❌ Error: %v\n", err)
|
||||||
return
|
return
|
||||||
|
|
@ -116,6 +116,6 @@ func main() {
|
||||||
|
|
||||||
fmt.Printf("\n📋 Expected behavior:\n")
|
fmt.Printf("\n📋 Expected behavior:\n")
|
||||||
fmt.Printf("• LoadIndex() should execute only once inside sync.Once\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")
|
fmt.Printf("• Dependency resolutions should not trigger re-parsing\n")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue