Skip to content

Commit

Permalink
Fix unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
kssenii committed Jul 21, 2023
1 parent 6089243 commit 2b02148
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 20 deletions.
4 changes: 2 additions & 2 deletions src/Interpreters/Cache/FileCache.cpp
Expand Up @@ -1081,7 +1081,7 @@ FileSegments FileCache::getSnapshot(const Key & key)
return file_segments;
}

FileSegmentsHolderPtr FileCache::dumpQueue()
FileSegments FileCache::dumpQueue()
{
assertInitialized();

Expand All @@ -1092,7 +1092,7 @@ FileSegmentsHolderPtr FileCache::dumpQueue()
return PriorityIterationResult::CONTINUE;
}, lockCache());

return std::make_unique<FileSegmentsHolder>(std::move(file_segments));
return file_segments;
}

std::vector<String> FileCache::tryGetCachePaths(const Key & key)
Expand Down
2 changes: 1 addition & 1 deletion src/Interpreters/Cache/FileCache.h
Expand Up @@ -112,7 +112,7 @@ class FileCache : private boost::noncopyable

FileSegments getSnapshot(const Key & key);

FileSegmentsHolderPtr dumpQueue();
FileSegments dumpQueue();

void cleanup();

Expand Down
14 changes: 7 additions & 7 deletions src/Interpreters/Cache/Metadata.cpp
Expand Up @@ -588,34 +588,34 @@ void LockedKey::removeAll(bool if_releasable)
}
}

KeyMetadata::iterator LockedKey::removeFileSegment(size_t offset, bool allow_throw)
KeyMetadata::iterator LockedKey::removeFileSegment(size_t offset, bool can_be_broken)
{
auto it = key_metadata->find(offset);
if (it == key_metadata->end())
throw Exception(ErrorCodes::BAD_ARGUMENTS, "There is no offset {}", offset);

auto file_segment = it->second->file_segment;
return removeFileSegmentImpl(it, file_segment->lock(), allow_throw);
return removeFileSegmentImpl(it, file_segment->lock(), can_be_broken);
}

KeyMetadata::iterator LockedKey::removeFileSegment(size_t offset, const FileSegmentGuard::Lock & segment_lock, bool allow_throw)
KeyMetadata::iterator LockedKey::removeFileSegment(size_t offset, const FileSegmentGuard::Lock & segment_lock, bool can_be_broken)
{
auto it = key_metadata->find(offset);
if (it == key_metadata->end())
throw Exception(ErrorCodes::LOGICAL_ERROR, "There is no offset {}", offset);

return removeFileSegmentImpl(it, segment_lock, allow_throw);
return removeFileSegmentImpl(it, segment_lock, can_be_broken);
}

KeyMetadata::iterator LockedKey::removeFileSegmentImpl(KeyMetadata::iterator it, const FileSegmentGuard::Lock & segment_lock, bool allow_throw)
KeyMetadata::iterator LockedKey::removeFileSegmentImpl(KeyMetadata::iterator it, const FileSegmentGuard::Lock & segment_lock, bool can_be_broken)
{
auto file_segment = it->second->file_segment;

LOG_DEBUG(
key_metadata->log, "Remove from cache. Key: {}, offset: {}, size: {}",
getKey(), file_segment->offset(), file_segment->reserved_size);

chassert(!allow_throw || file_segment->assertCorrectnessUnlocked(segment_lock));
chassert(can_be_broken || file_segment->assertCorrectnessUnlocked(segment_lock));

if (file_segment->queue_iterator)
file_segment->queue_iterator->invalidate();
Expand All @@ -637,7 +637,7 @@ KeyMetadata::iterator LockedKey::removeFileSegmentImpl(KeyMetadata::iterator it,

LOG_TEST(key_metadata->log, "Removed file segment at path: {}", path);
}
else if (file_segment->downloaded_size && allow_throw)
else if (file_segment->downloaded_size && !can_be_broken)
throw Exception(ErrorCodes::LOGICAL_ERROR, "Expected path {} to exist", path);

return key_metadata->erase(it);
Expand Down
6 changes: 3 additions & 3 deletions src/Interpreters/Cache/Metadata.h
Expand Up @@ -172,8 +172,8 @@ struct LockedKey : private boost::noncopyable

void removeAll(bool if_releasable = true);

KeyMetadata::iterator removeFileSegment(size_t offset, const FileSegmentGuard::Lock &, bool allow_throw = true);
KeyMetadata::iterator removeFileSegment(size_t offset, bool allow_throw = true);
KeyMetadata::iterator removeFileSegment(size_t offset, const FileSegmentGuard::Lock &, bool can_be_broken = false);
KeyMetadata::iterator removeFileSegment(size_t offset, bool can_be_broken = false);

void shrinkFileSegmentToDownloadedSize(size_t offset, const FileSegmentGuard::Lock &);

Expand All @@ -192,7 +192,7 @@ struct LockedKey : private boost::noncopyable
std::string toString() const;

private:
KeyMetadata::iterator removeFileSegmentImpl(KeyMetadata::iterator it, const FileSegmentGuard::Lock &, bool allow_throw = true);
KeyMetadata::iterator removeFileSegmentImpl(KeyMetadata::iterator it, const FileSegmentGuard::Lock &, bool can_be_broken = true);

const std::shared_ptr<KeyMetadata> key_metadata;
KeyGuard::Lock lock; /// `lock` must be destructed before `key_metadata`.
Expand Down
27 changes: 20 additions & 7 deletions src/Interpreters/tests/gtest_lru_file_cache.cpp
Expand Up @@ -69,13 +69,16 @@ fs::path caches_dir = fs::current_path() / "lru_cache_test";
std::string cache_base_path = caches_dir / "cache1" / "";


void assertEqual(const HolderPtr & holder, const Ranges & expected_ranges, const States & expected_states = {})
void assertEqual(FileSegments::const_iterator segments_begin, FileSegments::const_iterator segments_end, size_t segments_size, const Ranges & expected_ranges, const States & expected_states = {})
{
std::cerr << "Holder: " << holder->toString() << "\n";
ASSERT_EQ(holder->size(), expected_ranges.size());
std::cerr << "File segments: ";
for (auto it = segments_begin; it != segments_end; ++it)
std::cerr << (*it)->range().toString() << ", ";

ASSERT_EQ(segments_size, expected_ranges.size());

if (!expected_states.empty())
ASSERT_EQ(holder->size(), expected_states.size());
ASSERT_EQ(segments_size, expected_states.size());

auto get_expected_state = [&](size_t i)
{
Expand All @@ -86,14 +89,25 @@ void assertEqual(const HolderPtr & holder, const Ranges & expected_ranges, const
};

size_t i = 0;
for (const auto & file_segment : *holder)
for (auto it = segments_begin; it != segments_end; ++it)
{
const auto & file_segment = *it;
ASSERT_EQ(file_segment->range(), expected_ranges[i]);
ASSERT_EQ(file_segment->state(), get_expected_state(i));
++i;
}
}

void assertEqual(const FileSegments & file_segments, const Ranges & expected_ranges, const States & expected_states = {})
{
assertEqual(file_segments.begin(), file_segments.end(), file_segments.size(), expected_ranges, expected_states);
}

void assertEqual(const FileSegmentsHolderPtr & file_segments, const Ranges & expected_ranges, const States & expected_states = {})
{
assertEqual(file_segments->begin(), file_segments->end(), file_segments->size(), expected_ranges, expected_states);
}

FileSegment & get(const HolderPtr & holder, int i)
{
auto it = std::next(holder->begin(), i);
Expand Down Expand Up @@ -478,8 +492,7 @@ TEST_F(FileCacheTest, get)
cv.notify_one();

file_segment2.wait(file_segment2.range().right);
file_segment2.complete();
ASSERT_TRUE(file_segment2.state() == State::DOWNLOADED);
ASSERT_EQ(file_segment2.getDownloadedSize(false), file_segment2.range().size());
});

{
Expand Down

0 comments on commit 2b02148

Please sign in to comment.