Skip to content

Commit 14b2ed8

Browse files
committed
fix(embedded/store): handle replication of empty values
Signed-off-by: Jeronimo Irazabal <[email protected]>
1 parent d4da35f commit 14b2ed8

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

embedded/store/immustore.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2868,10 +2868,6 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) {
28682868
func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, skipIntegrityCheck bool) (n int, err error) {
28692869
vLogID, offset := decodeOffset(off)
28702870

2871-
if len(b) == 0 && vLogID > 0 {
2872-
return 0, fmt.Errorf("%w: attempt to read empty value from a non-embedded vlog", ErrCorruptedTxData)
2873-
}
2874-
28752871
if !s.embeddedValues && vLogID == 0 && len(b) > 0 {
28762872
// it means value was not stored on any vlog i.e. a truncated transaction was replicated
28772873
return 0, io.EOF
@@ -2922,7 +2918,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s
29222918
}
29232919
}
29242920

2925-
// either value was empty (n == 0 && vLogID == 0)
2921+
// either value was empty (n == 0)
29262922
// or a non-empty value (n > 0) was read from cache or disk
29272923

29282924
if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) {

embedded/store/immustore_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4937,3 +4937,30 @@ func TestCommitOfEmptyTxWithMetadata(t *testing.T) {
49374937
require.NoError(t, err)
49384938
require.Empty(t, txholder.Entries())
49394939
}
4940+
4941+
func TestImmudbStore_ExportTxWithEmptyValues(t *testing.T) {
4942+
opts := DefaultOptions().WithEmbeddedValues(false)
4943+
4944+
st, err := Open(t.TempDir(), opts)
4945+
require.NoError(t, err)
4946+
require.NotNil(t, st)
4947+
4948+
defer immustoreClose(t, st)
4949+
4950+
tx, err := st.NewWriteOnlyTx(context.Background())
4951+
require.NoError(t, err)
4952+
4953+
err = tx.Set([]byte("my-key"), nil, nil)
4954+
require.NoError(t, err)
4955+
4956+
hdr, err := tx.Commit(context.Background())
4957+
require.NoError(t, err)
4958+
4959+
txholder, err := st.fetchAllocTx()
4960+
require.NoError(t, err)
4961+
4962+
defer st.releaseAllocTx(txholder)
4963+
4964+
_, err = st.ExportTx(hdr.ID, false, false, txholder)
4965+
require.NoError(t, err)
4966+
}

0 commit comments

Comments
 (0)