Skip to content

Commit 73d9c5a

Browse files
committed
[improve](mow) merge and remove old version of delete bitmap when cumulative compaction is done
1 parent d1dd2d1 commit 73d9c5a

11 files changed

+145
-80
lines changed

be/src/cloud/cloud_cumulative_compaction.cpp

+7-31
Original file line numberDiff line numberDiff line change
@@ -359,42 +359,18 @@ Status CloudCumulativeCompaction::modify_rowsets() {
359359
}
360360

361361
void CloudCumulativeCompaction::process_old_version_delete_bitmap() {
362-
// agg previously rowset old version delete bitmap
363362
std::vector<RowsetSharedPtr> pre_rowsets {};
364-
std::vector<std::string> pre_rowset_ids {};
365363
for (const auto& it : cloud_tablet()->rowset_map()) {
366364
if (it.first.second < _input_rowsets.front()->start_version()) {
367365
pre_rowsets.emplace_back(it.second);
368-
pre_rowset_ids.emplace_back(it.second->rowset_id().to_string());
369366
}
370367
}
371368
std::sort(pre_rowsets.begin(), pre_rowsets.end(), Rowset::comparator);
372369
if (!pre_rowsets.empty()) {
373-
auto pre_max_version = _output_rowset->version().second;
374-
DeleteBitmapPtr new_delete_bitmap =
375-
std::make_shared<DeleteBitmap>(_tablet->tablet_meta()->tablet_id());
376370
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>
377371
to_remove_vec;
378-
for (auto& rowset : pre_rowsets) {
379-
if (rowset->rowset_meta()->total_disk_size() == 0) {
380-
continue;
381-
}
382-
for (uint32_t seg_id = 0; seg_id < rowset->num_segments(); ++seg_id) {
383-
rowset->rowset_id().to_string();
384-
DeleteBitmap::BitmapKey start {rowset->rowset_id(), seg_id, 0};
385-
DeleteBitmap::BitmapKey end {rowset->rowset_id(), seg_id, pre_max_version};
386-
DeleteBitmap::BitmapKey before_end {rowset->rowset_id(), seg_id,
387-
pre_max_version - 1};
388-
auto d = _tablet->tablet_meta()->delete_bitmap().get_agg(
389-
{rowset->rowset_id(), seg_id, pre_max_version});
390-
to_remove_vec.emplace_back(
391-
std::make_tuple(_tablet->tablet_id(), start, before_end));
392-
if (d->isEmpty()) {
393-
continue;
394-
}
395-
new_delete_bitmap->set(end, *d);
396-
}
397-
}
372+
DeleteBitmapPtr new_delete_bitmap = nullptr;
373+
agg_and_remove_old_version_delete_bitmap(pre_rowsets, to_remove_vec, new_delete_bitmap);
398374
if (!new_delete_bitmap->empty()) {
399375
// store agg delete bitmap
400376
Status update_st;
@@ -423,11 +399,11 @@ void CloudCumulativeCompaction::process_old_version_delete_bitmap() {
423399
}
424400
_tablet->tablet_meta()->delete_bitmap().add_to_remove_queue(version.to_string(),
425401
to_remove_vec);
426-
DBUG_EXECUTE_IF(
427-
"CloudCumulativeCompaction.modify_rowsets.delete_expired_stale_rowsets", {
428-
static_cast<CloudTablet*>(_tablet.get())
429-
->delete_expired_stale_rowsets();
430-
});
402+
DBUG_EXECUTE_IF("CumulativeCompaction.modify_rowsets.delete_expired_stale_rowsets",
403+
{
404+
static_cast<CloudTablet*>(_tablet.get())
405+
->delete_expired_stale_rowsets();
406+
});
431407
}
432408
}
433409
}

be/src/cloud/cloud_delete_bitmap_action.cpp be/src/http/action/delete_bitmap_action.cpp

+15-11
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
#include "cloud_delete_bitmap_action.h"
18+
#include "delete_bitmap_action.h"
1919

2020
#include <rapidjson/document.h>
2121
#include <rapidjson/encodings.h>
@@ -33,8 +33,10 @@
3333
#include <thread>
3434
#include <utility>
3535

36+
#include "cloud/cloud_storage_engine.h"
3637
#include "cloud/cloud_tablet.h"
3738
#include "cloud/cloud_tablet_mgr.h"
39+
#include "cloud/config.h"
3840
#include "common/logging.h"
3941
#include "common/status.h"
4042
#include "gutil/strings/substitute.h"
@@ -43,7 +45,6 @@
4345
#include "http/http_request.h"
4446
#include "http/http_status.h"
4547
#include "olap/olap_define.h"
46-
#include "olap/storage_engine.h"
4748
#include "olap/tablet_manager.h"
4849
#include "util/doris_metrics.h"
4950
#include "util/stopwatch.hpp"
@@ -57,10 +58,9 @@ constexpr std::string_view HEADER_JSON = "application/json";
5758

5859
} // namespace
5960

60-
CloudDeleteBitmapAction::CloudDeleteBitmapAction(DeleteBitmapActionType ctype, ExecEnv* exec_env,
61-
CloudStorageEngine& engine,
62-
TPrivilegeHier::type hier,
63-
TPrivilegeType::type ptype)
61+
DeleteBitmapAction::DeleteBitmapAction(DeleteBitmapActionType ctype, ExecEnv* exec_env,
62+
BaseStorageEngine& engine, TPrivilegeHier::type hier,
63+
TPrivilegeType::type ptype)
6464
: HttpHandlerWithAuth(exec_env, hier, ptype),
6565
_engine(engine),
6666
_delete_bitmap_action_type(ctype) {}
@@ -78,20 +78,24 @@ static Status _check_param(HttpRequest* req, uint64_t* tablet_id) {
7878
return Status::OK();
7979
}
8080

81-
Status CloudDeleteBitmapAction::_handle_show_delete_bitmap_count(HttpRequest* req,
82-
std::string* json_result) {
81+
Status DeleteBitmapAction::_handle_show_delete_bitmap_count(HttpRequest* req,
82+
std::string* json_result) {
8383
uint64_t tablet_id = 0;
8484
// check & retrieve tablet_id from req if it contains
8585
RETURN_NOT_OK_STATUS_WITH_WARN(_check_param(req, &tablet_id), "check param failed");
8686
if (tablet_id == 0) {
8787
return Status::InternalError("check param failed: missing tablet_id");
8888
}
8989

90-
CloudTabletSPtr tablet = DORIS_TRY(_engine.tablet_mgr().get_tablet(tablet_id));
90+
BaseTabletSPtr tablet = nullptr;
91+
if (config::is_cloud_mode()) {
92+
tablet = DORIS_TRY(_engine.to_cloud().tablet_mgr().get_tablet(tablet_id));
93+
} else {
94+
tablet = _engine.to_local().tablet_manager()->get_tablet(tablet_id);
95+
}
9196
if (tablet == nullptr) {
9297
return Status::NotFound("Tablet not found. tablet_id={}", tablet_id);
9398
}
94-
9599
auto count = tablet->tablet_meta()->delete_bitmap().get_delete_bitmap_count();
96100
auto cardinality = tablet->tablet_meta()->delete_bitmap().cardinality();
97101
auto size = tablet->tablet_meta()->delete_bitmap().get_size();
@@ -111,7 +115,7 @@ Status CloudDeleteBitmapAction::_handle_show_delete_bitmap_count(HttpRequest* re
111115
return Status::OK();
112116
}
113117

114-
void CloudDeleteBitmapAction::handle(HttpRequest* req) {
118+
void DeleteBitmapAction::handle(HttpRequest* req) {
115119
req->add_output_header(HttpHeaders::CONTENT_TYPE, HEADER_JSON.data());
116120
if (_delete_bitmap_action_type == DeleteBitmapActionType::COUNT_INFO) {
117121
std::string json_result;

be/src/cloud/cloud_delete_bitmap_action.h be/src/http/action/delete_bitmap_action.h

+6-7
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121

2222
#include <string>
2323

24-
#include "cloud/cloud_storage_engine.h"
2524
#include "common/status.h"
2625
#include "http/http_handler_with_auth.h"
26+
#include "olap/storage_engine.h"
2727
#include "olap/tablet.h"
2828

2929
namespace doris {
@@ -34,21 +34,20 @@ class ExecEnv;
3434
enum class DeleteBitmapActionType { COUNT_INFO = 1 };
3535

3636
/// This action is used for viewing the delete bitmap status
37-
class CloudDeleteBitmapAction : public HttpHandlerWithAuth {
37+
class DeleteBitmapAction : public HttpHandlerWithAuth {
3838
public:
39-
CloudDeleteBitmapAction(DeleteBitmapActionType ctype, ExecEnv* exec_env,
40-
CloudStorageEngine& engine, TPrivilegeHier::type hier,
41-
TPrivilegeType::type ptype);
39+
DeleteBitmapAction(DeleteBitmapActionType ctype, ExecEnv* exec_env, BaseStorageEngine& engine,
40+
TPrivilegeHier::type hier, TPrivilegeType::type ptype);
4241

43-
~CloudDeleteBitmapAction() override = default;
42+
~DeleteBitmapAction() override = default;
4443

4544
void handle(HttpRequest* req) override;
4645

4746
private:
4847
Status _handle_show_delete_bitmap_count(HttpRequest* req, std::string* json_result);
4948

5049
private:
51-
CloudStorageEngine& _engine;
50+
BaseStorageEngine& _engine;
5251
DeleteBitmapActionType _delete_bitmap_action_type;
5352
};
5453
} // namespace doris

be/src/olap/compaction.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,34 @@ void Compaction::construct_skip_inverted_index(RowsetWriterContext& ctx) {
900900
}
901901
}
902902

903+
void Compaction::agg_and_remove_old_version_delete_bitmap(
904+
std::vector<RowsetSharedPtr>& pre_rowsets,
905+
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>&
906+
to_remove_vec,
907+
DeleteBitmapPtr& new_delete_bitmap) {
908+
// agg previously rowset old version delete bitmap
909+
auto pre_max_version = _output_rowset->version().second;
910+
new_delete_bitmap = std::make_shared<DeleteBitmap>(_tablet->tablet_meta()->tablet_id());
911+
for (auto& rowset : pre_rowsets) {
912+
if (rowset->rowset_meta()->total_disk_size() == 0) {
913+
continue;
914+
}
915+
for (uint32_t seg_id = 0; seg_id < rowset->num_segments(); ++seg_id) {
916+
rowset->rowset_id().to_string();
917+
DeleteBitmap::BitmapKey start {rowset->rowset_id(), seg_id, 0};
918+
DeleteBitmap::BitmapKey end {rowset->rowset_id(), seg_id, pre_max_version};
919+
DeleteBitmap::BitmapKey before_end {rowset->rowset_id(), seg_id, pre_max_version - 1};
920+
auto d = _tablet->tablet_meta()->delete_bitmap().get_agg(
921+
{rowset->rowset_id(), seg_id, pre_max_version});
922+
to_remove_vec.emplace_back(std::make_tuple(_tablet->tablet_id(), start, before_end));
923+
if (d->isEmpty()) {
924+
continue;
925+
}
926+
new_delete_bitmap->set(end, *d);
927+
}
928+
}
929+
}
930+
903931
Status CompactionMixin::construct_output_rowset_writer(RowsetWriterContext& ctx) {
904932
// only do index compaction for dup_keys and unique_keys with mow enabled
905933
if (config::inverted_index_compaction_enable &&

be/src/olap/compaction.h

+6
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ class Compaction {
8383

8484
int64_t merge_way_num();
8585

86+
void agg_and_remove_old_version_delete_bitmap(
87+
std::vector<RowsetSharedPtr>& pre_rowsets,
88+
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>&
89+
to_remove_vec,
90+
DeleteBitmapPtr& new_delete_bitmap);
91+
8692
// the root tracker for this compaction
8793
std::shared_ptr<MemTrackerLimiter> _mem_tracker;
8894

be/src/olap/cumulative_compaction.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ Status CumulativeCompaction::execute_compact() {
124124
_output_rowset->num_segments() == 0)) {
125125
tablet()->set_last_cumu_compaction_success_time(UnixMillis());
126126
}
127+
if (_tablet->keys_type() == KeysType::UNIQUE_KEYS &&
128+
_tablet->enable_unique_key_merge_on_write() && _input_rowsets.size() != 1) {
129+
process_old_version_delete_bitmap();
130+
}
127131
DorisMetrics::instance()->cumulative_compaction_deltas_total->increment(_input_rowsets.size());
128132
DorisMetrics::instance()->cumulative_compaction_bytes_total->increment(_input_rowsets_size);
129133

@@ -219,4 +223,34 @@ Status CumulativeCompaction::pick_rowsets_to_compact() {
219223
return Status::OK();
220224
}
221225

226+
void CumulativeCompaction::process_old_version_delete_bitmap() {
227+
std::vector<RowsetSharedPtr> pre_rowsets {};
228+
for (const auto& it : tablet()->rowset_map()) {
229+
if (it.first.second < _input_rowsets.front()->start_version()) {
230+
pre_rowsets.emplace_back(it.second);
231+
}
232+
}
233+
std::sort(pre_rowsets.begin(), pre_rowsets.end(), Rowset::comparator);
234+
if (!pre_rowsets.empty()) {
235+
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>
236+
to_remove_vec;
237+
DeleteBitmapPtr new_delete_bitmap = nullptr;
238+
agg_and_remove_old_version_delete_bitmap(pre_rowsets, to_remove_vec, new_delete_bitmap);
239+
if (!new_delete_bitmap->empty()) {
240+
// store agg delete bitmap
241+
Version version(_input_rowsets.front()->start_version(),
242+
_input_rowsets.back()->end_version());
243+
for (auto it = new_delete_bitmap->delete_bitmap.begin();
244+
it != new_delete_bitmap->delete_bitmap.end(); it++) {
245+
_tablet->tablet_meta()->delete_bitmap().set(it->first, it->second);
246+
}
247+
_tablet->tablet_meta()->delete_bitmap().add_to_remove_queue(version.to_string(),
248+
to_remove_vec);
249+
DBUG_EXECUTE_IF("CumulativeCompaction.modify_rowsets.delete_expired_stale_rowsets", {
250+
static_cast<Tablet*>(_tablet.get())->delete_expired_stale_rowset();
251+
});
252+
}
253+
}
254+
}
255+
222256
} // namespace doris

be/src/olap/cumulative_compaction.h

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class CumulativeCompaction final : public CompactionMixin {
4747
void find_longest_consecutive_version(std::vector<RowsetSharedPtr>* rowsets,
4848
std::vector<Version>* missing_version);
4949

50+
void process_old_version_delete_bitmap();
51+
5052
Version _last_delete_version {-1, -1};
5153
};
5254

be/src/olap/tablet.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -796,10 +796,13 @@ void Tablet::delete_expired_stale_rowset() {
796796
auto old_meta_size = _tablet_meta->all_stale_rs_metas().size();
797797

798798
// do delete operation
799+
std::vector<std::string> version_to_delete;
799800
auto to_delete_iter = stale_version_path_map.begin();
800801
while (to_delete_iter != stale_version_path_map.end()) {
801802
std::vector<TimestampedVersionSharedPtr>& to_delete_version =
802803
to_delete_iter->second->timestamped_versions();
804+
int start_version = -1;
805+
int end_version = -1;
803806
for (auto& timestampedVersion : to_delete_version) {
804807
auto it = _stale_rs_version_map.find(timestampedVersion->version());
805808
if (it != _stale_rs_version_map.end()) {
@@ -820,10 +823,17 @@ void Tablet::delete_expired_stale_rowset() {
820823
<< timestampedVersion->version().second
821824
<< "] not find in stale rs version map";
822825
}
826+
if (start_version < 0) {
827+
start_version = timestampedVersion->version().first;
828+
}
829+
end_version = timestampedVersion->version().second;
823830
_delete_stale_rowset_by_version(timestampedVersion->version());
824831
}
832+
Version version(start_version, end_version);
833+
version_to_delete.emplace_back(version.to_string());
825834
to_delete_iter++;
826835
}
836+
_tablet_meta->delete_bitmap().remove_stale_delete_bitmap_from_queue(version_to_delete);
827837

828838
bool reconstructed = _reconstruct_version_tracker_if_necessary();
829839

be/src/olap/tablet_meta.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@ void DeleteBitmap::remove_stale_delete_bitmap_from_queue(const std::vector<std::
12081208
_stale_delete_bitmap.erase(version_str);
12091209
}
12101210
}
1211-
if (tablet_id == -1 || to_delete.empty()) {
1211+
if (tablet_id == -1 || to_delete.empty() || !config::is_cloud_mode()) {
12121212
return;
12131213
}
12141214
CloudStorageEngine& engine = ExecEnv::GetInstance()->storage_engine().to_cloud();

be/src/service/http_service.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include <vector>
2626

2727
#include "cloud/cloud_compaction_action.h"
28-
#include "cloud/cloud_delete_bitmap_action.h"
2928
#include "cloud/config.h"
3029
#include "cloud/injection_point_action.h"
3130
#include "common/config.h"
@@ -42,6 +41,7 @@
4241
#include "http/action/compaction_score_action.h"
4342
#include "http/action/config_action.h"
4443
#include "http/action/debug_point_action.h"
44+
#include "http/action/delete_bitmap_action.h"
4545
#include "http/action/download_action.h"
4646
#include "http/action/download_binlog_action.h"
4747
#include "http/action/file_cache_action.h"
@@ -364,6 +364,13 @@ void HttpService::register_local_handler(StorageEngine& engine) {
364364

365365
_ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
366366
run_status_compaction_action);
367+
368+
DeleteBitmapAction* count_delete_bitmap_action =
369+
_pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
370+
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
371+
_ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count",
372+
count_delete_bitmap_action);
373+
367374
CheckTabletSegmentAction* check_tablet_segment_action = _pool.add(new CheckTabletSegmentAction(
368375
_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
369376
_ev_http_server->register_handler(HttpMethod::POST, "/api/check_tablet_segment_lost",
@@ -412,9 +419,9 @@ void HttpService::register_cloud_handler(CloudStorageEngine& engine) {
412419
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
413420
_ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
414421
run_status_compaction_action);
415-
CloudDeleteBitmapAction* count_delete_bitmap_action =
416-
_pool.add(new CloudDeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
417-
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
422+
DeleteBitmapAction* count_delete_bitmap_action =
423+
_pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
424+
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
418425
_ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count",
419426
count_delete_bitmap_action);
420427
#ifdef ENABLE_INJECTION_POINT

0 commit comments

Comments
 (0)