facebook / facebook/rocksdb

Merge operation is not working properly for huge values

Open
#5,489 6 comments 0 reactions 0 assignees View on GitHub
up-for-grabs
Dominant language
C++
Stars
32.1k
Forks
6.9k
Avg merge
32m
Merged PRs (30d)
1

Description

### Expected behavior
Merge call should return correct value on subsequent call to Get. This is not happening when value becomes huge. It is returning older version of merge when there is no "sleep" before get which breaks contract that merge is atomic operation.

### Actual behavior
Get call after Merge does not return last value that should be seen. It happens only after some time (compaction finish?);

### Steps to reproduce the behavior
I have written unit test in stringappend_test.cc. Just paste this snippet there. I have used latest version 6.1.2.

```
TEST_F(StringAppendOperatorTest, StringAppendOperatorHugeValueTest) {
auto db = OpenDb('\0');

std::string key("key");
std::string value;
size_t size = (size_t(1) << 31) / 3;
size_t chunks = 10;
size_t chunkSize = size / chunks;
value.resize(chunkSize, ' ');

auto s = db->Put(WriteOptions(), key, value);
ASSERT_TRUE(s.ok());
for (size_t i = 0; i < chunks; i++) {
s = db->Merge(WriteOptions(), key, value);
ASSERT_TRUE(s.ok());
}

value.clear();
s = db->Get(ReadOptions(), key, &value);
ASSERT_TRUE(s.ok());
ASSERT_EQ(value.size(), chunkSize * (chunks + 1)
// Separators
+ chunks);
}
```

When one uses smaller size it works fine:
```
size_t size = (size_t(1) << 31) / 30;
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.