featurebase/holder_internal_test.go
Souhaila Noor 8a95ac344b We check for incomplete deletion when server is started.
When deletion is started, _exists field is updated with row+1.
After deletion is completed, we delete _exists=row+1.
If _exists>=1, then deletion was not completed.

Updated go version in docker to match other requirements.
Removed duplicate error check for grpc.
2022-02-25 09:28:13 -06:00

90 lines
2.1 KiB
Go

// Copyright 2021 Molecula Corp. All rights reserved.
package pilosa
import (
"testing"
"github.com/molecula/featurebase/v3/disco"
"github.com/molecula/featurebase/v3/testhook"
)
// mustHolderConfig sets up a default holder config for tests.
func mustHolderConfig() *HolderConfig {
cfg := DefaultHolderConfig()
cfg.StorageConfig.FsyncEnabled = false
cfg.RBFConfig.FsyncEnabled = false
cfg.Schemator = disco.NewInMemSchemator()
cfg.Sharder = disco.InMemSharder
return cfg
}
func TestHolder_ProcessDeleteInflight(t *testing.T) {
path, _ := testhook.TempDir(t, "delete-inflight")
h := NewHolder(path, mustHolderConfig())
defer h.Close()
err := h.Open()
if err != nil {
t.Fatalf("failed to open holder: %v", err)
}
idx, err := h.CreateIndexIfNotExists("i", IndexOptions{TrackExistence: true})
if err != nil {
t.Fatalf("failed to create index: %v", err)
}
f, err := idx.CreateFieldIfNotExists("f", OptFieldTypeDefault())
if err != nil {
t.Fatalf("failed to create field: %v", err)
}
existencefield := idx.existenceFld
shard := uint64(0)
tx := idx.Txf().NewTx(Txo{Write: true, Index: idx, Shard: shard})
defer tx.Rollback()
rowCol := []struct {
row uint64
col uint64
}{
{1, 1},
{1, 2},
{30, 33},
{22, 2},
}
for _, r := range rowCol {
_, err = f.SetBit(tx, r.row, r.col, nil)
if err != nil {
t.Fatalf("failed to set bit: %v", err)
}
_, err = existencefield.SetBit(tx, r.row, r.col, nil)
if err != nil {
t.Fatalf("failed to set bit: %v", err)
}
}
if err = tx.Commit(); err != nil {
t.Fatalf("failed to commit tx: %v", err)
}
err = h.processDeleteInflight()
if err != nil {
t.Fatalf("failed to delete: %v", err)
}
tx = idx.Txf().NewTx(Txo{Write: false, Index: idx, Shard: shard})
defer tx.Rollback()
for _, r := range rowCol {
row, err := f.Row(tx, r.row)
if err != nil {
t.Fatalf("failed to get row: %v", err)
}
existenceRow, err := existencefield.Row(tx, r.row)
if err != nil {
t.Fatalf("failed to get row: %v", err)
}
if len(row.Columns()) != 0 || len(existenceRow.Columns()) != 0 {
t.Fatalf("expected columns for fields to be empty after delete")
}
}
}