Skip to content

Commit 7b900e0

Browse files
fix(hummock): fix gc delete keys incorrectly (#14751)
Signed-off-by: Little-Wallace <[email protected]>
1 parent 38785f7 commit 7b900e0

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

src/meta/src/hummock/manager/mod.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ impl HummockManager {
964964
Some(task) => task,
965965
};
966966

967-
let target_level_id = compact_task.input.target_level;
967+
let target_level_id = compact_task.input.target_level as u32;
968968

969969
let compression_algorithm = match compact_task.compression_algorithm.as_str() {
970970
"Lz4" => 1,
@@ -980,15 +980,12 @@ impl HummockManager {
980980
watermark,
981981
sorted_output_ssts: vec![],
982982
task_id,
983-
target_level: target_level_id as u32,
983+
target_level: target_level_id,
984984
// only gc delete keys in last level because there may be older version in more bottom
985985
// level.
986-
gc_delete_keys: target_level_id
987-
== current_version
988-
.get_compaction_group_levels(compaction_group_id)
989-
.levels
990-
.len()
991-
- 1,
986+
gc_delete_keys: current_version
987+
.get_compaction_group_levels(compaction_group_id)
988+
.is_last_level(target_level_id),
992989
base_level: compact_task.base_level as u32,
993990
task_status: TaskStatus::Pending as i32,
994991
compaction_group_id: group_config.group_id,

src/storage/hummock_sdk/src/compaction_group/hummock_version_ext.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,13 @@ impl Levels {
668668
&mut self.levels[level_idx - 1]
669669
}
670670

671+
pub fn is_last_level(&self, level_idx: u32) -> bool {
672+
self.levels
673+
.last()
674+
.as_ref()
675+
.map_or(false, |level| level.level_idx == level_idx)
676+
}
677+
671678
pub fn count_ssts(&self) -> usize {
672679
self.get_level0()
673680
.get_sub_levels()

src/storage/hummock_test/src/compactor_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1358,7 +1358,7 @@ pub(crate) mod tests {
13581358
.last()
13591359
.unwrap();
13601360
assert_eq!(1, output_level_info.table_infos.len());
1361-
assert_eq!(254, output_level_info.table_infos[0].total_key_count);
1361+
assert_eq!(252, output_level_info.table_infos[0].total_key_count);
13621362
}
13631363

13641364
type KeyValue = (FullKey<Vec<u8>>, HummockValue<Vec<u8>>);

src/stream/src/executor/over_window/general.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use risingwave_common::util::sort_util::OrderType;
3232
use risingwave_expr::window_function::{
3333
create_window_state, StateKey, WindowFuncCall, WindowStates,
3434
};
35+
use risingwave_storage::row_serde::row_serde_util::serialize_pk_with_vnode;
3536
use risingwave_storage::StateStore;
3637

3738
use super::over_partition::{
@@ -324,7 +325,8 @@ impl<S: StateStore> OverWindowExecutor<S> {
324325
}
325326

326327
// `input pk` => `Record`
327-
let mut key_change_update_buffer = BTreeMap::new();
328+
let mut key_change_update_buffer: BTreeMap<DefaultOrdered<OwnedRow>, Record<OwnedRow>> =
329+
BTreeMap::new();
328330
let mut chunk_builder =
329331
StreamChunkBuilder::new(this.chunk_size, this.info.schema.data_types());
330332

@@ -382,7 +384,15 @@ impl<S: StateStore> OverWindowExecutor<S> {
382384
yield chunk;
383385
}
384386
}
385-
_ => panic!("other cases should not exist"),
387+
(existed, record) => {
388+
let vnode = this.state_table.compute_vnode_by_pk(&key.pk);
389+
let raw_key = serialize_pk_with_vnode(
390+
&key.pk,
391+
this.state_table.pk_serde(),
392+
vnode,
393+
);
394+
panic!("other cases should not exist. raw_key: {:?}, existed: {:?}, new: {:?}", raw_key, existed, record);
395+
}
386396
}
387397
} else {
388398
key_change_update_buffer.insert(pk, record);

0 commit comments

Comments
 (0)