mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-12 03:21:33 +00:00
When aptly crashes it is possible to get a corrupt database with a dangling key reference.
This results in an error with 'key not found', eg:
ERROR: unable to load package Pall example-package 1.2.3 778cf6f877bf6e2d: key not found
This change makes `db recover` fix this situation by removing the dangling references.
47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
package deb_test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/aptly-dev/aptly/database/goleveldb"
|
|
"github.com/aptly-dev/aptly/deb"
|
|
)
|
|
|
|
func TestFindDanglingReferences(t *testing.T) {
|
|
reflist := deb.NewPackageRefList()
|
|
reflist.Refs = [][]byte{[]byte("P existing 1.2.3"), []byte("P dangling 1.2.3")}
|
|
|
|
db, _ := goleveldb.NewOpenDB(t.TempDir())
|
|
packages := deb.NewPackageCollection(db)
|
|
|
|
if err := packages.Update(&deb.Package{Name: "existing", Version: "1.2.3"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
dangling, err := deb.FindDanglingReferences(reflist, packages)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
exp := &deb.PackageRefList{
|
|
Refs: [][]byte{[]byte("P dangling 1.2.3")},
|
|
}
|
|
|
|
compareRefs(t, exp, dangling)
|
|
}
|
|
|
|
func compareRefs(t *testing.T, exp, got *deb.PackageRefList) {
|
|
t.Helper()
|
|
|
|
if len(exp.Refs) != len(got.Refs) {
|
|
t.Fatalf("refs length mismatch: exp %d, got %d", len(exp.Refs), len(got.Refs))
|
|
}
|
|
|
|
for i := range exp.Refs {
|
|
if !bytes.Equal(exp.Refs[i], got.Refs[i]) {
|
|
t.Fatalf("refs do not match: exp %q, got %q", exp.Refs[i], got.Refs[i])
|
|
}
|
|
}
|
|
}
|