From 0b24c4cffe79e56c623f65e1d13c4c18e18b628d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 15 Feb 2025 21:45:12 -0300 Subject: [PATCH] mmm: DropLayer() --- mmm/mmmm.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ mmm/save.go | 7 ++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/mmm/mmmm.go b/mmm/mmmm.go index e82fbdd..65f3740 100644 --- a/mmm/mmmm.go +++ b/mmm/mmmm.go @@ -141,6 +141,9 @@ func (b *MultiMmapManager) Init() error { } func (b *MultiMmapManager) EnsureLayer(name string, il *IndexingLayer) error { + b.mutex.Lock() + defer b.mutex.Unlock() + il.mmmm = b il.name = name @@ -183,6 +186,51 @@ func (b *MultiMmapManager) EnsureLayer(name string, il *IndexingLayer) error { return nil } +func (b *MultiMmapManager) DropLayer(name string) error { + b.mutex.Lock() + defer b.mutex.Unlock() + + // get layer reference + idx := slices.IndexFunc(b.layers, func(il *IndexingLayer) bool { return il.name == name }) + if idx == -1 { + return fmt.Errorf("layer '%s' doesn't exist", name) + } + il := b.layers[idx] + + // remove layer references from global indexes + err := b.lmdbEnv.Update(func(txn *lmdb.Txn) error { + txn.RawRead = true + return b.removeAllReferencesFromLayer(txn, il.id) + }) + if err != nil { + return err + } + + // delete everything (the indexes) from this layer db actually + err = il.lmdbEnv.Update(func(txn *lmdb.Txn) error { + for _, dbi := range []lmdb.DBI{ + il.indexCreatedAt, + il.indexKind, + il.indexPubkey, + il.indexPubkeyKind, + il.indexTag, + il.indexTag32, + il.indexTagAddr, + il.indexPTagKind, + } { + if err := txn.Drop(dbi, true); err != nil { + return err + } + } + return nil + }) + if err != nil { + return err + } + + return il.lmdbEnv.Close() +} + // getNextAvailableLayerId iterates through all existing layers to find a vacant id func (b *MultiMmapManager) getNextAvailableLayerId(txn *lmdb.Txn) (uint16, error) { cursor, err := txn.OpenCursor(b.knownLayers) diff --git a/mmm/save.go b/mmm/save.go index 6f7dcf6..cf8767e 100644 --- a/mmm/save.go +++ b/mmm/save.go @@ -107,7 +107,12 @@ func (il *IndexingLayer) SaveEvent(ctx context.Context, evt *nostr.Event) error return nil } -func (b *MultiMmapManager) storeOn(mmmtxn *lmdb.Txn, ils []*IndexingLayer, iltxns []*lmdb.Txn, evt *nostr.Event) (stored bool, err error) { +func (b *MultiMmapManager) storeOn( + mmmtxn *lmdb.Txn, + ils []*IndexingLayer, + iltxns []*lmdb.Txn, + evt *nostr.Event, +) (stored bool, err error) { // sanity checking if evt.CreatedAt > maxuint32 || evt.Kind > maxuint16 { return false, fmt.Errorf("event with values out of expected boundaries")