Fix testcase failures on windows (#7992)

Summary:
Fixed 5 test case failures found on Windows 10/Windows Server 2016
1. In `flush_job_test`, the DestroyDir function fails in deconstructor because some file handles are still being held by VersionSet. This happens on Windows Server 2016, so need to manually reset versions_ pointer to release all file handles.
2. In `StatsHistoryTest.InMemoryStatsHistoryPurging` test, the capping memory cost of stats_history_size on Windows becomes 14000 bytes with latest changes, not just 13000 bytes.
3. In `SSTDumpToolTest.RawOutput` test, the output file handle is not closed at the end.
4. In `FullBloomTest.OptimizeForMemory` test, ROCKSDB_MALLOC_USABLE_SIZE is undefined on windows so `total_mem` is always equal to `total_size`. The internal memory fragmentation assertion does not apply in this case.
5. In `BlockFetcherTest.FetchAndUncompressCompressedDataBlock` test, XPRESS cannot reach 87.5% compression ratio with original CreateTable method, so I append extra zeros to the string value to enhance compression ratio. Beside, since XPRESS allocates memory internally, thus does not support for custom allocator verification, we will skip the allocator verification for XPRESS

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7992

Reviewed By: jay-zhuang

Differential Revision: D26615283

Pulled By: ajkr

fbshipit-source-id: 3632612f84b99e2b9c77c403b112b6bedf3b125d
This commit is contained in:
sherriiiliu 2021-02-23 14:31:50 -08:00 committed by Facebook GitHub Bot
parent 75c6ffb9de
commit e017af15c1
5 changed files with 35 additions and 20 deletions

View File

@ -48,6 +48,8 @@ class FlushJobTestBase : public testing::Test {
if (getenv("KEEP_DB")) { if (getenv("KEEP_DB")) {
fprintf(stdout, "db is still in %s\n", dbname_.c_str()); fprintf(stdout, "db is still in %s\n", dbname_.c_str());
} else { } else {
// destroy versions_ to release all file handles
versions_.reset();
EXPECT_OK(DestroyDir(env_, dbname_)); EXPECT_OK(DestroyDir(env_, dbname_));
} }
} }

View File

@ -245,10 +245,10 @@ TEST_F(StatsHistoryTest, InMemoryStatsHistoryPurging) {
} }
size_t stats_history_size = dbfull()->TEST_EstimateInMemoryStatsHistorySize(); size_t stats_history_size = dbfull()->TEST_EstimateInMemoryStatsHistorySize();
ASSERT_GE(slice_count, kIterations - 1); ASSERT_GE(slice_count, kIterations - 1);
ASSERT_GE(stats_history_size, 13000); ASSERT_GE(stats_history_size, 14000);
// capping memory cost at 13000 bytes since one slice is around 10000~13000 // capping memory cost at 14000 bytes since one slice is around 10000~14000
ASSERT_OK(dbfull()->SetDBOptions({{"stats_history_buffer_size", "13000"}})); ASSERT_OK(dbfull()->SetDBOptions({{"stats_history_buffer_size", "14000"}}));
ASSERT_EQ(13000, dbfull()->GetDBOptions().stats_history_buffer_size); ASSERT_EQ(14000, dbfull()->GetDBOptions().stats_history_buffer_size);
// Wait for stats persist to finish // Wait for stats persist to finish
for (int i = 0; i < kIterations; ++i) { for (int i = 0; i < kIterations; ++i) {

View File

@ -108,7 +108,8 @@ class BlockFetcherTest : public testing::Test {
// Build table. // Build table.
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
std::string key = ToInternalKey(std::to_string(i)); std::string key = ToInternalKey(std::to_string(i));
std::string value = std::to_string(i); // Append "00000000" to string value to enhance compression ratio
std::string value = "00000000" + std::to_string(i);
table_builder->Add(key, value); table_builder->Add(key, value);
} }
ASSERT_OK(table_builder->Finish()); ASSERT_OK(table_builder->Finish());
@ -190,22 +191,30 @@ class BlockFetcherTest : public testing::Test {
ASSERT_EQ(memcpy_stats[i].num_compressed_buf_memcpy, ASSERT_EQ(memcpy_stats[i].num_compressed_buf_memcpy,
expected_stats.memcpy_stats.num_compressed_buf_memcpy); expected_stats.memcpy_stats.num_compressed_buf_memcpy);
ASSERT_EQ(heap_buf_allocators[i].GetNumAllocations(), if (kXpressCompression == compression_type) {
expected_stats.buf_allocation_stats.num_heap_buf_allocations); // XPRESS allocates memory internally, thus does not support for
ASSERT_EQ( // custom allocator verification
compressed_buf_allocators[i].GetNumAllocations(), continue;
expected_stats.buf_allocation_stats.num_compressed_buf_allocations); } else {
ASSERT_EQ(
heap_buf_allocators[i].GetNumAllocations(),
expected_stats.buf_allocation_stats.num_heap_buf_allocations);
ASSERT_EQ(compressed_buf_allocators[i].GetNumAllocations(),
expected_stats.buf_allocation_stats
.num_compressed_buf_allocations);
// The allocated buffers are not deallocated until // The allocated buffers are not deallocated until
// the block content is deleted. // the block content is deleted.
ASSERT_EQ(heap_buf_allocators[i].GetNumDeallocations(), 0); ASSERT_EQ(heap_buf_allocators[i].GetNumDeallocations(), 0);
ASSERT_EQ(compressed_buf_allocators[i].GetNumDeallocations(), 0); ASSERT_EQ(compressed_buf_allocators[i].GetNumDeallocations(), 0);
blocks[i].allocation.reset(); blocks[i].allocation.reset();
ASSERT_EQ(heap_buf_allocators[i].GetNumDeallocations(), ASSERT_EQ(
expected_stats.buf_allocation_stats.num_heap_buf_allocations); heap_buf_allocators[i].GetNumDeallocations(),
ASSERT_EQ( expected_stats.buf_allocation_stats.num_heap_buf_allocations);
compressed_buf_allocators[i].GetNumDeallocations(), ASSERT_EQ(compressed_buf_allocators[i].GetNumDeallocations(),
expected_stats.buf_allocation_stats.num_compressed_buf_allocations); expected_stats.buf_allocation_stats
.num_compressed_buf_allocations);
}
} }
} }
} }

View File

@ -392,6 +392,8 @@ TEST_F(SSTDumpToolTest, RawOutput) {
ASSERT_EQ(kNumKey, key_count); ASSERT_EQ(kNumKey, key_count);
raw_file.close();
cleanup(opts, file_path); cleanup(opts, file_path);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
delete[] usage[i]; delete[] usage[i];

View File

@ -573,8 +573,10 @@ TEST_P(FullBloomTest, OptimizeForMemory) {
#ifdef ROCKSDB_JEMALLOC #ifdef ROCKSDB_JEMALLOC
fprintf(stderr, "Jemalloc detected? %d\n", HasJemalloc()); fprintf(stderr, "Jemalloc detected? %d\n", HasJemalloc());
if (HasJemalloc()) { if (HasJemalloc()) {
#ifdef ROCKSDB_MALLOC_USABLE_SIZE
// More than 5% internal fragmentation // More than 5% internal fragmentation
EXPECT_GE(total_mem, total_size * 105 / 100); EXPECT_GE(total_mem, total_size * 105 / 100);
#endif // ROCKSDB_MALLOC_USABLE_SIZE
} }
#endif // ROCKSDB_JEMALLOC #endif // ROCKSDB_JEMALLOC
// No storage penalty, just usual overhead // No storage penalty, just usual overhead