From 8ef9bd449913964c4ad086089f7e329a31457b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Villaf=C3=A1=C3=B1ez?= Date: Wed, 31 Jul 2024 11:30:54 +0200 Subject: [PATCH] fix: retry delete request if we get a "too_early" code --- .../pkg/connector/fileconnector.go | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/services/collaboration/pkg/connector/fileconnector.go b/services/collaboration/pkg/connector/fileconnector.go index 178e21c37..4b01a4c49 100644 --- a/services/collaboration/pkg/connector/fileconnector.go +++ b/services/collaboration/pkg/connector/fileconnector.go @@ -809,13 +809,37 @@ func (f *FileConnector) DeleteFile(ctx context.Context, lockID string) (string, Str("RequestedLockID", lockID). Logger() - deleteRes, err := f.gwc.Delete(ctx, &providerv1beta1.DeleteRequest{ + var deleteRes *providerv1beta1.DeleteResponse + deleteReq := &providerv1beta1.DeleteRequest{ Ref: wopiContext.FileReference, LockId: lockID, - }) - if err != nil { - logger.Error().Err(err).Msg("DeleteFile: stat failed") - return "", err + } + + // we'll retry the request after a while if we get a "TOO_EARLY" code + for retries := 0; deleteRes == nil || deleteRes.GetStatus().GetCode() == rpcv1beta1.Code_CODE_TOO_EARLY; retries++ { + deleteRes, err = f.gwc.Delete(ctx, deleteReq) + if err != nil { + logger.Error().Err(err).Msg("DeleteFile: stat failed") + return "", err + } + + if deleteRes.GetStatus().GetCode() == rpcv1beta1.Code_CODE_TOO_EARLY { + // starting from 20ms, double the waiting time for each retry + // capping at 5 secs + waitingTime := (20 * time.Millisecond) << retries + if waitingTime.Seconds() > 5 { + waitingTime = 5 * time.Second + } + + logger.Warn(). + Str("StatusCode", deleteRes.GetStatus().GetCode().String()). + Str("StatusMsg", deleteRes.GetStatus().GetMessage()). + Dur("WaitingTime", waitingTime). + Int("Retries", retries). + Msg("DeleteFile: file isn't ready yet. Retrying") + + time.Sleep(waitingTime) + } } if deleteRes.GetStatus().GetCode() != rpcv1beta1.Code_CODE_OK {