mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-07-27 13:57:46 +00:00
Compact LevelDB in aptly db cleanup. #19
This commit is contained in:
@@ -143,6 +143,10 @@ func aptlyDbCleanup(cmd *commander.Command, args []string) error {
|
|||||||
|
|
||||||
context.progress.Printf("Disk space freed: %.2f GiB...\n", float64(totalSize)/1024.0/1024.0/1024.0)
|
context.progress.Printf("Disk space freed: %.2f GiB...\n", float64(totalSize)/1024.0/1024.0/1024.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context.progress.Printf("Compacting database...\n")
|
||||||
|
err = context.database.CompactDB()
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/syndtr/goleveldb/leveldb"
|
"github.com/syndtr/goleveldb/leveldb"
|
||||||
"github.com/syndtr/goleveldb/leveldb/filter"
|
"github.com/syndtr/goleveldb/leveldb/filter"
|
||||||
"github.com/syndtr/goleveldb/leveldb/opt"
|
"github.com/syndtr/goleveldb/leveldb/opt"
|
||||||
|
"github.com/syndtr/goleveldb/leveldb/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Errors for Storage
|
// Errors for Storage
|
||||||
@@ -24,6 +25,7 @@ type Storage interface {
|
|||||||
Close() error
|
Close() error
|
||||||
StartBatch()
|
StartBatch()
|
||||||
FinishBatch() error
|
FinishBatch() error
|
||||||
|
CompactDB() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type levelDB struct {
|
type levelDB struct {
|
||||||
@@ -49,6 +51,7 @@ func OpenDB(path string) (Storage, error) {
|
|||||||
return &levelDB{db: db}, nil
|
return &levelDB{db: db}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get key value from database
|
||||||
func (l *levelDB) Get(key []byte) ([]byte, error) {
|
func (l *levelDB) Get(key []byte) ([]byte, error) {
|
||||||
value, err := l.db.Get(key, nil)
|
value, err := l.db.Get(key, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -61,6 +64,7 @@ func (l *levelDB) Get(key []byte) ([]byte, error) {
|
|||||||
return value, nil
|
return value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Put saves key to database, if key has the same value in DB already, it is not saved
|
||||||
func (l *levelDB) Put(key []byte, value []byte) error {
|
func (l *levelDB) Put(key []byte, value []byte) error {
|
||||||
if l.batch != nil {
|
if l.batch != nil {
|
||||||
l.batch.Put(key, value)
|
l.batch.Put(key, value)
|
||||||
@@ -79,6 +83,7 @@ func (l *levelDB) Put(key []byte, value []byte) error {
|
|||||||
return l.db.Put(key, value, nil)
|
return l.db.Put(key, value, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete removes key from DB
|
||||||
func (l *levelDB) Delete(key []byte) error {
|
func (l *levelDB) Delete(key []byte) error {
|
||||||
if l.batch != nil {
|
if l.batch != nil {
|
||||||
l.batch.Delete(key)
|
l.batch.Delete(key)
|
||||||
@@ -87,6 +92,7 @@ func (l *levelDB) Delete(key []byte) error {
|
|||||||
return l.db.Delete(key, nil)
|
return l.db.Delete(key, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KeysByPrefix returns all keys that start with prefix
|
||||||
func (l *levelDB) KeysByPrefix(prefix []byte) [][]byte {
|
func (l *levelDB) KeysByPrefix(prefix []byte) [][]byte {
|
||||||
result := make([][]byte, 0, 20)
|
result := make([][]byte, 0, 20)
|
||||||
|
|
||||||
@@ -103,6 +109,7 @@ func (l *levelDB) KeysByPrefix(prefix []byte) [][]byte {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FetchByPrefix returns all values with keys that start with prefix
|
||||||
func (l *levelDB) FetchByPrefix(prefix []byte) [][]byte {
|
func (l *levelDB) FetchByPrefix(prefix []byte) [][]byte {
|
||||||
result := make([][]byte, 0, 20)
|
result := make([][]byte, 0, 20)
|
||||||
|
|
||||||
@@ -119,10 +126,14 @@ func (l *levelDB) FetchByPrefix(prefix []byte) [][]byte {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close finishes DB work
|
||||||
func (l *levelDB) Close() error {
|
func (l *levelDB) Close() error {
|
||||||
return l.db.Close()
|
return l.db.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StartBatch starts batch processing of keys
|
||||||
|
//
|
||||||
|
// All subsequent Get, Put and Delete would work on batch
|
||||||
func (l *levelDB) StartBatch() {
|
func (l *levelDB) StartBatch() {
|
||||||
if l.batch != nil {
|
if l.batch != nil {
|
||||||
panic("batch already started")
|
panic("batch already started")
|
||||||
@@ -130,6 +141,7 @@ func (l *levelDB) StartBatch() {
|
|||||||
l.batch = new(leveldb.Batch)
|
l.batch = new(leveldb.Batch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FinishBatch finalizes the batch, saving operations
|
||||||
func (l *levelDB) FinishBatch() error {
|
func (l *levelDB) FinishBatch() error {
|
||||||
if l.batch == nil {
|
if l.batch == nil {
|
||||||
panic("no batch")
|
panic("no batch")
|
||||||
@@ -138,3 +150,8 @@ func (l *levelDB) FinishBatch() error {
|
|||||||
l.batch = nil
|
l.batch = nil
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CompactDB compacts database by merging layers
|
||||||
|
func (l *levelDB) CompactDB() error {
|
||||||
|
return l.db.CompactRange(util.Range{})
|
||||||
|
}
|
||||||
|
|||||||
@@ -122,3 +122,11 @@ func (s *LevelDBSuite) TestBatch(c *C) {
|
|||||||
s.db.StartBatch()
|
s.db.StartBatch()
|
||||||
c.Check(func() { s.db.StartBatch() }, Panics, "batch already started")
|
c.Check(func() { s.db.StartBatch() }, Panics, "batch already started")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *LevelDBSuite) TestCompactDB(c *C) {
|
||||||
|
s.db.Put([]byte{0x80, 0x01}, []byte{0x01})
|
||||||
|
s.db.Put([]byte{0x80, 0x03}, []byte{0x03})
|
||||||
|
s.db.Put([]byte{0x80, 0x02}, []byte{0x02})
|
||||||
|
|
||||||
|
c.Check(s.db.CompactDB(), IsNil)
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Deleting unreferenced packages (0)...
|
|||||||
Building list of files referenced by packages...
|
Building list of files referenced by packages...
|
||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (0)...
|
Deleting unreferenced files (0)...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Deleting unreferenced packages (73295)...
|
|||||||
Building list of files referenced by packages...
|
Building list of files referenced by packages...
|
||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (0)...
|
Deleting unreferenced files (0)...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ Building list of files referenced by packages...
|
|||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (9)...
|
Deleting unreferenced files (9)...
|
||||||
Disk space freed: 0.01 GiB...
|
Disk space freed: 0.01 GiB...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Deleting unreferenced packages (0)...
|
|||||||
Building list of files referenced by packages...
|
Building list of files referenced by packages...
|
||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (0)...
|
Deleting unreferenced files (0)...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ Building list of files referenced by packages...
|
|||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (9)...
|
Deleting unreferenced files (9)...
|
||||||
Disk space freed: 0.01 GiB...
|
Disk space freed: 0.01 GiB...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Deleting unreferenced packages (0)...
|
|||||||
Building list of files referenced by packages...
|
Building list of files referenced by packages...
|
||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (0)...
|
Deleting unreferenced files (0)...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Deleting unreferenced packages (0)...
|
|||||||
Building list of files referenced by packages...
|
Building list of files referenced by packages...
|
||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (0)...
|
Deleting unreferenced files (0)...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ Building list of files referenced by packages...
|
|||||||
Building list of files in package pool...
|
Building list of files in package pool...
|
||||||
Deleting unreferenced files (5)...
|
Deleting unreferenced files (5)...
|
||||||
Disk space freed: 0.00 GiB...
|
Disk space freed: 0.00 GiB...
|
||||||
|
Compacting database...
|
||||||
|
|||||||
Reference in New Issue
Block a user