Skip to content

Commit d9e5294

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

11 files changed

+140
-74
lines changed

be/src/cloud/cloud_cumulative_compaction.cpp

+2-25
Original file line numberDiff line numberDiff line change
@@ -371,40 +371,17 @@ Status CloudCumulativeCompaction::modify_rowsets() {
371371
Status CloudCumulativeCompaction::process_old_version_delete_bitmap() {
372372
// agg previously rowset old version delete bitmap
373373
std::vector<RowsetSharedPtr> pre_rowsets {};
374-
std::vector<std::string> pre_rowset_ids {};
375374
for (const auto& it : cloud_tablet()->rowset_map()) {
376375
if (it.first.second < _input_rowsets.front()->start_version()) {
377376
pre_rowsets.emplace_back(it.second);
378-
pre_rowset_ids.emplace_back(it.second->rowset_id().to_string());
379377
}
380378
}
381379
std::sort(pre_rowsets.begin(), pre_rowsets.end(), Rowset::comparator);
382380
if (!pre_rowsets.empty()) {
383-
auto pre_max_version = _output_rowset->version().second;
384-
DeleteBitmapPtr new_delete_bitmap =
385-
std::make_shared<DeleteBitmap>(_tablet->tablet_meta()->tablet_id());
386381
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>
387382
to_remove_vec;
388-
for (auto& rowset : pre_rowsets) {
389-
if (rowset->rowset_meta()->total_disk_size() == 0) {
390-
continue;
391-
}
392-
for (uint32_t seg_id = 0; seg_id < rowset->num_segments(); ++seg_id) {
393-
rowset->rowset_id().to_string();
394-
DeleteBitmap::BitmapKey start {rowset->rowset_id(), seg_id, 0};
395-
DeleteBitmap::BitmapKey end {rowset->rowset_id(), seg_id, pre_max_version};
396-
DeleteBitmap::BitmapKey before_end {rowset->rowset_id(), seg_id,
397-
pre_max_version - 1};
398-
auto d = _tablet->tablet_meta()->delete_bitmap().get_agg(
399-
{rowset->rowset_id(), seg_id, pre_max_version});
400-
to_remove_vec.emplace_back(
401-
std::make_tuple(_tablet->tablet_id(), start, before_end));
402-
if (d->isEmpty()) {
403-
continue;
404-
}
405-
new_delete_bitmap->set(end, *d);
406-
}
407-
}
383+
DeleteBitmapPtr new_delete_bitmap = nullptr;
384+
agg_and_remove_old_version_delete_bitmap(pre_rowsets, to_remove_vec, new_delete_bitmap);
408385
if (!new_delete_bitmap->empty()) {
409386
// store agg delete bitmap
410387
DBUG_EXECUTE_IF("CloudCumulativeCompaction.modify_rowsets.update_delete_bitmap_failed",

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
@@ -854,6 +854,34 @@ void Compaction::construct_index_compaction_columns(RowsetWriterContext& ctx) {
854854
}
855855
}
856856

857+
void Compaction::agg_and_remove_old_version_delete_bitmap(
858+
std::vector<RowsetSharedPtr>& pre_rowsets,
859+
std::vector<std::tuple<int64_t, DeleteBitmap::BitmapKey, DeleteBitmap::BitmapKey>>&
860+
to_remove_vec,
861+
DeleteBitmapPtr& new_delete_bitmap) {
862+
// agg previously rowset old version delete bitmap
863+
auto pre_max_version = _output_rowset->version().second;
864+
new_delete_bitmap = std::make_shared<DeleteBitmap>(_tablet->tablet_meta()->tablet_id());
865+
for (auto& rowset : pre_rowsets) {
866+
if (rowset->rowset_meta()->total_disk_size() == 0) {
867+
continue;
868+
}
869+
for (uint32_t seg_id = 0; seg_id < rowset->num_segments(); ++seg_id) {
870+
rowset->rowset_id().to_string();
871+
DeleteBitmap::BitmapKey start {rowset->rowset_id(), seg_id, 0};
872+
DeleteBitmap::BitmapKey end {rowset->rowset_id(), seg_id, pre_max_version};
873+
DeleteBitmap::BitmapKey before_end {rowset->rowset_id(), seg_id, pre_max_version - 1};
874+
auto d = _tablet->tablet_meta()->delete_bitmap().get_agg(
875+
{rowset->rowset_id(), seg_id, pre_max_version});
876+
to_remove_vec.emplace_back(std::make_tuple(_tablet->tablet_id(), start, before_end));
877+
if (d->isEmpty()) {
878+
continue;
879+
}
880+
new_delete_bitmap->set(end, *d);
881+
}
882+
}
883+
}
884+
857885
Status CompactionMixin::construct_output_rowset_writer(RowsetWriterContext& ctx) {
858886
// only do index compaction for dup_keys and unique_keys with mow enabled
859887
if (config::inverted_index_compaction_enable &&

be/src/olap/compaction.h

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ class Compaction {
8484

8585
int64_t merge_way_num();
8686

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

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(
129133
_input_rowsets_total_size);
@@ -220,4 +224,34 @@ Status CumulativeCompaction::pick_rowsets_to_compact() {
220224
return Status::OK();
221225
}
222226

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

819819
// do delete operation
820+
std::vector<std::string> version_to_delete;
820821
auto to_delete_iter = stale_version_path_map.begin();
821822
while (to_delete_iter != stale_version_path_map.end()) {
822823
std::vector<TimestampedVersionSharedPtr>& to_delete_version =
823824
to_delete_iter->second->timestamped_versions();
825+
int start_version = -1;
826+
int end_version = -1;
824827
for (auto& timestampedVersion : to_delete_version) {
825828
auto it = _stale_rs_version_map.find(timestampedVersion->version());
826829
if (it != _stale_rs_version_map.end()) {
@@ -841,10 +844,17 @@ void Tablet::delete_expired_stale_rowset() {
841844
<< timestampedVersion->version().second
842845
<< "] not find in stale rs version map";
843846
}
847+
if (start_version < 0) {
848+
start_version = timestampedVersion->version().first;
849+
}
850+
end_version = timestampedVersion->version().second;
844851
_delete_stale_rowset_by_version(timestampedVersion->version());
845852
}
853+
Version version(start_version, end_version);
854+
version_to_delete.emplace_back(version.to_string());
846855
to_delete_iter++;
847856
}
857+
_tablet_meta->delete_bitmap().remove_stale_delete_bitmap_from_queue(version_to_delete);
848858

849859
bool reconstructed = _reconstruct_version_tracker_if_necessary();
850860

be/src/olap/tablet_meta.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ void DeleteBitmap::remove_stale_delete_bitmap_from_queue(const std::vector<std::
12161216
_stale_delete_bitmap.erase(version_str);
12171217
}
12181218
}
1219-
if (tablet_id == -1 || to_delete.empty()) {
1219+
if (tablet_id == -1 || to_delete.empty() || !config::is_cloud_mode()) {
12201220
return;
12211221
}
12221222
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"
@@ -377,6 +377,13 @@ void HttpService::register_local_handler(StorageEngine& engine) {
377377

378378
_ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
379379
run_status_compaction_action);
380+
381+
DeleteBitmapAction* count_delete_bitmap_action =
382+
_pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
383+
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
384+
_ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count",
385+
count_delete_bitmap_action);
386+
380387
CheckTabletSegmentAction* check_tablet_segment_action = _pool.add(new CheckTabletSegmentAction(
381388
_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
382389
_ev_http_server->register_handler(HttpMethod::POST, "/api/check_tablet_segment_lost",
@@ -425,9 +432,9 @@ void HttpService::register_cloud_handler(CloudStorageEngine& engine) {
425432
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
426433
_ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
427434
run_status_compaction_action);
428-
CloudDeleteBitmapAction* count_delete_bitmap_action =
429-
_pool.add(new CloudDeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
430-
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
435+
DeleteBitmapAction* count_delete_bitmap_action =
436+
_pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_INFO, _env, engine,
437+
TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
431438
_ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count",
432439
count_delete_bitmap_action);
433440
#ifdef ENABLE_INJECTION_POINT

0 commit comments

Comments
 (0)