mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-07 00:55:55 +00:00
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.
90 lines
2.1 KiB
Go
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")
|
|
}
|
|
}
|
|
}
|