diff --git a/weed/remote_storage/azure/azure_storage_client.go b/weed/remote_storage/azure/azure_storage_client.go index b657b5777..6034add09 100644 --- a/weed/remote_storage/azure/azure_storage_client.go +++ b/weed/remote_storage/azure/azure_storage_client.go @@ -7,7 +7,10 @@ import ( "os" "reflect" "strings" + "time" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" @@ -57,7 +60,16 @@ func (s azureRemoteStorageMaker) Make(conf *remote_pb.RemoteConf) (remote_storag } serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName) - azClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, credential, nil) + azClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, credential, &azblob.ClientOptions{ + ClientOptions: azcore.ClientOptions{ + Retry: policy.RetryOptions{ + MaxRetries: 10, // Increased from default 3 to maintain resiliency similar to old SDK's 20 + TryTimeout: time.Minute, + RetryDelay: 2 * time.Second, + MaxRetryDelay: time.Minute, + }, + }, + }) if err != nil { return nil, fmt.Errorf("failed to create Azure client: %v", err) } diff --git a/weed/replication/sink/azuresink/azure_sink.go b/weed/replication/sink/azuresink/azure_sink.go index 13e4c9f30..90d901c76 100644 --- a/weed/replication/sink/azuresink/azure_sink.go +++ b/weed/replication/sink/azuresink/azure_sink.go @@ -135,13 +135,17 @@ func (g *AzureSink) CreateEntry(key string, entry *filer_pb.Entry, signatures [] }) if err != nil { - // Check if this is a precondition failed error (HTTP 412) - var respErr *azcore.ResponseError - if ok := errors.As(err, &respErr); ok && respErr.StatusCode == http.StatusPreconditionFailed { - glog.V(0).Infof("skip overwriting %s/%s: precondition failed", g.container, key) - return nil + if bloberror.HasCode(err, bloberror.BlobAlreadyExists) { + // Blob already exists, which is fine for an append blob - we can append to it + } else { + // Check if this is a precondition failed error (HTTP 412) + var respErr *azcore.ResponseError + if ok := errors.As(err, &respErr); ok && respErr.StatusCode == http.StatusPreconditionFailed { + glog.V(0).Infof("skip overwriting %s/%s: precondition failed", g.container, key) + return nil + } + return fmt.Errorf("azure create append blob %s/%s: %v", g.container, key, err) } - return fmt.Errorf("azure create append blob %s/%s: %v", g.container, key, err) } writeFunc := func(data []byte) error {