Skip to content

Commit

Permalink
lmdb: use md5 hash of arbitrary tag value + reindex everything again.
Browse files Browse the repository at this point in the history
  • Loading branch information
fiatjaf committed Dec 11, 2024
1 parent 4af4731 commit 2496916
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 19 deletions.
18 changes: 9 additions & 9 deletions lmdb/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,16 @@ package lmdb
import (
"context"
"encoding/hex"
"fmt"

"github.com/PowerDNS/lmdb-go/lmdb"
"github.com/nbd-wtf/go-nostr"
)

func (b *LMDBBackend) DeleteEvent(ctx context.Context, evt *nostr.Event) error {
err := b.lmdbEnv.Update(func(txn *lmdb.Txn) error {
return b.lmdbEnv.Update(func(txn *lmdb.Txn) error {
return b.delete(txn, evt)
})
if err != nil {
return err
}

return nil
}

func (b *LMDBBackend) delete(txn *lmdb.Txn, evt *nostr.Event) error {
Expand All @@ -27,17 +23,21 @@ func (b *LMDBBackend) delete(txn *lmdb.Txn, evt *nostr.Event) error {
return nil
}
if err != nil {
return err
return fmt.Errorf("failed to get current idx for deleting %x: %w", evt.ID[0:8*2], err)
}

// calculate all index keys we have for this event and delete them
for k := range b.getIndexKeysForEvent(evt) {
err := txn.Del(k.dbi, k.key, idx)
if err != nil {
return err
return fmt.Errorf("failed to delete index entry %s for %x: %w", b.keyName(k), evt.ID[0:8*2], err)
}
}

// delete the raw event
return txn.Del(b.rawEventStore, idx, nil)
if err := txn.Del(b.rawEventStore, idx, nil); err != nil {
return fmt.Errorf("failed to delete raw event %x (idx %x): %w", evt.ID[0:8*2], idx, err)
}

return nil
}
13 changes: 8 additions & 5 deletions lmdb/helpers.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lmdb

import (
"crypto/md5"
"encoding/binary"
"encoding/hex"
"fmt"
Expand Down Expand Up @@ -169,13 +170,15 @@ func (b *LMDBBackend) getTagIndexPrefix(tagValue string) (lmdb.DBI, []byte, int)
}
}

// index whatever else as utf-8, but limit it to 40 bytes
k = make([]byte, 40+4)
n := copy(k[0:40], tagValue)
offset = n
// index whatever else as a md5 hash of the contents
h := md5.New()
h.Write([]byte(tagValue))
k = make([]byte, 0, 16+4)
k = h.Sum(k)
offset = 16
dbi = b.indexTag

return dbi, k[0 : n+4], offset
return dbi, k[0 : 16+4], offset
}

func (b *LMDBBackend) dbiName(dbi lmdb.DBI) string {
Expand Down
10 changes: 5 additions & 5 deletions lmdb/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ func (b *LMDBBackend) runMigrations() error {
//

// this is when we reindex everything
if version < 7 {
log.Println("[lmdb] migration 7: reindex everything")
if version < 8 {
log.Println("[lmdb] migration 8: reindex everything")

if err := txn.Drop(b.indexId, false); err != nil {
return err
Expand Down Expand Up @@ -87,7 +87,7 @@ func (b *LMDBBackend) runMigrations() error {

cursor, err := txn.OpenCursor(b.rawEventStore)
if err != nil {
return fmt.Errorf("failed to open cursor in migration 7: %w", err)
return fmt.Errorf("failed to open cursor in migration 8: %w", err)
}
defer cursor.Close()

Expand Down Expand Up @@ -116,7 +116,7 @@ func (b *LMDBBackend) runMigrations() error {

for key := range b.getIndexKeysForEvent(evt) {
if err := txn.Put(key.dbi, key.key, idx, 0); err != nil {
return fmt.Errorf("failed to save index %s for event %s (%v) on migration 7: %w",
return fmt.Errorf("failed to save index %s for event %s (%v) on migration 8: %w",
b.keyName(key), evt.ID, idx, err)
}
}
Expand All @@ -130,7 +130,7 @@ func (b *LMDBBackend) runMigrations() error {
}

// bump version
if err := b.setVersion(txn, 7); err != nil {
if err := b.setVersion(txn, 8); err != nil {
return err
}
}
Expand Down

0 comments on commit 2496916

Please sign in to comment.