Skip to content

Commit 99c787b

Browse files
committed
fix
1 parent ab8be40 commit 99c787b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

be/src/olap/tablet_meta.cpp

+43-1
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,7 @@ void TabletMeta::delete_stale_rs_meta_by_version(const Version& version) {
935935
// remove rowset delete bitmap
936936
delete_bitmap().remove({(*it)->rowset_id(), 0, 0},
937937
{(*it)->rowset_id(), UINT32_MAX, 0});
938+
delete_bitmap().remove_rowset_cache_version((*it)->rowset_id());
938939
}
939940
it = _stale_rs_metas.erase(it);
940941
} else {
@@ -1283,6 +1284,23 @@ bool DeleteBitmap::has_calculated_for_multi_segments(const RowsetId& rowset_id)
12831284
return contains({rowset_id, INVALID_SEGMENT_ID, TEMP_VERSION_COMMON}, ROWSET_SENTINEL_MARK);
12841285
}
12851286

1287+
void DeleteBitmap::remove_rowset_cache_version(const RowsetId& rowset_id) {
1288+
std::lock_guard l(_rowset_cache_version_lock);
1289+
_rowset_cache_version.erase(rowset_id);
1290+
}
1291+
1292+
DeleteBitmap::Version DeleteBitmap::_get_rowset_cache_version(const BitmapKey& bmk) const {
1293+
std::shared_lock l(_rowset_cache_version_lock);
1294+
if (auto it = _rowset_cache_version.find(std::get<0>(bmk)); it != _rowset_cache_version.end()) {
1295+
auto& segment_cache_version = it->second;
1296+
if (auto it1 = segment_cache_version.find(std::get<1>(bmk));
1297+
it1 != segment_cache_version.end()) {
1298+
return it1->second;
1299+
}
1300+
}
1301+
return 0;
1302+
}
1303+
12861304
// We cannot just copy the underlying memory to construct a string
12871305
// due to equivalent objects may have different padding bytes.
12881306
// Reading padding bytes is undefined behavior, neither copy nor
@@ -1314,9 +1332,27 @@ std::shared_ptr<roaring::Roaring> DeleteBitmap::get_agg(const BitmapKey& bmk) co
13141332
// of cache entries in some cases?
13151333
if (val == nullptr) { // Renew if needed, put a new Value to cache
13161334
val = new AggCache::Value();
1335+
Version start_version = _get_rowset_cache_version(bmk);
1336+
if (start_version > 0) {
1337+
Cache::Handle* handle2 = _agg_cache->repr()->lookup(
1338+
agg_cache_key(_tablet_id, {std::get<0>(bmk), std::get<1>(bmk), start_version}));
1339+
if (handle2 == nullptr) {
1340+
start_version = 0;
1341+
} else {
1342+
val->bitmap |=
1343+
reinterpret_cast<AggCache::Value*>(_agg_cache->repr()->value(handle2))
1344+
->bitmap;
1345+
_agg_cache->repr()->release(handle2);
1346+
VLOG_DEBUG << "get agg cache version=" << start_version
1347+
<< " for tablet=" << _tablet_id
1348+
<< ", rowset=" << std::get<0>(bmk).to_string()
1349+
<< ", segment=" << std::get<1>(bmk);
1350+
start_version += 1;
1351+
}
1352+
}
13171353
{
13181354
std::shared_lock l(lock);
1319-
DeleteBitmap::BitmapKey start {std::get<0>(bmk), std::get<1>(bmk), 0};
1355+
DeleteBitmap::BitmapKey start {std::get<0>(bmk), std::get<1>(bmk), start_version};
13201356
for (auto it = delete_bitmap.lower_bound(start); it != delete_bitmap.end(); ++it) {
13211357
auto& [k, bm] = *it;
13221358
if (std::get<0>(k) != std::get<0>(bmk) || std::get<1>(k) != std::get<1>(bmk) ||
@@ -1328,6 +1364,12 @@ std::shared_ptr<roaring::Roaring> DeleteBitmap::get_agg(const BitmapKey& bmk) co
13281364
}
13291365
size_t charge = val->bitmap.getSizeInBytes() + sizeof(AggCache::Value);
13301366
handle = _agg_cache->repr()->insert(key, val, charge, charge, CachePriority::NORMAL);
1367+
// this version is already agged
1368+
std::lock_guard l(_rowset_cache_version_lock);
1369+
_rowset_cache_version[std::get<0>(bmk)][std::get<1>(bmk)] = std::get<2>(bmk);
1370+
VLOG_DEBUG << "set agg cache version=" << std::get<2>(bmk) << " for tablet=" << _tablet_id
1371+
<< ", rowset=" << std::get<0>(bmk).to_string()
1372+
<< ", segment=" << std::get<1>(bmk);
13311373
}
13321374

13331375
// It is natural for the cache to reclaim the underlying memory

be/src/olap/tablet_meta.h

+6
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,8 @@ class DeleteBitmap {
557557

558558
bool has_calculated_for_multi_segments(const RowsetId& rowset_id) const;
559559

560+
void remove_rowset_cache_version(const RowsetId& rowset_id);
561+
560562
class AggCachePolicy : public LRUCachePolicy {
561563
public:
562564
AggCachePolicy(size_t capacity)
@@ -588,8 +590,12 @@ class DeleteBitmap {
588590
};
589591

590592
private:
593+
DeleteBitmap::Version _get_rowset_cache_version(const BitmapKey& bmk) const;
594+
591595
mutable std::shared_ptr<AggCache> _agg_cache;
592596
int64_t _tablet_id;
597+
mutable std::shared_mutex _rowset_cache_version_lock;
598+
mutable std::map<RowsetId, std::map<SegmentId, Version>> _rowset_cache_version;
593599
// <version, <tablet_id, BitmapKeyStart, BitmapKeyEnd>>
594600
std::map<std::string,
595601
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>>

0 commit comments

Comments
 (0)