From df64c5b6ec4945bd8b3006549cd12b775429c220 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 18 Jan 2026 17:44:03 -0300 Subject: [PATCH] eventstore/cmd: fix mmm deinitialization. --- eventstore/cmd/eventstore/main.go | 65 +++++++++++++++++---------- eventstore/cmd/eventstore/main_mmm.go | 11 +++-- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/eventstore/cmd/eventstore/main.go b/eventstore/cmd/eventstore/main.go index e2be35e..18313b5 100644 --- a/eventstore/cmd/eventstore/main.go +++ b/eventstore/cmd/eventstore/main.go @@ -17,7 +17,10 @@ import ( "github.com/urfave/cli/v3" ) -var db eventstore.Store +var ( + db eventstore.Store + end func() +) var app = &cli.Command{ Name: "eventstore", @@ -71,45 +74,58 @@ var app = &cli.Command{ switch typ { case "lmdb": db = &lmdb.LMDBBackend{Path: path} + if err := db.Init(); err != nil { + return ctx, err + } + end = db.Close case "boltdb": db = &boltdb.BoltBackend{Path: path} + if err := db.Init(); err != nil { + return ctx, err + } + end = db.Close case "mmm": var err error - if db, err = doMmmInit(path); err != nil { + if db, err, end = doMmmInit(path); err != nil { + if end != nil { + end() + } return ctx, err } case "file": db = &slicestore.SliceStore{} + if err := db.Init(); err != nil { + return ctx, err + } - // run this after we've called db.Init() - defer func() { - f, err := os.Open(path) - if err != nil { - log.Printf("failed to file at '%s': %s\n", path, err) - os.Exit(3) + // fill in the slicestore with the data from the file + f, err := os.Open(path) + if err != nil { + log.Printf("failed to file at '%s': %s\n", path, err) + os.Exit(3) + } + scanner := bufio.NewScanner(f) + scanner.Buffer(make([]byte, 16*1024*1024), 256*1024*1024) + i := 0 + for scanner.Scan() { + var evt nostr.Event + if err := json.Unmarshal(scanner.Bytes(), &evt); err != nil { + log.Printf("invalid event read at line %d: %s (`%s`)\n", i, err, scanner.Text()) } - scanner := bufio.NewScanner(f) - scanner.Buffer(make([]byte, 16*1024*1024), 256*1024*1024) - i := 0 - for scanner.Scan() { - var evt nostr.Event - if err := json.Unmarshal(scanner.Bytes(), &evt); err != nil { - log.Printf("invalid event read at line %d: %s (`%s`)\n", i, err, scanner.Text()) - } - db.SaveEvent(evt) - i++ - } - }() + db.SaveEvent(evt) + i++ + } + + end = func() { + db.Close() + f.Close() + } case "": return ctx, fmt.Errorf("couldn't determine store type, you can use --type to specify it manually") default: return ctx, fmt.Errorf("'%s' store type is not supported by this CLI", typ) } - if err := db.Init(); err != nil { - return ctx, err - } - return ctx, nil }, Commands: []*cli.Command{ @@ -124,6 +140,7 @@ var app = &cli.Command{ } func main() { + defer func() { end() }() if err := app.Run(context.Background(), os.Args); err != nil { fmt.Println(err) os.Exit(1) diff --git a/eventstore/cmd/eventstore/main_mmm.go b/eventstore/cmd/eventstore/main_mmm.go index 6dbfb1e..09e37f9 100644 --- a/eventstore/cmd/eventstore/main_mmm.go +++ b/eventstore/cmd/eventstore/main_mmm.go @@ -11,7 +11,7 @@ import ( "github.com/rs/zerolog" ) -func doMmmInit(path string) (eventstore.Store, error) { +func doMmmInit(path string) (eventstore.Store, error, func()) { logger := zerolog.New(zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) { w.Out = os.Stderr })) @@ -20,8 +20,13 @@ func doMmmInit(path string) (eventstore.Store, error) { Logger: &logger, } if err := mmmm.Init(); err != nil { - return nil, err + return nil, err, nil } - return mmmm.EnsureLayer(filepath.Base(path)) + end := func() { + mmmm.Close() + } + + store, err := mmmm.EnsureLayer(filepath.Base(path)) + return store, err, end }