@@ -1185,17 +1185,18 @@ func OnBackupResponse(
11851185 backupTS uint64 ,
11861186 lockResolver * txnlock.LockResolver ,
11871187 resp * backuppb.BackupResponse ,
1188+ errContext * utils.ErrorContext ,
11881189) (* backuppb.BackupResponse , int , error ) {
11891190 log .Debug ("OnBackupResponse" , zap .Reflect ("resp" , resp ))
11901191 if resp .Error == nil {
11911192 return resp , 0 , nil
11921193 }
11931194 backoffMs := 0
1194- switch v := resp .Error .Detail .(type ) {
1195+
1196+ err := resp .Error
1197+ switch v := err .Detail .(type ) {
11951198 case * backuppb.Error_KvError :
11961199 if lockErr := v .KvError .Locked ; lockErr != nil {
1197- // Try to resolve lock.
1198- log .Warn ("backup occur kv error" , zap .Reflect ("error" , v ))
11991200 msBeforeExpired , err1 := lockResolver .ResolveLocks (
12001201 bo , backupTS , []* txnlock.Lock {txnlock .NewLock (lockErr )})
12011202 if err1 != nil {
@@ -1206,44 +1207,16 @@ func OnBackupResponse(
12061207 }
12071208 return nil , backoffMs , nil
12081209 }
1209- // Backup should not meet error other than KeyLocked.
1210- log .Error ("unexpect kv error" , zap .Reflect ("KvError" , v .KvError ))
1211- return nil , backoffMs , errors .Annotatef (berrors .ErrKVUnknown , "storeID: %d OnBackupResponse error %v" , storeID , v )
1212-
1213- case * backuppb.Error_RegionError :
1214- regionErr := v .RegionError
1215- // Ignore following errors.
1216- if ! (regionErr .EpochNotMatch != nil ||
1217- regionErr .NotLeader != nil ||
1218- regionErr .RegionNotFound != nil ||
1219- regionErr .ServerIsBusy != nil ||
1220- regionErr .StaleCommand != nil ||
1221- regionErr .StoreNotMatch != nil ||
1222- regionErr .ReadIndexNotReady != nil ||
1223- regionErr .ProposalInMergingMode != nil ) {
1224- log .Error ("unexpect region error" , zap .Reflect ("RegionError" , regionErr ))
1225- return nil , backoffMs , errors .Annotatef (berrors .ErrKVUnknown , "storeID: %d OnBackupResponse error %v" , storeID , v )
1226- }
1227- log .Warn ("backup occur region error" ,
1228- zap .Reflect ("RegionError" , regionErr ),
1229- zap .Uint64 ("storeID" , storeID ))
1230- // TODO: a better backoff.
1231- backoffMs = 1000 /* 1s */
1232- return nil , backoffMs , nil
1233- case * backuppb.Error_ClusterIdError :
1234- log .Error ("backup occur cluster ID error" , zap .Reflect ("error" , v ), zap .Uint64 ("storeID" , storeID ))
1235- return nil , 0 , errors .Annotatef (berrors .ErrKVClusterIDMismatch , "%v on storeID: %d" , resp .Error , storeID )
12361210 default :
1237- // UNSAFE! TODO: use meaningful error code instead of unstructured message to find failed to write error.
1238- if utils . MessageIsRetryableStorageError ( resp . GetError (). GetMsg ()) {
1239- log . Warn ( "backup occur storage error" , zap . String ( "error" , resp . GetError (). GetMsg ()))
1240- // back off 3000ms, for S3 is 99.99% available (i.e. the max outage time would less than 52.56mins per year),
1241- // this time would be probably enough for s3 to resume.
1211+ res := errContext . HandleError ( resp . Error , storeID )
1212+ switch res . Strategy {
1213+ case utils . GiveUpStrategy :
1214+ return nil , 0 , errors . Annotatef ( berrors . ErrKVUnknown , "storeID: %d OnBackupResponse error %s" , storeID , res . Reason )
1215+ case utils . RetryStrategy :
12421216 return nil , 3000 , nil
12431217 }
1244- log .Error ("backup occur unknown error" , zap .String ("error" , resp .Error .GetMsg ()), zap .Uint64 ("storeID" , storeID ))
1245- return nil , 0 , errors .Annotatef (berrors .ErrKVUnknown , "%v on storeID: %d" , resp .Error , storeID )
12461218 }
1219+ return nil , 3000 , errors .Annotatef (berrors .ErrKVUnknown , "unreachable" )
12471220}
12481221
12491222func (bc * Client ) handleFineGrained (
@@ -1273,12 +1246,13 @@ func (bc *Client) handleFineGrained(
12731246 }
12741247 hasProgress := false
12751248 backoffMill := 0
1249+ errContext := utils .NewErrorContext ("handleFineGrainedBackup" , 10 )
12761250 err = SendBackup (
12771251 ctx , storeID , client , req ,
12781252 // Handle responses with the same backoffer.
12791253 func (resp * backuppb.BackupResponse ) error {
12801254 response , shouldBackoff , err1 :=
1281- OnBackupResponse (storeID , bo , req .EndVersion , lockResolver , resp )
1255+ OnBackupResponse (storeID , bo , req .EndVersion , lockResolver , resp , errContext )
12821256 if err1 != nil {
12831257 return err1
12841258 }
0 commit comments