mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
This is a unification of a number of bug fixes, feature additions, and so on. Features include: * Dropping the "New" from NewWrite/NewRead. * IndexName->keys.Index, etc. * Add a new "Flush" operation which is necessary to get the intended behavior of Delete, which allows us to commit/flush changes without letting go of a write lock. * Some additional wrapping and locking in rbfTxWrappers to support that. rbfQueryRead/Write now forward their calls to the parent rbfTxWrappers, so it can lock around the reference to its underlying tx, so the flush operation can replace that tx safely. * AddIndexShards now treats no shards as "all shards", to simplify call sites. * Added parameters to NewRBFTxStore to let it interact with executor's logger and worker pool. * Internally, support explicit closes of parts of the database which can also check for errors and fail if it's in use. * Add ability to request a map of fields and views in use for a given index/shard pair. This is probably deprecated but we need it for the way backup/restore work. * Add ability to request a complete map of the database showing which shards exist for which index/field/view tuples. This is backwards from how we store things on disk, but we need it to allow creating the right in-memory data structures on database open. * Add "Backend()" method to let us distinguish backends in case we some day have them again. * Support deleting indexes, fields, or fragments. * Support Backup (returning a ReadCloser that dumps the RBF file, implicitly merging any current WAL) and Restore (create a new RBF file). * Change directory structure and fragment keys to match existing databases, so we should in theory be able to open an existing data directory. * Fragment delete probably doesn't lock correctly and this should be reviewed. * Export the DOT-format Dump so we can hook it up to a debug endpoint. This wants to be explored more; ideally the front-end UI should be able to display this. * Create a NopTxStore which can be used like a TxStore but everything that can error errors out. This is then used to let a holder that hasn't had a txstore initialized work anyway. There's at least a couple of open issues that need to be revisited here.
44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
// Copyright 2022 Molecula Corp (DBA FeatureBase). All rights reserved.
|
|
package querycontext
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/molecula/featurebase/v3/keys"
|
|
)
|
|
|
|
func TestDot(t *testing.T) {
|
|
// test this with two splitters, one of which is the default indexShardKeySplitter. the second one will overwrite
|
|
// the output from the first one.
|
|
for _, splitter := range []KeySplitter{&flexibleKeySplitter{splitIndexes: map[keys.Index]struct{}{"i": {}}}, nil} {
|
|
txs := testTxStore(t, "foo", splitter)
|
|
file, err := os.Create("test.dot")
|
|
if err != nil {
|
|
t.Fatalf("creating file: %v", err)
|
|
}
|
|
defer file.Close()
|
|
q, _ := txs.NewWriteQueryContext(context.Background(), txs.Scope().AddIndex("i").AddIndexShards("k", 0))
|
|
defer q.Release()
|
|
q.Write("i", "f", "v", 0)
|
|
q.Write("i", "g", "v", 0)
|
|
q.Write("i", "f", "v", 1)
|
|
// read, but it's in a writable thing, so still creates rbfQueryWrite
|
|
q.Read("i", "f", "v", 2)
|
|
q.Read("j", "f", "v", 0)
|
|
q2, _ := txs.NewQueryContext(context.Background())
|
|
defer q2.Release()
|
|
q2.Read("i", "f", "v", 0)
|
|
q2.Read("i", "g", "v", 0)
|
|
var dg dotGraph
|
|
// we know what we actually have here...
|
|
inner := txs.inner
|
|
dg.enqueue(inner.(*rbfTxStore))
|
|
dg.build(5)
|
|
err = dg.Write(file)
|
|
if err != nil {
|
|
t.Fatalf("writing dot: %v", err)
|
|
}
|
|
}
|
|
}
|