From a284376f22e8540b72bb8a6771c0549f0aa87045 Mon Sep 17 00:00:00 2001 From: Wallace Date: Mon, 6 Sep 2021 18:44:58 +0800 Subject: [PATCH] import: fix upgrade bug for import_file (#10903) * fix upgrade bug Signed-off-by: Little-Wallace * fix lint Signed-off-by: Little-Wallace * add comment Signed-off-by: Little-Wallace --- components/sst_importer/src/import_file.rs | 28 ++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/components/sst_importer/src/import_file.rs b/components/sst_importer/src/import_file.rs index 1107db70f58..c9d7cb8f806 100644 --- a/components/sst_importer/src/import_file.rs +++ b/components/sst_importer/src/import_file.rs @@ -356,7 +356,7 @@ pub fn path_to_sst_meta>(path: P) -> Result { return Err(Error::InvalidSSTPath(path.to_owned())); } let elems: Vec<_> = file_name.trim_end_matches(SST_SUFFIX).split('_').collect(); - if elems.len() != 5 { + if elems.len() < 4 { return Err(Error::InvalidSSTPath(path.to_owned())); } @@ -366,7 +366,11 @@ pub fn path_to_sst_meta>(path: P) -> Result { meta.set_region_id(elems[1].parse()?); meta.mut_region_epoch().set_conf_ver(elems[2].parse()?); meta.mut_region_epoch().set_version(elems[3].parse()?); - meta.set_cf_name(elems[4].to_owned()); + if elems.len() > 4 { + // If we upgrade TiKV from 3.0.x to 4.0.x and higher version, we can not read cf_name from + // the file path, because TiKV 3.0.x does not encode cf_name to path. + meta.set_cf_name(elems[4].to_owned()); + } Ok(meta) } @@ -392,4 +396,24 @@ mod test { let new_meta = path_to_sst_meta(path).unwrap(); assert_eq!(meta, new_meta); } + + #[test] + fn test_path_to_sst_meta() { + let uuid = Uuid::new_v4(); + let mut meta = SstMeta::default(); + meta.set_uuid(uuid.as_bytes().to_vec()); + meta.set_region_id(1); + meta.mut_region_epoch().set_conf_ver(222); + meta.mut_region_epoch().set_version(333); + let path = PathBuf::from(format!( + "{}_{}_{}_{}{}", + UuidBuilder::from_slice(meta.get_uuid()).unwrap().build(), + meta.get_region_id(), + meta.get_region_epoch().get_conf_ver(), + meta.get_region_epoch().get_version(), + SST_SUFFIX, + )); + let new_meta = path_to_sst_meta(&path).unwrap(); + assert_eq!(meta, new_meta); + } }