cmd/syncthing/cli: indexDumpSize doesn't need a heap (#8024)

This commit is contained in:
greatroar 2021-10-29 20:21:50 +02:00 committed by GitHub
parent 807a6b1022
commit 28ff033da6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -7,53 +7,35 @@
package cli package cli
import ( import (
"container/heap"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"sort"
"github.com/urfave/cli" "github.com/urfave/cli"
"github.com/syncthing/syncthing/lib/db" "github.com/syncthing/syncthing/lib/db"
) )
type SizedElement struct { func indexDumpSize(*cli.Context) error {
type sizedElement struct {
key string key string
size int size int
} }
type ElementHeap []SizedElement
func (h ElementHeap) Len() int { return len(h) }
func (h ElementHeap) Less(i, j int) bool { return h[i].size > h[j].size }
func (h ElementHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *ElementHeap) Push(x interface{}) {
*h = append(*h, x.(SizedElement))
}
func (h *ElementHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func indexDumpSize(*cli.Context) error {
ldb, err := getDB() ldb, err := getDB()
if err != nil { if err != nil {
return err return err
} }
h := &ElementHeap{}
heap.Init(h)
it, err := ldb.NewPrefixIterator(nil) it, err := ldb.NewPrefixIterator(nil)
if err != nil { if err != nil {
return err return err
} }
var ele SizedElement
var elems []sizedElement
for it.Next() { for it.Next() {
var ele sizedElement
key := it.Key() key := it.Key()
switch key[0] { switch key[0] {
case db.KeyTypeDevice: case db.KeyTypeDevice:
@ -94,11 +76,13 @@ func indexDumpSize(*cli.Context) error {
ele.key = fmt.Sprintf("UNKNOWN:%x", key) ele.key = fmt.Sprintf("UNKNOWN:%x", key)
} }
ele.size = len(it.Value()) ele.size = len(it.Value())
heap.Push(h, ele) elems = append(elems, ele)
} }
for h.Len() > 0 { sort.Slice(elems, func(i, j int) bool {
ele = heap.Pop(h).(SizedElement) return elems[i].size > elems[j].size
})
for _, ele := range elems {
fmt.Println(ele.key, ele.size) fmt.Println(ele.key, ele.size)
} }