Skip to content

Commit b0e4cad

Browse files
authored
copy doesn't need this lock (#437)
1 parent 314d3a2 commit b0e4cad

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

cluster/calcium/copy.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,31 @@ func (c *Calcium) Copy(ctx context.Context, opts *types.CopyOptions) (chan *type
1515
if err := opts.Validate(); err != nil {
1616
return nil, logger.Err(ctx, err)
1717
}
18+
1819
ch := make(chan *types.CopyMessage)
1920
utils.SentryGo(func() {
2021
defer close(ch)
22+
2123
wg := sync.WaitGroup{}
2224
log.Infof(ctx, "[Copy] Copy %d workloads files", len(opts.Targets))
25+
2326
// workload one by one
2427
for id, paths := range opts.Targets {
2528
wg.Add(1)
29+
2630
utils.SentryGo(func(id string, paths []string) func() {
2731
return func() {
2832
defer wg.Done()
29-
if err := c.withWorkloadLocked(ctx, id, func(ctx context.Context, workload *types.Workload) error {
30-
for _, path := range paths {
31-
resp, name, err := workload.Engine.VirtualizationCopyFrom(ctx, workload.ID, path)
32-
ch <- makeCopyMessage(id, name, path, err, resp)
33-
}
34-
return nil
35-
}); err != nil {
33+
34+
workload, err := c.GetWorkload(ctx, id)
35+
if err != nil {
3636
ch <- makeCopyMessage(id, "", "", logger.Err(ctx, err), nil)
37+
return
38+
}
39+
40+
for _, path := range paths {
41+
resp, name, err := workload.Engine.VirtualizationCopyFrom(ctx, workload.ID, path)
42+
ch <- makeCopyMessage(id, name, path, err, resp)
3743
}
3844
}
3945
}(id, paths))

cluster/calcium/copy_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,16 @@ func TestCopy(t *testing.T) {
3737
store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil)
3838
c.store = store
3939
// failed by GetWorkload
40-
store.On("GetWorkloads", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once()
40+
store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once()
4141
ch, err := c.Copy(ctx, opts)
4242
assert.NoError(t, err)
4343
for r := range ch {
4444
assert.Error(t, r.Error)
4545
}
4646
workload := &types.Workload{ID: "cid"}
47-
workloads := []*types.Workload{workload}
4847
engine := &enginemocks.API{}
4948
workload.Engine = engine
50-
store.On("GetWorkloads", mock.Anything, mock.Anything).Return(workloads, nil)
49+
store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil)
5150
// failed by VirtualizationCopyFrom
5251
engine.On("VirtualizationCopyFrom", mock.Anything, mock.Anything, mock.Anything).Return(nil, "", types.ErrNilEngine).Twice()
5352
ch, err = c.Copy(ctx, opts)

0 commit comments

Comments
 (0)