Skip to content

Commit 6296803

Browse files
Add size check before sync lfs file (#1045)
Co-authored-by: Zhang ZeHua <pulltheflower@163.com>
1 parent 20eee52 commit 6296803

2 files changed

Lines changed: 53 additions & 8 deletions

File tree

mirror/lfssyncer/lfs.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ func (w *LfsSyncWorker) getSyncPointers(
428428
var toBeUpdateLfsMetaObjects []database.LfsMetaObject
429429
for _, lfsMetaObject := range lfsMetaObjects {
430430
objectKey := common.BuildLfsPath(repo.ID, lfsMetaObject.Oid, repo.Migrated)
431-
exists, err := w.CheckIfLFSFileExists(ctx, objectKey)
431+
exists, err := w.CheckIfLFSFileExists(ctx, objectKey, lfsMetaObject.Size)
432432
if err != nil {
433433
slog.Error(
434434
"failed to check if lfs file exists",
@@ -567,7 +567,7 @@ func (w *LfsSyncWorker) downloadAndUploadLFSFile(
567567
) error {
568568
var uploadID string
569569
objectKey := common.BuildLfsPath(repo.ID, pointer.Oid, repo.Migrated)
570-
exists, err := w.CheckIfLFSFileExists(ctx, objectKey)
570+
exists, err := w.CheckIfLFSFileExists(ctx, objectKey, pointer.Size)
571571
if err != nil {
572572
slog.Error(
573573
"failed to check if lfs file exists",
@@ -1206,15 +1206,26 @@ func (w *LfsSyncWorker) downloadRange(
12061206
func (w *LfsSyncWorker) CheckIfLFSFileExists(
12071207
ctx context.Context,
12081208
objectKey string,
1209+
size int64,
12091210
) (bool, error) {
1210-
_, err := w.ossClient.StatObject(ctx, w.config.S3.Bucket, objectKey, minio.StatObjectOptions{})
1211+
objInfo, err := w.ossClient.StatObject(ctx, w.config.S3.Bucket, objectKey, minio.StatObjectOptions{})
12111212
if err != nil {
12121213
// Check if it's a "not found" error
12131214
if strings.Contains(err.Error(), "NoSuchKey") || strings.Contains(err.Error(), "not found") {
12141215
return false, nil
12151216
}
12161217
return false, err
12171218
}
1219+
1220+
// Check if the file size matches the expected size
1221+
if objInfo.Size != size {
1222+
// Delete the mismatched object
1223+
if err := w.ossClient.RemoveObject(ctx, w.config.S3.Bucket, objectKey, minio.RemoveObjectOptions{}); err != nil {
1224+
return false, fmt.Errorf("failed to remove mismatched object: %w", err)
1225+
}
1226+
return false, nil
1227+
}
1228+
12181229
return true, nil
12191230
}
12201231

mirror/lfssyncer/lfs_test.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,29 +544,60 @@ func (suite *LfsSyncWorkerTestSuite) TestGetSyncPointers() {
544544
}
545545

546546
func (suite *LfsSyncWorkerTestSuite) TestCheckIfLFSFileExists() {
547-
objectKey := "test-object-key"
547+
oid := "test-object-oid"
548548

549549
tests := []struct {
550550
name string
551551
statError error
552+
objectSize int64
553+
expectedSize int64
554+
expectDelete bool
555+
deleteError error
552556
expectedExists bool
553557
expectedError bool
554558
}{
555559
{
556-
name: "file exists",
560+
name: "file exists and size matches",
557561
statError: nil,
562+
objectSize: 1024,
563+
expectedSize: 1024,
564+
expectDelete: false,
558565
expectedExists: true,
559566
expectedError: false,
560567
},
568+
{
569+
name: "file exists but size mismatch",
570+
statError: nil,
571+
objectSize: 2048,
572+
expectedSize: 1024,
573+
expectDelete: true,
574+
deleteError: nil,
575+
expectedExists: false,
576+
expectedError: false,
577+
},
578+
{
579+
name: "file exists but size mismatch with delete error",
580+
statError: nil,
581+
objectSize: 2048,
582+
expectedSize: 1024,
583+
expectDelete: true,
584+
deleteError: errors.New("delete error"),
585+
expectedExists: false,
586+
expectedError: true,
587+
},
561588
{
562589
name: "file not found",
563590
statError: errors.New("NoSuchKey"),
591+
expectedSize: 1024,
592+
expectDelete: false,
564593
expectedExists: false,
565594
expectedError: false,
566595
},
567596
{
568597
name: "other error",
569598
statError: errors.New("network error"),
599+
expectedSize: 1024,
600+
expectDelete: false,
570601
expectedExists: false,
571602
expectedError: true,
572603
},
@@ -578,12 +609,15 @@ func (suite *LfsSyncWorkerTestSuite) TestCheckIfLFSFileExists() {
578609
worker, mocks := newTestLfsSyncWorker(t, "")
579610

580611
if tt.statError == nil {
581-
mocks.ossClient.EXPECT().StatObject(suite.ctx, worker.config.S3.Bucket, objectKey, mock.Anything).Return(minio.ObjectInfo{}, nil)
612+
mocks.ossClient.EXPECT().StatObject(suite.ctx, worker.config.S3.Bucket, oid, mock.Anything).Return(minio.ObjectInfo{Size: tt.objectSize}, nil)
613+
if tt.expectDelete {
614+
mocks.ossClient.EXPECT().RemoveObject(suite.ctx, worker.config.S3.Bucket, oid, mock.Anything).Return(tt.deleteError)
615+
}
582616
} else {
583-
mocks.ossClient.EXPECT().StatObject(suite.ctx, worker.config.S3.Bucket, objectKey, mock.Anything).Return(minio.ObjectInfo{}, tt.statError)
617+
mocks.ossClient.EXPECT().StatObject(suite.ctx, worker.config.S3.Bucket, oid, mock.Anything).Return(minio.ObjectInfo{}, tt.statError)
584618
}
585619

586-
exists, err := worker.CheckIfLFSFileExists(suite.ctx, objectKey)
620+
exists, err := worker.CheckIfLFSFileExists(suite.ctx, oid, tt.expectedSize)
587621

588622
if tt.expectedError {
589623
assert.Error(t, err)

0 commit comments

Comments
 (0)