replace Redis with an embedded SQLite string->string KV store (group commit, in-tx events, SQL search)
Build and Push Docker Image / build (push) Successful in 2m44s
Build and Push Docker Image / build (push) Successful in 2m44s
This commit is contained in:
@@ -6,13 +6,13 @@ import (
|
||||
)
|
||||
|
||||
// Tests for retracting a `cids/<cid>` key-set member (cid_resolution.go's
|
||||
// removeAliasLocked, reached through DeleteProperty).
|
||||
// removeAliasTx, reached through DeleteProperty).
|
||||
//
|
||||
// Why this is worth its own file. Adding a member writes THREE keys — the flat
|
||||
// `file:<uuid>/cids/<cid>`, the `__fields__` index entry, and the reverse alias
|
||||
// `cid:<cid>` → `<uuid>`. Until removeAliasLocked existed, deleting removed only
|
||||
// the first two, so a retracted CID kept resolving to the record: the member was
|
||||
// gone from the document and the claim was not.
|
||||
// Why this is worth its own file. Adding a member writes two keys — the flat
|
||||
// `file:<uuid>/cids/<cid>` and the reverse alias `cid:<cid>` → `<uuid>`. Until
|
||||
// removeAliasLocked (now removeAliasTx) existed, deleting removed only the
|
||||
// first, so a retracted CID kept resolving to the record: the member was gone
|
||||
// from the document and the claim was not.
|
||||
//
|
||||
// That asymmetry had a live consequence. meta-share minted dag-pb roots and
|
||||
// midhash256s over whatever `archive::pick_media` elected, which on an
|
||||
@@ -26,19 +26,20 @@ import (
|
||||
// aliasTarget returns the uuid that cid:<cidStr> currently resolves to, or "".
|
||||
func aliasTarget(t *testing.T, c *Client, cidStr string) string {
|
||||
t.Helper()
|
||||
got, err := c.client.Get(context.Background(), c.buildCIDIndexKey(cidStr)).Result()
|
||||
got, _, err := c.Store().Get(context.Background(), CIDIndexPrefix+cidStr)
|
||||
if err != nil {
|
||||
return ""
|
||||
t.Fatalf("get alias: %v", err)
|
||||
}
|
||||
return got
|
||||
}
|
||||
|
||||
func hasField(t *testing.T, c *Client, hashID, field string) bool {
|
||||
t.Helper()
|
||||
ok, err := c.client.SIsMember(context.Background(), c.buildFieldsKey(hashID), field).Result()
|
||||
fields, err := c.GetMetadataFlat(hashID)
|
||||
if err != nil {
|
||||
t.Fatalf("sismember: %v", err)
|
||||
t.Fatalf("read record: %v", err)
|
||||
}
|
||||
_, ok := fields[field]
|
||||
return ok
|
||||
}
|
||||
|
||||
@@ -50,7 +51,7 @@ const (
|
||||
)
|
||||
|
||||
func TestRetractingACidMemberRemovesTheClaimNotJustTheRow(t *testing.T) {
|
||||
forEachPrefix(t, func(t *testing.T, c *Client) {
|
||||
withClient(t, func(t *testing.T, c *Client) {
|
||||
const uuid = "01KSBHMTESTRECORD"
|
||||
|
||||
if err := c.SetMetadataFlat(uuid, map[string]string{
|
||||
@@ -77,13 +78,13 @@ func TestRetractingACidMemberRemovesTheClaimNotJustTheRow(t *testing.T) {
|
||||
}
|
||||
|
||||
// 1. the flat key
|
||||
if v, err := c.client.Get(context.Background(),
|
||||
c.buildKeyPrefix(uuid)+"cids/"+poisonedRoot).Result(); err == nil {
|
||||
if v, ok, _ := c.Store().Get(context.Background(),
|
||||
recordPrefix(uuid)+"cids/"+poisonedRoot); ok {
|
||||
t.Fatalf("flat key should be gone, still %q", v)
|
||||
}
|
||||
// 2. the field index
|
||||
// 2. the record read
|
||||
if hasField(t, c, uuid, "cids/"+poisonedRoot) {
|
||||
t.Fatal("field index still lists the retracted member")
|
||||
t.Fatal("record read still lists the retracted member")
|
||||
}
|
||||
// 3. the reverse alias — the one that used to survive
|
||||
if got := aliasTarget(t, c, poisonedRoot); got != "" {
|
||||
@@ -110,7 +111,7 @@ func TestRetractingACidMemberRemovesTheClaimNotJustTheRow(t *testing.T) {
|
||||
// writer's alias in place. Retracting the loser's member must not unpick the
|
||||
// winner's index — which is why removeAliasLocked compares before deleting.
|
||||
func TestRetractingDoesNotStealAnotherRecordsAlias(t *testing.T) {
|
||||
forEachPrefix(t, func(t *testing.T, c *Client) {
|
||||
withClient(t, func(t *testing.T, c *Client) {
|
||||
const winner = "01KSBHMWINNER"
|
||||
const loser = "01KSBHMLOSER"
|
||||
const shared = "bafybeiaeb2lqi4z3np3q4tarldtyjp2t5lvnoodmtpvpi2tz73azn5td2m"
|
||||
@@ -140,7 +141,7 @@ func TestRetractingDoesNotStealAnotherRecordsAlias(t *testing.T) {
|
||||
|
||||
// A non-cids field has no alias to clean up, and the delete must not invent one.
|
||||
func TestRetractingAnOrdinaryFieldTouchesNoAlias(t *testing.T) {
|
||||
forEachPrefix(t, func(t *testing.T, c *Client) {
|
||||
withClient(t, func(t *testing.T, c *Client) {
|
||||
const uuid = "01KSBHMORDINARY"
|
||||
if err := c.SetMetadataFlat(uuid, map[string]string{
|
||||
"cids/" + goodMidhash: "true",
|
||||
|
||||
Reference in New Issue
Block a user