Merge pull request #1445 from silkeh/fix-db-references

Remove corrupt package references in `db recover`
This commit is contained in:
André Roth
2025-05-01 10:27:42 +02:00
committed by GitHub
10 changed files with 215 additions and 1 deletions

42
system/files/corruptdb.go Normal file
View File

@@ -0,0 +1,42 @@
// This utility corrupts a database by deleting matching package entries.
// Do not use it outside system tests.
package main
import (
"flag"
"log"
"github.com/aptly-dev/aptly/database/goleveldb"
)
func main() {
var dbPath, prefix string
flag.StringVar(&dbPath, "db", "", "Path to DB to corrupt")
flag.StringVar(&prefix, "prefix", "P", "Path to DB to corrupt")
flag.Parse()
db, err := goleveldb.NewOpenDB(dbPath)
if err != nil {
log.Fatalf("Error opening DB %q: %s", dbPath, err)
}
defer db.Close()
keys := db.KeysByPrefix([]byte(prefix))
if len(keys) == 0 {
keys2 := db.KeysByPrefix([]byte{})
for _, key := range keys2 {
log.Printf("Have: %q", key)
}
log.Fatal("No keys to delete")
}
for _, key := range keys {
log.Printf("Deleting %q", key)
if err = db.Delete(key); err != nil {
log.Fatalf("Error deleting key: %s", err)
}
}
}

View File

@@ -1 +1,2 @@
Recovering database...
Checking database integrity...

View File

@@ -1 +1,2 @@
Recovering database...
Checking database integrity...

View File

@@ -0,0 +1,8 @@
Loading mirrors, local repos, snapshots and published repos...
Loading list of all packages...
Deleting unreferenced packages (0)...
Building list of files referenced by packages...
Building list of files in package pool...
Deleting unreferenced files (1)...
Disk space freed: 12.18 KiB...
Compacting database...

View File

@@ -0,0 +1,3 @@
Recovering database...
Checking database integrity...
Removing dangling database reference "Pamd64 hardlink 0.2.1 daf8fcecbf8210ad"

View File

@@ -1,3 +1,5 @@
import os
from lib import BaseTest
@@ -23,3 +25,27 @@ class RecoverDB2Test(BaseTest):
def check(self):
self.check_output()
self.check_cmd_output("aptly mirror list", "mirror_list")
class RecoverDB3Test(BaseTest):
"""
recover db: dangling reference
"""
fixtureDB = True
fixtureCmds = [
"aptly repo create db3test",
"aptly repo add db3test changes/hardlink_0.2.1_amd64.deb",
]
runCmd = "aptly db recover"
def prepare(self):
super(RecoverDB3Test, self).prepare()
self.run_cmd(["go", "run", "files/corruptdb.go",
"-db", os.path.join(os.environ["HOME"], self.aptlyDir, "db"),
"-prefix", "Pamd64 hardlink 0.2.1"])
def check(self):
self.check_output()
self.check_cmd_output("aptly db cleanup", "cleanup")