@@ -80,7 +80,10 @@ void AdaptiveRandomBucketState::init_partition(VOlapTablePartition* part) {
8080
8181 PartitionState state;
8282 state.partition_id = part->id ;
83- state.tablets .assign (part->indexes [0 ].tablets .begin (), part->indexes [0 ].tablets .end ());
83+ state.index_tablets .reserve (part->indexes .size ());
84+ for (const auto & index : part->indexes ) {
85+ state.index_tablets .emplace_back (index.tablets .begin (), index.tablets .end ());
86+ }
8487 state.local_bucket_seqs = part->local_bucket_seqs ;
8588
8689 auto it = std::find (state.local_bucket_seqs .begin (), state.local_bucket_seqs .end (),
@@ -89,12 +92,13 @@ void AdaptiveRandomBucketState::init_partition(VOlapTablePartition* part) {
8992 state.seq_pos = static_cast <int32_t >(it - state.local_bucket_seqs .begin ());
9093 }
9194 int32_t current_bucket = state.local_bucket_seqs [state.seq_pos ];
92- state.current_tablet_id = state.tablets [current_bucket];
9395
94- for (const auto & index : part->indexes ) {
96+ for (int32_t index_idx = 0 ; index_idx < part->indexes .size (); ++index_idx) {
97+ const auto & index = part->indexes [index_idx];
9598 for (int32_t bucket = 0 ; bucket < index.tablets .size (); ++bucket) {
9699 _tablet_to_partition[index.tablets [bucket]] = part->id ;
97100 _tablet_to_bucket[index.tablets [bucket]] = bucket;
101+ _tablet_to_index[index.tablets [bucket]] = index_idx;
98102 }
99103 }
100104 _partition_states.emplace (part->id , std::move (state));
@@ -113,6 +117,25 @@ int64_t AdaptiveRandomBucketState::current_bucket(int64_t partition_id) {
113117 return it->second .local_bucket_seqs [it->second .seq_pos ];
114118}
115119
120+ int64_t AdaptiveRandomBucketState::current_tablet_by_tablet (int64_t tablet_id) {
121+ std::lock_guard<std::mutex> lock (_mutex);
122+ auto partition_it = _tablet_to_partition.find (tablet_id);
123+ if (partition_it == _tablet_to_partition.end ()) {
124+ return tablet_id;
125+ }
126+ auto state_it = _partition_states.find (partition_it->second );
127+ if (state_it == _partition_states.end ()) {
128+ return tablet_id;
129+ }
130+ auto index_it = _tablet_to_index.find (tablet_id);
131+ if (index_it == _tablet_to_index.end ()) {
132+ return tablet_id;
133+ }
134+ auto & state = state_it->second ;
135+ int32_t current_bucket = state.local_bucket_seqs [state.seq_pos ];
136+ return state.index_tablets [index_it->second ][current_bucket];
137+ }
138+
116139void AdaptiveRandomBucketState::rotate_by_tablet (int64_t tablet_id) {
117140 if (!config::enable_adaptive_random_bucket_load_bucket_rotation) {
118141 return ;
@@ -142,7 +165,6 @@ void AdaptiveRandomBucketState::rotate_by_tablet(int64_t tablet_id) {
142165 << " shared rotate bucket " << current_bucket << " -> " << next_bucket
143166 << " after tablet=" << tablet_id << " memtable flushed" ;
144167 state.seq_pos = next_pos;
145- state.current_tablet_id = state.tablets [next_bucket];
146168}
147169
148170// Computes local_bucket_seqs for a random-distribution partition and updates
0 commit comments