diff --git a/cmd/bucket-replication.go b/cmd/bucket-replication.go index 331c2f430..24c7547fd 100644 --- a/cmd/bucket-replication.go +++ b/cmd/bucket-replication.go @@ -802,10 +802,12 @@ func getReplicationAction(oi1 ObjectInfo, oi2 minio.ObjectInfo, opType replicati oi1.ModTime.Unix() > oi2.LastModified.Unix() && oi1.VersionID == nullVersionID { return replicateNone } + sz, _ := oi1.GetActualSize() + // needs full replication if oi1.ETag != oi2.ETag || oi1.VersionID != oi2.VersionID || - oi1.Size != oi2.Size || + sz != oi2.Size || oi1.DeleteMarker != oi2.IsDeleteMarker || oi1.ModTime.Unix() != oi2.LastModified.Unix() { return replicateAll @@ -1202,12 +1204,6 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object ReplicationAction: rAction, } - if ri.ObjectInfo.TargetReplicationStatus(tgt.ARN) == replication.Completed && !ri.ExistingObjResync.Empty() && !ri.ExistingObjResync.mustResyncTarget(tgt.ARN) { - rinfo.ReplicationStatus = replication.Completed - rinfo.ReplicationResynced = true - return - } - if globalBucketTargetSys.isOffline(tgt.EndpointURL()) { logger.LogIf(ctx, fmt.Errorf("remote target is offline for bucket:%s arn:%s", bucket, tgt.ARN)) sendEvent(eventArgs{ @@ -1243,6 +1239,13 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object objInfo = gr.ObjInfo + // use latest ObjectInfo to check if previous replication attempt succeeded + if objInfo.TargetReplicationStatus(tgt.ARN) == replication.Completed && !ri.ExistingObjResync.Empty() && !ri.ExistingObjResync.mustResyncTarget(tgt.ARN) { + rinfo.ReplicationStatus = replication.Completed + rinfo.ReplicationResynced = true + return + } + size, err := objInfo.GetActualSize() if err != nil { logger.LogIf(ctx, err) @@ -1256,7 +1259,7 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object } if tgt.Bucket == "" { - logger.LogIf(ctx, fmt.Errorf("Unable to replicate object %s(%s), bucket is empty", objInfo.Name, objInfo.VersionID)) + logger.LogIf(ctx, fmt.Errorf("unable to replicate object %s(%s), bucket is empty", objInfo.Name, objInfo.VersionID)) sendEvent(eventArgs{ EventName: event.ObjectReplicationNotTracked, BucketName: bucket, @@ -1286,7 +1289,7 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object if rAction == replicateNone { if ri.OpType == replication.ExistingObjectReplicationType && objInfo.ModTime.Unix() > oi.LastModified.Unix() && objInfo.VersionID == nullVersionID { - logger.LogIf(ctx, fmt.Errorf("Unable to replicate %s/%s (null). Newer version exists on target", bucket, object)) + logger.LogIf(ctx, fmt.Errorf("unable to replicate %s/%s (null). Newer version exists on target", bucket, object)) sendEvent(eventArgs{ EventName: event.ObjectReplicationNotTracked, BucketName: bucket, @@ -1328,7 +1331,7 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object } if _, err = c.CopyObject(ctx, tgt.Bucket, object, tgt.Bucket, object, getCopyObjMetadata(objInfo, tgt.StorageClass), srcOpts, dstOpts); err != nil { rinfo.ReplicationStatus = replication.Failed - logger.LogIf(ctx, fmt.Errorf("Unable to replicate metadata for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) + logger.LogIf(ctx, fmt.Errorf("unable to replicate metadata for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) } } else { var putOpts minio.PutObjectOptions @@ -1365,7 +1368,7 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object r, objInfo, putOpts); err != nil { if minio.ToErrorResponse(err).Code != "PreconditionFailed" { rinfo.ReplicationStatus = replication.Failed - logger.LogIf(ctx, fmt.Errorf("Unable to replicate for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) + logger.LogIf(ctx, fmt.Errorf("unable to replicate for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) } else { rinfo.ReplicationStatus = replication.Completed } @@ -1374,7 +1377,7 @@ func (ri ReplicateObjectInfo) replicateAll(ctx context.Context, objectAPI Object if _, err = c.PutObject(ctx, tgt.Bucket, object, r, size, "", "", putOpts); err != nil { if minio.ToErrorResponse(err).Code != "PreconditionFailed" { rinfo.ReplicationStatus = replication.Failed - logger.LogIf(ctx, fmt.Errorf("Unable to replicate for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) + logger.LogIf(ctx, fmt.Errorf("unable to replicate for object %s/%s(%s): %s", bucket, objInfo.Name, objInfo.VersionID, err)) } else { rinfo.ReplicationStatus = replication.Completed }