Skip to content

Commit

Permalink
storage/inmem: Create path if does not exist during truncate (open-po…
Browse files Browse the repository at this point in the history
…licy-agent#4853)

A data write performed at a non-root nonexistent path
in the im-memory store during a trucnate op would cause a
storage not found error. This change creates a path if one
does not exist before writing data.

Signed-off-by: Ashutosh Narkar <anarkar4387@gmail.com>
  • Loading branch information
ashutosh-narkar authored and srenatus committed Jul 7, 2022
1 parent e214bcf commit 4b108ac
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
11 changes: 11 additions & 0 deletions storage/inmem/inmem.go
Expand Up @@ -121,6 +121,17 @@ func (db *store) Truncate(ctx context.Context, txn storage.Transaction, _ storag
return err
}

_, err := underlying.Read(update.Path[:len(update.Path)-1])
if err != nil {
if !storage.IsNotFound(err) {
return err
}

if err := storage.MakeDir(ctx, db, txn, update.Path[:len(update.Path)-1]); err != nil {
return err
}
}

err = underlying.Write(storage.AddOp, update.Path, obj)
if err != nil {
return err
Expand Down
54 changes: 54 additions & 0 deletions storage/inmem/inmem_test.go
Expand Up @@ -327,6 +327,60 @@ func TestInMemoryTxnMultipleWrites(t *testing.T) {
}
}

func TestTruncateNoExistingPath(t *testing.T) {
ctx := context.Background()
store := NewFromObject(map[string]interface{}{})
txn := storage.NewTransactionOrDie(ctx, store, storage.WriteParams)

var archiveFiles = map[string]string{
"/a/b/c/data.json": "[1,2,3]",
}

var files [][2]string
for name, content := range archiveFiles {
files = append(files, [2]string{name, content})
}

buf := archive.MustWriteTarGz(files)
b, err := bundle.NewReader(buf).WithLazyLoadingMode(true).Read()
if err != nil {
t.Fatal(err)
}

iterator := bundle.NewIterator(b.Raw)

err = store.Truncate(ctx, txn, storage.WriteParams, iterator)
if err != nil {
t.Fatalf("Unexpected truncate error: %v", err)
}

if err := store.Commit(ctx, txn); err != nil {
t.Fatalf("Unexpected commit error: %v", err)
}

txn = storage.NewTransactionOrDie(ctx, store)

actual, err := store.Read(ctx, txn, storage.MustParsePath("/"))
if err != nil {
t.Fatal(err)
}

expected := `
{
"a": {
"b": {
"c": [1,2,3]
}
}
}
`
jsn := util.MustUnmarshalJSON([]byte(expected))

if !reflect.DeepEqual(jsn, actual) {
t.Fatalf("Expected reader's read to be %v but got: %v", jsn, actual)
}
}

func TestTruncate(t *testing.T) {
ctx := context.Background()
store := NewFromObject(map[string]interface{}{})
Expand Down

0 comments on commit 4b108ac

Please sign in to comment.