@@ -66,15 +66,17 @@ mod test {
66
66
use crate :: {
67
67
mock:: { MockKvClient , MockPdClient } ,
68
68
store:: store_stream_for_keys,
69
+ transaction:: lowering:: new_commit_request,
69
70
Error , Key , Result ,
70
71
} ;
71
72
use futures:: executor;
72
73
use grpcio:: CallOption ;
73
74
use std:: {
74
75
any:: Any ,
76
+ iter,
75
77
sync:: { Arc , Mutex } ,
76
78
} ;
77
- use tikv_client_proto:: { kvrpcpb, tikvpb:: TikvClient } ;
79
+ use tikv_client_proto:: { kvrpcpb, pdpb :: Timestamp , tikvpb:: TikvClient } ;
78
80
use tikv_client_store:: HasRegionError ;
79
81
80
82
#[ test]
@@ -174,4 +176,47 @@ mod test {
174
176
// Original call plus the 3 retries
175
177
assert_eq ! ( * invoking_count. lock( ) . unwrap( ) , 4 ) ;
176
178
}
179
+
180
+ #[ test]
181
+ fn test_extract_error ( ) {
182
+ let pd_client = Arc :: new ( MockPdClient :: new ( MockKvClient :: with_dispatch_hook (
183
+ |_: & dyn Any | {
184
+ Ok ( Box :: new ( kvrpcpb:: CommitResponse {
185
+ region_error : None ,
186
+ error : Some ( kvrpcpb:: KeyError {
187
+ locked : None ,
188
+ retryable : String :: new ( ) ,
189
+ abort : String :: new ( ) ,
190
+ conflict : None ,
191
+ already_exist : None ,
192
+ deadlock : None ,
193
+ commit_ts_expired : None ,
194
+ txn_not_found : None ,
195
+ commit_ts_too_large : None ,
196
+ } ) ,
197
+ commit_version : 0 ,
198
+ } ) as Box < dyn Any > )
199
+ } ,
200
+ ) ) ) ;
201
+
202
+ let key: Key = "key" . to_owned ( ) . into ( ) ;
203
+ let req = new_commit_request ( iter:: once ( key) , Timestamp :: default ( ) , Timestamp :: default ( ) ) ;
204
+
205
+ // does not extract error
206
+ let plan = crate :: request:: PlanBuilder :: new ( pd_client. clone ( ) , req. clone ( ) )
207
+ . resolve_lock ( OPTIMISTIC_BACKOFF )
208
+ . multi_region ( )
209
+ . retry_region ( OPTIMISTIC_BACKOFF )
210
+ . plan ( ) ;
211
+ assert ! ( executor:: block_on( async { plan. execute( ) . await } ) . is_ok( ) ) ;
212
+
213
+ // extract error
214
+ let plan = crate :: request:: PlanBuilder :: new ( pd_client. clone ( ) , req)
215
+ . resolve_lock ( OPTIMISTIC_BACKOFF )
216
+ . multi_region ( )
217
+ . retry_region ( OPTIMISTIC_BACKOFF )
218
+ . extract_error ( )
219
+ . plan ( ) ;
220
+ assert ! ( executor:: block_on( async { plan. execute( ) . await } ) . is_err( ) ) ;
221
+ }
177
222
}
0 commit comments