@@ -79,6 +79,8 @@ func (cr *Cluster) ossSyncFiles(ctx context.Context, files []FileInfo) error {
79
79
logInfof ("Starting sync files, count: %d, total: %s" , fl , bytesToUnit (stats .totalsize ))
80
80
start := time .Now ()
81
81
82
+ done := make (chan struct {}, 1 )
83
+
82
84
for _ , f := range missing {
83
85
logDebugf ("File %s is for %v" , f .Hash , f .targets )
84
86
pathRes , err := cr .fetchFile (ctx , & stats , f .FileInfo )
@@ -87,15 +89,35 @@ func (cr *Cluster) ossSyncFiles(ctx context.Context, files []FileInfo) error {
87
89
return err
88
90
}
89
91
go func (f * fileInfoWithTargets ) {
92
+ defer func () {
93
+ done <- struct {}{}
94
+ }()
90
95
select {
91
96
case path := <- pathRes :
92
97
if path != "" {
93
98
defer os .Remove (path )
99
+ var srcFd * os.File
100
+ if srcFd , err = os .Open (path ); err != nil {
101
+ return
102
+ }
103
+ defer srcFd .Close ()
94
104
relpath := hashToFilename (f .Hash )
95
105
for _ , target := range f .targets {
96
106
target = filepath .Join (target , relpath )
97
- if err := copyFile (path , target , 0644 ); err != nil {
98
- logErrorf ("Could not copy file %q to %q:\n \t %v" , path , target , err )
107
+ dstFd , err := os .OpenFile (target , os .O_WRONLY | os .O_CREATE | os .O_TRUNC , 0644 )
108
+ if err != nil {
109
+ logErrorf ("Could not create %q: %v" , target , err )
110
+ continue
111
+ }
112
+ if _ , err = srcFd .Seek (0 , io .SeekStart ); err != nil {
113
+ logErrorf ("Could not seek file %q: %v" , path , err )
114
+ continue
115
+ }
116
+ _ , err = io .Copy (dstFd , srcFd )
117
+ dstFd .Close ()
118
+ if err != nil {
119
+ logErrorf ("Could not copy from %q to %q:\n \t %v" , path , target , err )
120
+ continue
99
121
}
100
122
}
101
123
}
@@ -106,7 +128,7 @@ func (cr *Cluster) ossSyncFiles(ctx context.Context, files []FileInfo) error {
106
128
}
107
129
for i := cap (stats .slots ); i > 0 ; i -- {
108
130
select {
109
- case <- stats . slots :
131
+ case <- done :
110
132
case <- ctx .Done ():
111
133
logWarn ("File sync interrupted" )
112
134
return ctx .Err ()
0 commit comments