@@ -111,6 +111,7 @@ use databend_common_meta_app::schema::TableIdToName;
111111use databend_common_meta_app:: schema:: TableIdent ;
112112use databend_common_meta_app:: schema:: TableIndexType ;
113113use databend_common_meta_app:: schema:: TableInfo ;
114+ use databend_common_meta_app:: schema:: TableLvtCheck ;
114115use databend_common_meta_app:: schema:: TableMeta ;
115116use databend_common_meta_app:: schema:: TableNameIdent ;
116117use databend_common_meta_app:: schema:: TableStatistics ;
@@ -1463,25 +1464,25 @@ impl SchemaApiTestSuite {
14631464
14641465 let lvt_name_ident = LeastVisibleTimeIdent :: new ( & tenant, table_id) ;
14651466
1466- let res = mt. get_pb ( & lvt_name_ident) . await ?;
1467+ let res = mt. get_table_lvt ( & lvt_name_ident) . await ?;
14671468 assert ! ( res. is_none( ) ) ;
14681469
14691470 let res = mt. set_table_lvt ( & lvt_name_ident, & lvt_big) . await ?;
14701471 assert_eq ! ( res. time, time_big) ;
1471- let res = mt. get_pb ( & lvt_name_ident) . await ?;
1472- assert_eq ! ( res. unwrap( ) . data . time, time_big) ;
1472+ let res = mt. get_table_lvt ( & lvt_name_ident) . await ?;
1473+ assert_eq ! ( res. unwrap( ) . time, time_big) ;
14731474
14741475 // test lvt never fall back
14751476
14761477 let res = mt. set_table_lvt ( & lvt_name_ident, & lvt_small) . await ?;
14771478 assert_eq ! ( res. time, time_big) ;
1478- let res = mt. get_pb ( & lvt_name_ident) . await ?;
1479- assert_eq ! ( res. unwrap( ) . data . time, time_big) ;
1479+ let res = mt. get_table_lvt ( & lvt_name_ident) . await ?;
1480+ assert_eq ! ( res. unwrap( ) . time, time_big) ;
14801481
14811482 let res = mt. set_table_lvt ( & lvt_name_ident, & lvt_bigger) . await ?;
14821483 assert_eq ! ( res. time, time_bigger) ;
1483- let res = mt. get_pb ( & lvt_name_ident) . await ?;
1484- assert_eq ! ( res. unwrap( ) . data . time, time_bigger) ;
1484+ let res = mt. get_table_lvt ( & lvt_name_ident) . await ?;
1485+ assert_eq ! ( res. unwrap( ) . time, time_bigger) ;
14851486 }
14861487
14871488 Ok ( ( ) )
@@ -2642,6 +2643,7 @@ impl SchemaApiTestSuite {
26422643 mt : & MT ,
26432644 ) -> anyhow:: Result < ( ) > {
26442645 let tenant_name = "tenant1" ;
2646+ let tenant = Tenant :: new_or_err ( tenant_name, func_name ! ( ) ) ?;
26452647 let db_name = "db1" ;
26462648 let tbl_name = "tb2" ;
26472649
@@ -2717,6 +2719,7 @@ impl SchemaApiTestSuite {
27172719 seq : MatchSeq :: Exact ( table_version) ,
27182720 new_table_meta : new_table_meta. clone ( ) ,
27192721 base_snapshot_location : None ,
2722+ lvt_check : None ,
27202723 } ;
27212724
27222725 mt. update_multi_table_meta ( UpdateMultiTableMetaReq {
@@ -2742,6 +2745,7 @@ impl SchemaApiTestSuite {
27422745 seq : MatchSeq :: Exact ( table_version + 1 ) ,
27432746 new_table_meta : new_table_meta. clone ( ) ,
27442747 base_snapshot_location : None ,
2748+ lvt_check : None ,
27452749 } ;
27462750 let res = mt
27472751 . update_multi_table_meta ( UpdateMultiTableMetaReq {
@@ -2768,6 +2772,7 @@ impl SchemaApiTestSuite {
27682772 seq : MatchSeq :: Exact ( table_version) ,
27692773 new_table_meta : new_table_meta. clone ( ) ,
27702774 base_snapshot_location : None ,
2775+ lvt_check : None ,
27712776 } ;
27722777 let res = mt
27732778 . update_multi_table_meta_with_sender (
@@ -2849,6 +2854,7 @@ impl SchemaApiTestSuite {
28492854 seq : MatchSeq :: Exact ( table_version) ,
28502855 new_table_meta : new_table_meta. clone ( ) ,
28512856 base_snapshot_location : None ,
2857+ lvt_check : None ,
28522858 } ;
28532859 mt. update_multi_table_meta ( UpdateMultiTableMetaReq {
28542860 update_table_metas : vec ! [ ( req, table. as_ref( ) . clone( ) ) ] ,
@@ -2899,6 +2905,7 @@ impl SchemaApiTestSuite {
28992905 seq : MatchSeq :: Exact ( table_version) ,
29002906 new_table_meta : new_table_meta. clone ( ) ,
29012907 base_snapshot_location : None ,
2908+ lvt_check : None ,
29022909 } ;
29032910 mt. update_multi_table_meta ( UpdateMultiTableMetaReq {
29042911 update_table_metas : vec ! [ ( req, table. as_ref( ) . clone( ) ) ] ,
@@ -2949,6 +2956,7 @@ impl SchemaApiTestSuite {
29492956 seq : MatchSeq :: Exact ( table_version) ,
29502957 new_table_meta : new_table_meta. clone ( ) ,
29512958 base_snapshot_location : None ,
2959+ lvt_check : None ,
29522960 } ;
29532961 let result = mt
29542962 . update_multi_table_meta ( UpdateMultiTableMetaReq {
@@ -2961,6 +2969,62 @@ impl SchemaApiTestSuite {
29612969 let err = ErrorCode :: from ( err) ;
29622970 assert_eq ! ( ErrorCode :: DUPLICATED_UPSERT_FILES , err. code( ) ) ;
29632971 }
2972+
2973+ info ! ( "--- update table meta, snapshot_ts must respect LVT" ) ;
2974+ {
2975+ let table = util. get_table ( ) . await . unwrap ( ) ;
2976+ let table_id = table. ident . table_id ;
2977+ let lvt_ident = LeastVisibleTimeIdent :: new ( & tenant, table_id) ;
2978+ let lvt_time = DateTime :: < Utc > :: from_timestamp ( 2_000 , 0 ) . unwrap ( ) ;
2979+ mt. set_table_lvt ( & lvt_ident, & LeastVisibleTime :: new ( lvt_time) )
2980+ . await ?;
2981+
2982+ // LVT was changed.
2983+ let mut new_table_meta = table. meta . clone ( ) ;
2984+ new_table_meta. comment = "lvt guard should fail" . to_string ( ) ;
2985+ let small_ts = DateTime :: < Utc > :: from_timestamp ( 1_000 , 0 ) . unwrap ( ) ;
2986+ let req = UpdateTableMetaReq {
2987+ table_id,
2988+ seq : MatchSeq :: Exact ( table. ident . seq ) ,
2989+ new_table_meta : new_table_meta. clone ( ) ,
2990+ base_snapshot_location : None ,
2991+ lvt_check : Some ( TableLvtCheck {
2992+ tenant : tenant. clone ( ) ,
2993+ lvt : LeastVisibleTime :: new ( small_ts) ,
2994+ } ) ,
2995+ } ;
2996+ let result = mt
2997+ . update_multi_table_meta ( UpdateMultiTableMetaReq {
2998+ update_table_metas : vec ! [ ( req, table. as_ref( ) . clone( ) ) ] ,
2999+ ..Default :: default ( )
3000+ } )
3001+ . await ;
3002+ assert ! ( result. is_err( ) ) ;
3003+
3004+ // LVT unchanged.
3005+ let table = util. get_table ( ) . await . unwrap ( ) ;
3006+ let mut ok_table_meta = table. meta . clone ( ) ;
3007+ ok_table_meta. comment = "lvt guard success" . to_string ( ) ;
3008+ let req = UpdateTableMetaReq {
3009+ table_id,
3010+ seq : MatchSeq :: Exact ( table. ident . seq ) ,
3011+ new_table_meta : ok_table_meta. clone ( ) ,
3012+ base_snapshot_location : None ,
3013+ lvt_check : Some ( TableLvtCheck {
3014+ tenant : tenant. clone ( ) ,
3015+ lvt : LeastVisibleTime :: new ( lvt_time) ,
3016+ } ) ,
3017+ } ;
3018+ mt. update_multi_table_meta ( UpdateMultiTableMetaReq {
3019+ update_table_metas : vec ! [ ( req, table. as_ref( ) . clone( ) ) ] ,
3020+ ..Default :: default ( )
3021+ } )
3022+ . await ?
3023+ . unwrap ( ) ;
3024+
3025+ let updated = util. get_table ( ) . await . unwrap ( ) ;
3026+ assert_eq ! ( updated. meta. comment, "lvt guard success" ) ;
3027+ }
29643028 }
29653029 Ok ( ( ) )
29663030 }
@@ -4302,6 +4366,7 @@ impl SchemaApiTestSuite {
43024366 seq : MatchSeq :: Any ,
43034367 new_table_meta : table_meta. clone ( ) ,
43044368 base_snapshot_location : None ,
4369+ lvt_check : None ,
43054370 } ;
43064371
43074372 let table = mt
@@ -4442,6 +4507,7 @@ impl SchemaApiTestSuite {
44424507 seq : MatchSeq :: Any ,
44434508 new_table_meta : create_table_meta. clone ( ) ,
44444509 base_snapshot_location : None ,
4510+ lvt_check : None ,
44454511 } ;
44464512
44474513 let table = mt
@@ -6239,6 +6305,7 @@ impl SchemaApiTestSuite {
62396305 seq : MatchSeq :: Any ,
62406306 new_table_meta : table_meta ( created_on) ,
62416307 base_snapshot_location : None ,
6308+ lvt_check : None ,
62426309 } ;
62436310
62446311 let table = mt
@@ -6290,6 +6357,7 @@ impl SchemaApiTestSuite {
62906357 seq : MatchSeq :: Any ,
62916358 new_table_meta : table_meta ( created_on) ,
62926359 base_snapshot_location : None ,
6360+ lvt_check : None ,
62936361 } ;
62946362
62956363 let table = mt
@@ -7803,6 +7871,7 @@ impl SchemaApiTestSuite {
78037871 seq : MatchSeq :: Any ,
78047872 new_table_meta : table_meta ( created_on) ,
78057873 base_snapshot_location : None ,
7874+ lvt_check : None ,
78067875 } ;
78077876
78087877 let table = mt
@@ -7862,6 +7931,7 @@ impl SchemaApiTestSuite {
78627931 seq : MatchSeq :: Any ,
78637932 new_table_meta : table_meta ( created_on) ,
78647933 base_snapshot_location : None ,
7934+ lvt_check : None ,
78657935 } ;
78667936
78677937 let table = mt
@@ -7918,6 +7988,7 @@ impl SchemaApiTestSuite {
79187988 seq : MatchSeq :: Any ,
79197989 new_table_meta : table_meta ( created_on) ,
79207990 base_snapshot_location : None ,
7991+ lvt_check : None ,
79217992 } ;
79227993
79237994 let table = mt
@@ -8372,6 +8443,7 @@ where MT: SchemaApi + kvapi::KVApi<Error = MetaError>
83728443 seq : MatchSeq :: Any ,
83738444 new_table_meta : self . table_meta ( ) ,
83748445 base_snapshot_location : None ,
8446+ lvt_check : None ,
83758447 } ;
83768448
83778449 let req = UpdateMultiTableMetaReq {
0 commit comments