eventstore/cmd: fix mmm deinitialization.

This commit is contained in:
fiatjaf
2026-01-18 17:44:03 -03:00
parent fd2828ce94
commit df64c5b6ec
2 changed files with 49 additions and 27 deletions

View File

@@ -17,7 +17,10 @@ import (
"github.com/urfave/cli/v3" "github.com/urfave/cli/v3"
) )
var db eventstore.Store var (
db eventstore.Store
end func()
)
var app = &cli.Command{ var app = &cli.Command{
Name: "eventstore", Name: "eventstore",
@@ -71,45 +74,58 @@ var app = &cli.Command{
switch typ { switch typ {
case "lmdb": case "lmdb":
db = &lmdb.LMDBBackend{Path: path} db = &lmdb.LMDBBackend{Path: path}
if err := db.Init(); err != nil {
return ctx, err
}
end = db.Close
case "boltdb": case "boltdb":
db = &boltdb.BoltBackend{Path: path} db = &boltdb.BoltBackend{Path: path}
if err := db.Init(); err != nil {
return ctx, err
}
end = db.Close
case "mmm": case "mmm":
var err error 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 return ctx, err
} }
case "file": case "file":
db = &slicestore.SliceStore{} db = &slicestore.SliceStore{}
if err := db.Init(); err != nil {
return ctx, err
}
// run this after we've called db.Init() // fill in the slicestore with the data from the file
defer func() { f, err := os.Open(path)
f, err := os.Open(path) if err != nil {
if err != nil { log.Printf("failed to file at '%s': %s\n", path, err)
log.Printf("failed to file at '%s': %s\n", path, err) os.Exit(3)
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) db.SaveEvent(evt)
scanner.Buffer(make([]byte, 16*1024*1024), 256*1024*1024) i++
i := 0 }
for scanner.Scan() {
var evt nostr.Event end = func() {
if err := json.Unmarshal(scanner.Bytes(), &evt); err != nil { db.Close()
log.Printf("invalid event read at line %d: %s (`%s`)\n", i, err, scanner.Text()) f.Close()
} }
db.SaveEvent(evt)
i++
}
}()
case "": case "":
return ctx, fmt.Errorf("couldn't determine store type, you can use --type to specify it manually") return ctx, fmt.Errorf("couldn't determine store type, you can use --type to specify it manually")
default: default:
return ctx, fmt.Errorf("'%s' store type is not supported by this CLI", typ) 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 return ctx, nil
}, },
Commands: []*cli.Command{ Commands: []*cli.Command{
@@ -124,6 +140,7 @@ var app = &cli.Command{
} }
func main() { func main() {
defer func() { end() }()
if err := app.Run(context.Background(), os.Args); err != nil { if err := app.Run(context.Background(), os.Args); err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)

View File

@@ -11,7 +11,7 @@ import (
"github.com/rs/zerolog" "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) { logger := zerolog.New(zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) {
w.Out = os.Stderr w.Out = os.Stderr
})) }))
@@ -20,8 +20,13 @@ func doMmmInit(path string) (eventstore.Store, error) {
Logger: &logger, Logger: &logger,
} }
if err := mmmm.Init(); err != nil { 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
} }