summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakka <jakkadoujin@gmail.com>2025-04-13 13:59:04 +0300
committerjakka <jakkadoujin@gmail.com>2025-04-13 13:59:04 +0300
commitb1a2ab25856ec14b042da9fec49c453c6dad95e5 (patch)
tree723023a0be1bfc4bb20b5b9a9becfc6a14f6bf6b
parent04f0578da42d11cc6e5b98450c1018dde8c49737 (diff)
switched to rosedb, it actually works! stopped using goroutines for file indexing since its slower
-rw-r--r--cmd/cmd.go16
-rw-r--r--cmd/init.go63
-rw-r--r--files/database.go141
-rw-r--r--files/operations.go97
-rw-r--r--files/types.go8
-rw-r--r--go.mod24
-rw-r--r--go.sum62
7 files changed, 205 insertions, 206 deletions
diff --git a/cmd/cmd.go b/cmd/cmd.go
index d3fc632..2fb598f 100644
--- a/cmd/cmd.go
+++ b/cmd/cmd.go
@@ -5,7 +5,7 @@ import (
"os"
"os/signal"
- badger "github.com/dgraph-io/badger/v4"
+ "github.com/rosedblabs/rosedb/v2"
"github.com/urfave/cli/v2"
"github.com/justjakka/reencoder/files"
@@ -17,7 +17,9 @@ func runCmd(cCtx *cli.Context) error {
return err
}
- db, err := badger.Open(Options(ctx.Value("dbfile").(string)))
+ options := rosedb.DefaultOptions
+ options.DirPath = ctx.Value("dbfile").(string)
+ db, err := rosedb.Open(options)
if err != nil {
return err
}
@@ -36,18 +38,13 @@ func runCmd(cCtx *cli.Context) error {
return err
}
- /* db.SetDiscardTs(badger.) */
-
if err = files.ReencodeFlacs(ctx); err != nil {
return err
}
- db.RunValueLogGC(0.2)
-
if err := db.Sync(); err != nil {
return err
}
-
return nil
}
@@ -71,6 +68,11 @@ func Start() {
Usage: "Path to database",
Aliases: []string{"d"},
},
+ &cli.StringSliceFlag{
+ Name: "flac",
+ Usage: "Flac arguments to use when reencoding, can be used multiple times",
+ Aliases: []string{"a"},
+ },
},
Action: runCmd,
}
diff --git a/cmd/init.go b/cmd/init.go
index 63a87e6..2852565 100644
--- a/cmd/init.go
+++ b/cmd/init.go
@@ -8,10 +8,7 @@ import (
"path/filepath"
"runtime"
"strings"
- "time"
- badger "github.com/dgraph-io/badger/v4"
- "github.com/dgraph-io/badger/v4/options"
"github.com/urfave/cli/v2"
)
@@ -76,62 +73,12 @@ func initArgs(cCtx *cli.Context) (context.Context, error) {
return nil, err
}
- return context.WithValue(ctx, "encoder", strings.ReplaceAll(strings.Split(string(encoder), " ")[1], "\n", "")), nil
-}
-
-func Options(path string) badger.Options {
- return badger.Options{
- Dir: path,
- ValueDir: path,
-
- MemTableSize: 64 << 20,
- BaseTableSize: 2 << 20,
- BaseLevelSize: 10 << 20,
- TableSizeMultiplier: 2,
- LevelSizeMultiplier: 10,
- MaxLevels: 7,
- NumGoroutines: 8,
- MetricsEnabled: false,
-
- NumCompactors: 4, // Run at least 2 compactors. Zero-th compactor prioritizes L0.
- NumLevelZeroTables: 5,
- NumLevelZeroTablesStall: 15,
- NumMemtables: 5,
- BloomFalsePositive: 0.01,
- BlockSize: 4 * 1024,
- SyncWrites: false,
- NumVersionsToKeep: 1,
- CompactL0OnClose: true,
- VerifyValueChecksum: false,
- Compression: options.Snappy,
- BlockCacheSize: 256 << 20,
- IndexCacheSize: 0,
-
- // The following benchmarks were done on a 4 KB block size (default block size). The
- // compression is ratio supposed to increase with increasing compression level but since the
- // input for compression algorithm is small (4 KB), we don't get significant benefit at
- // level 3.
- // NOTE: The benchmarks are with DataDog ZSTD that requires CGO. Hence, no longer valid.
- // no_compression-16 10 502848865 ns/op 165.46 MB/s -
- // zstd_compression/level_1-16 7 739037966 ns/op 112.58 MB/s 2.93
- // zstd_compression/level_3-16 7 756950250 ns/op 109.91 MB/s 2.72
- // zstd_compression/level_15-16 1 11135686219 ns/op 7.47 MB/s 4.38
- // Benchmark code can be found in table/builder_test.go file
- ZSTDCompressionLevel: 1,
-
- // (2^30 - 1)*2 when mmapping < 2^31 - 1, max int32.
- // -1 so 2*ValueLogFileSize won't overflow on 32-bit systems.
- ValueLogFileSize: 1<<30 - 1,
-
- ValueLogMaxEntries: 1000000,
+ ctx = context.WithValue(ctx, "encoder", strings.ReplaceAll(strings.Split(string(encoder), " ")[1], "\n", ""))
- VLogPercentile: 0.0,
- ValueThreshold: (1 << 20),
+ defargs := []string{"-8f", "-j4"}
- Logger: nil,
- EncryptionKey: []byte{},
- EncryptionKeyRotationDuration: 10 * 24 * time.Hour, // Default 10 days.
- DetectConflicts: true,
- NamespaceOffset: -1,
+ if cCtx.Value("flac") == nil {
+ return context.WithValue(ctx, "flac", defargs), nil
}
+ return context.WithValue(ctx, "flac", cCtx.StringSlice("flac")), nil
}
diff --git a/files/database.go b/files/database.go
index 5cb8e98..33c2636 100644
--- a/files/database.go
+++ b/files/database.go
@@ -3,46 +3,48 @@ package files
import (
"context"
"encoding/json"
+ "errors"
+ "log"
+ "os"
+ "strings"
- badger "github.com/dgraph-io/badger/v4"
+ "github.com/rosedblabs/rosedb/v2"
progressbar "github.com/schollz/progressbar/v3"
"golang.org/x/sync/errgroup"
)
-func decodeDbInfo(item *badger.Item) (*FileInfo, error) {
+func decodeDbInfo(value []byte) (*FileInfo, error) {
var info FileInfo
- if err := item.Value(func(val []byte) error {
- if err := json.Unmarshal(val, &info); err != nil {
- return err
- }
- return nil
- }); err != nil {
+ if err := json.Unmarshal(value, &info); err != nil {
return nil, err
}
return &info, nil
}
-func getInfoFromDb(database *badger.DB, hashsum []byte) (*FileInfo, error) {
- var info *FileInfo
- if err := database.View(func(txn *badger.Txn) error {
- item, err := txn.Get(hashsum)
- if err != nil {
- return err
- }
+func getInfoFromDb(batch *rosedb.Batch, hashsum []byte) (*FileInfo, error) {
+ exist, err := batch.Exist(hashsum)
+ if err != nil {
+ return nil, err
+ }
- info, err = decodeDbInfo(item)
- if err != nil {
- return err
- }
- return nil
- }); err != nil {
+ if !exist {
+ return nil, rosedb.ErrKeyNotFound
+ }
+
+ value, err := batch.Get(hashsum)
+ if err != nil {
+ return nil, err
+ }
+
+ info, err := decodeDbInfo(value)
+ if err != nil {
return nil, err
}
- return info, nil
+ return info, err
}
-func (filedata *FileInfo) evaluateFile(database *badger.DB, hashsum []byte, encoder string) error {
- info, err := getInfoFromDb(database, hashsum)
+func (filedata *FileInfo) evaluateFile(batch *rosedb.Batch, hashsum []byte, encoder string) error {
+ info, err := getInfoFromDb(batch, hashsum)
if err != nil {
return err
}
@@ -59,71 +61,79 @@ func (filedata *FileInfo) evaluateFile(database *badger.DB, hashsum []byte, enco
return ReencodeNotNeeded
}
-func (filedata *FileInfo) updateFile(wb *badger.WriteBatch, hashsum []byte) error {
+func (filedata *FileInfo) updateFile(batch *rosedb.Batch, hashsum []byte) error {
encoded, err := json.Marshal(filedata)
if err != nil {
return err
}
- return wb.Set(hashsum, encoded)
+ return batch.Put(hashsum, encoded)
}
-func (filedata *FileInfo) IndexFile(ctx context.Context, hashsum []byte) error {
- database := ctx.Value("database").(*badger.DB)
+func (filedata *FileInfo) IndexFile(ctx context.Context, hashsum []byte, batch *rosedb.Batch) error {
encoder := ctx.Value("encoder").(string)
counter := ctx.Value("counter").(*int64)
- err := filedata.evaluateFile(database, hashsum, encoder)
+ err := filedata.evaluateFile(batch, hashsum, encoder)
+
switch err {
case FileMoved, ReencodeNotNeeded:
filedata.Process = false
- case ReencodeNeeded, badger.ErrKeyNotFound:
+ case ReencodeNeeded, rosedb.ErrKeyNotFound:
*counter += 1
default:
return err
}
- wb := database.NewWriteBatch()
- defer wb.Cancel()
- if err := filedata.updateFile(wb, hashsum); err != nil {
- return err
- }
- if err := wb.Flush(); err != nil {
+ if err := filedata.updateFile(batch, hashsum); err != nil {
return err
}
+
return nil
}
func ReencodeFlacs(ctx context.Context) error {
- db := ctx.Value("database").(*badger.DB)
+ db := ctx.Value("database").(*rosedb.DB)
bar := progressbar.NewOptions64(
*ctx.Value("counter").(*int64),
progressbar.OptionSetDescription("Reencoding..."),
progressbar.OptionShowCount(),
)
- defer bar.Close()
- wb := db.NewWriteBatch()
- defer wb.Cancel()
+ batch := db.NewBatch(rosedb.DefaultBatchOptions)
wg := new(errgroup.Group)
wg.SetLimit(4)
- err := db.View(func(txn *badger.Txn) error {
- opts := badger.DefaultIteratorOptions
- opts.PrefetchSize = 10
- it := txn.NewIterator(opts)
- defer it.Close()
- for it.Rewind(); it.Valid(); it.Next() {
- select {
- case <-ctx.Done():
- return nil
- default:
- item := it.Item()
- key := item.Key()
- info, err := decodeDbInfo(item)
- if err != nil {
- return err
+ iterOpts := rosedb.DefaultIteratorOptions
+ iterOpts.ContinueOnError = true
+ iter := db.NewIterator(iterOpts)
+
+ for iter.Rewind(); iter.Valid(); iter.Next() {
+ select {
+ case <-ctx.Done():
+ wg.Wait()
+ if err := batch.Commit(); err != nil {
+ return err
+ }
+ bar.Exit()
+ return nil
+ default:
+ item := iter.Item()
+ key := item.Key
+ info, err := decodeDbInfo(item.Value)
+ if err != nil {
+ log.Println(err.Error())
+ }
+
+ if !strings.Contains(info.AbsPath, ctx.Value("path").(string)) {
+ continue
+ } else if _, err := os.Stat(info.AbsPath); errors.Is(err, os.ErrNotExist) {
+ if err := batch.Delete(key); err != nil {
+ log.Println(err.Error())
}
+ } else if err != nil {
+ log.Println(err.Error())
+ } else {
if info.Process {
wg.Go(func() error {
select {
@@ -133,19 +143,30 @@ func ReencodeFlacs(ctx context.Context) error {
if err := info.reencodeFile(ctx); err != nil {
return err
}
- if err := info.updateFile(wb, key); err != nil {
+ if err := batch.Delete(key); err != nil {
+ return err
+ }
+ key, err = getSha256(info.AbsPath)
+ if err != nil {
+ return err
+ }
+ if err := info.updateFile(batch, key); err != nil {
return err
}
+
bar.Add64(1)
return nil
}
})
}
-
}
}
- return nil
- })
+ }
+
wg.Wait()
- return err
+ if err := batch.Commit(); err != nil {
+ return err
+ }
+ bar.Close()
+ return nil
}
diff --git a/files/operations.go b/files/operations.go
index 885e31f..6f44900 100644
--- a/files/operations.go
+++ b/files/operations.go
@@ -6,6 +6,7 @@ import (
"fmt"
"io"
"io/fs"
+ "log"
"os"
"os/exec"
"path/filepath"
@@ -14,18 +15,38 @@ import (
"time"
"github.com/briandowns/spinner"
- "golang.org/x/sync/errgroup"
+ "github.com/rosedblabs/rosedb/v2"
)
func (file *FileInfo) reencodeFile(ctx context.Context) error {
- out, err := exec.Command("flac", "-8fs", "-j4", file.AbsPath).Output()
- if err != nil {
- fmt.Printf("%v\n", out)
- return err
+ select {
+ case <-ctx.Done():
+ return nil
+ default:
+ args := ctx.Value("flac").([]string)
+ if args != nil {
+ args = append(args, file.AbsPath)
+ cmd := exec.Command("flac", args...)
+ if err := cmd.Run(); err != nil {
+ if !strings.Contains(err.Error(), "interrupt") {
+ log.Println(err.Error())
+ return err
+ }
+ }
+ } else {
+ cmd := exec.Command("flac", "-8f", "-j4", file.AbsPath)
+ if err := cmd.Run(); err != nil {
+ if !strings.Contains(err.Error(), "interrupt") {
+ log.Println(err.Error())
+ return err
+ }
+ }
+ }
+
+ file.Encoder = ctx.Value("encoder").(string)
+ file.Process = false
+ return nil
}
- file.Encoder = ctx.Value("encoder").(string)
- file.Process = false
- return nil
}
func getEncoderVer(path string) (string, error) {
@@ -44,18 +65,11 @@ func getEncoderVer(path string) (string, error) {
}
}
-func getInfoFromFile(path string, info fs.DirEntry) (*FileInfo, error) {
+func getInfoFromFile(path string) (*FileInfo, error) {
var filedata FileInfo
filedata.Process = true
- tmp, err := info.Info()
- if err != nil {
- return nil, err
- }
-
- filedata.Modtime = tmp.ModTime()
-
abspath, err := filepath.Abs(path)
if err != nil {
return nil, err
@@ -87,14 +101,25 @@ func getSha256(path string) ([]byte, error) {
return hash.Sum(nil), nil
}
+func updateSpinner(spin *spinner.Spinner, counter int64) {
+ line := fmt.Sprintf(" Indexing flacs...\t %v", counter)
+ spin.Suffix = line
+}
+
func IndexFlacs(ctx context.Context) error {
+ counter := ctx.Value("counter").(*int64)
+ database := ctx.Value("database").(*rosedb.DB)
+
+ batch := database.NewBatch(rosedb.DefaultBatchOptions)
+
spin := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
- spin.Suffix = " Indexing flacs..."
+
+ updateSpinner(spin, *counter)
spin.Start()
- wg := new(errgroup.Group)
- wg.SetLimit(100)
+ /* wg := new(errgroup.Group)
+ wg.SetLimit(100) */
if err := filepath.WalkDir(ctx.Value("path").(string), func(path string, info fs.DirEntry, err error) error {
select {
@@ -103,17 +128,14 @@ func IndexFlacs(ctx context.Context) error {
spin.Stop()
return filepath.SkipAll
default:
- if err != nil {
- return err
- }
if !info.IsDir() {
if filepath.Ext(path) == ".flac" {
- wg.Go(func() error {
+ /* wg.Go(func() error {
select {
case <-ctx.Done():
return nil
default:
- data, err := getInfoFromFile(path, info)
+ data, err := getInfoFromFile(path)
if err != nil {
return err
}
@@ -122,10 +144,22 @@ func IndexFlacs(ctx context.Context) error {
if err != nil {
return err
}
-
- return data.IndexFile(ctx, hashsum)
+ updateSpinner(spin, *counter)
+ return data.IndexFile(ctx, hashsum, batch)
}
- })
+ }) */
+
+ data, err := getInfoFromFile(path)
+ if err != nil {
+ return err
+ }
+
+ hashsum, err := getSha256(path)
+ if err != nil {
+ return err
+ }
+ updateSpinner(spin, *counter)
+ return data.IndexFile(ctx, hashsum, batch)
}
}
@@ -136,8 +170,13 @@ func IndexFlacs(ctx context.Context) error {
return err
}
- wg.Wait()
- spin.FinalMSG = "Done indexing flacs\n"
+ /* wg.Wait() */
+
+ if err := batch.Commit(); err != nil {
+ return err
+ }
+ spin.FinalMSG = fmt.Sprintf("Done indexing flacs: \t%v to process\n", *counter)
spin.Stop()
+
return nil
}
diff --git a/files/types.go b/files/types.go
index 87ae6e1..7bb2f42 100644
--- a/files/types.go
+++ b/files/types.go
@@ -2,7 +2,6 @@ package files
import (
"errors"
- "time"
)
var (
@@ -12,8 +11,7 @@ var (
)
type FileInfo struct {
- AbsPath string `json:"abspath"`
- Modtime time.Time `json:"modtime"`
- Encoder string `json:"encoder"`
- Process bool `json:"process"`
+ AbsPath string `json:"abspath"`
+ Encoder string `json:"encoder"`
+ Process bool `json:"process"`
}
diff --git a/go.mod b/go.mod
index 59f489a..dcb3034 100644
--- a/go.mod
+++ b/go.mod
@@ -5,32 +5,28 @@ go 1.24.2
require github.com/urfave/cli/v2 v2.27.6
require (
- github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect
- github.com/dustin/go-humanize v1.0.1 // indirect
+ github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/fatih/color v1.7.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
- github.com/go-logr/stdr v1.2.2 // indirect
- github.com/google/flatbuffers v25.2.10+incompatible // indirect
- github.com/klauspost/compress v1.18.0 // indirect
+ github.com/gofrs/flock v0.8.1 // indirect
+ github.com/google/btree v1.1.2 // indirect
+ github.com/kr/pretty v0.3.1 // indirect
github.com/mattn/go-colorable v0.1.2 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/rivo/uniseg v0.4.7 // indirect
- go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.35.0 // indirect
- go.opentelemetry.io/otel/metric v1.35.0 // indirect
- go.opentelemetry.io/otel/trace v1.35.0 // indirect
- golang.org/x/net v0.38.0 // indirect
+ github.com/robfig/cron/v3 v3.0.0 // indirect
+ github.com/rogpeppe/go-internal v1.13.1 // indirect
+ github.com/rosedblabs/wal v1.3.8 // indirect
+ github.com/stretchr/testify v1.10.0 // indirect
+ github.com/valyala/bytebufferpool v1.0.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/term v0.30.0 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
)
require (
github.com/briandowns/spinner v1.23.2
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
- github.com/dgraph-io/badger/v4 v4.7.0
+ github.com/rosedblabs/rosedb/v2 v2.4.0
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/schollz/progressbar/v3 v3.18.0
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
diff --git a/go.sum b/go.sum
index 03ee3b0..cdf3767 100644
--- a/go.sum
+++ b/go.sum
@@ -1,43 +1,47 @@
github.com/briandowns/spinner v1.23.2 h1:Zc6ecUnI+YzLmJniCfDNaMbW0Wid1d5+qcTq4L2FW8w=
github.com/briandowns/spinner v1.23.2/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM=
-github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
-github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
+github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
+github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM=
+github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgraph-io/badger/v4 v4.7.0 h1:Q+J8HApYAY7UMpL8d9owqiB+odzEc0zn/aqOD9jhc6Y=
-github.com/dgraph-io/badger/v4 v4.7.0/go.mod h1:He7TzG3YBy3j4f5baj5B7Zl2XyfNe5bl4Udl0aPemVA=
-github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM=
-github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI=
-github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38=
-github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
-github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
-github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
-github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
-github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
-github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
+github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
+github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
+github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
+github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/rosedblabs/rosedb/v2 v2.4.0 h1:gwI3zHm5tJlvCb6DMtHEhHsq/BiWS2vNS7Lg409ii6k=
+github.com/rosedblabs/rosedb/v2 v2.4.0/go.mod h1:yehP2SiNojwdleiYhvjQU9jWPuXhO7hbWBzohueVPVY=
+github.com/rosedblabs/wal v1.3.8 h1:tErpD9JT/ICiyV3mv5l7qUH6lybn5XF1TbI0e8kvH8M=
+github.com/rosedblabs/wal v1.3.8/go.mod h1:DFvhrmTTeiXvn2btXXT2MW9Nvu99PU0g/pKGgh0+T+o=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQmCN62HpA=
@@ -46,18 +50,10 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
+github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
+github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
-go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
-go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
-go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
-go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
-golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -66,7 +62,7 @@ golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=