fix: grpc download tidy file error (#1697)

Signed-off-by: Jim Ma <majinjing3@gmail.com>
This commit is contained in:
Jim Ma 2022-09-22 10:38:53 +08:00 committed by Gaius
parent cb55b1d809
commit c5f4ca50fa
No known key found for this signature in database
GPG Key ID: 8B4E5D1290FA2FFB
4 changed files with 11 additions and 33 deletions

View File

@ -48,7 +48,7 @@ type TaskManager interface {
// return a progress channel for request download progress // return a progress channel for request download progress
// tiny stands task file is tiny and task is done // tiny stands task file is tiny and task is done
StartFileTask(ctx context.Context, req *FileTaskRequest) ( StartFileTask(ctx context.Context, req *FileTaskRequest) (
progress chan *FileTaskProgress, tiny *TinyData, err error) progress chan *FileTaskProgress, err error)
// StartStreamTask starts a peer task with stream io // StartStreamTask starts a peer task with stream io
StartStreamTask(ctx context.Context, req *StreamTaskRequest) ( StartStreamTask(ctx context.Context, req *StreamTaskRequest) (
readCloser io.ReadCloser, attribute map[string]string, err error) readCloser io.ReadCloser, attribute map[string]string, err error)
@ -260,15 +260,15 @@ func (ptm *peerTaskManager) prefetchParentTask(request *schedulerv1.PeerTaskRequ
return prefetch return prefetch
} }
func (ptm *peerTaskManager) StartFileTask(ctx context.Context, req *FileTaskRequest) (chan *FileTaskProgress, *TinyData, error) { func (ptm *peerTaskManager) StartFileTask(ctx context.Context, req *FileTaskRequest) (chan *FileTaskProgress, error) {
if req.KeepOriginalOffset && !ptm.Prefetch { if req.KeepOriginalOffset && !ptm.Prefetch {
return nil, nil, fmt.Errorf("please enable prefetch when use original offset feature") return nil, fmt.Errorf("please enable prefetch when use original offset feature")
} }
if ptm.Multiplex { if ptm.Multiplex {
progress, ok := ptm.tryReuseFilePeerTask(ctx, req) progress, ok := ptm.tryReuseFilePeerTask(ctx, req)
if ok { if ok {
metrics.PeerTaskCacheHitCount.Add(1) metrics.PeerTaskCacheHitCount.Add(1)
return progress, nil, nil return progress, nil
} }
} }
// TODO ensure scheduler is ok first // TODO ensure scheduler is ok first
@ -281,12 +281,12 @@ func (ptm *peerTaskManager) StartFileTask(ctx context.Context, req *FileTaskRequ
} }
ctx, pt, err := ptm.newFileTask(ctx, req, limit) ctx, pt, err := ptm.newFileTask(ctx, req, limit)
if err != nil { if err != nil {
return nil, nil, err return nil, err
} }
// FIXME when failed due to SchedulerClient error, relocate SchedulerClient and retry // FIXME when failed due to SchedulerClient error, relocate SchedulerClient and retry
progress, err := pt.Start(ctx) progress, err := pt.Start(ctx)
return progress, pt.peerTaskConductor.tinyData, err return progress, err
} }
func (ptm *peerTaskManager) StartStreamTask(ctx context.Context, req *StreamTaskRequest) (io.ReadCloser, map[string]string, error) { func (ptm *peerTaskManager) StartStreamTask(ctx context.Context, req *StreamTaskRequest) (io.ReadCloser, map[string]string, error) {

View File

@ -84,13 +84,12 @@ func (mr *MockTaskManagerMockRecorder) IsPeerTaskRunning(taskID interface{}) *go
} }
// StartFileTask mocks base method. // StartFileTask mocks base method.
func (m *MockTaskManager) StartFileTask(ctx context.Context, req *FileTaskRequest) (chan *FileTaskProgress, *TinyData, error) { func (m *MockTaskManager) StartFileTask(ctx context.Context, req *FileTaskRequest) (chan *FileTaskProgress, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "StartFileTask", ctx, req) ret := m.ctrl.Call(m, "StartFileTask", ctx, req)
ret0, _ := ret[0].(chan *FileTaskProgress) ret0, _ := ret[0].(chan *FileTaskProgress)
ret1, _ := ret[1].(*TinyData) ret1, _ := ret[1].(error)
ret2, _ := ret[2].(error) return ret0, ret1
return ret0, ret1, ret2
} }
// StartFileTask indicates an expected call of StartFileTask. // StartFileTask indicates an expected call of StartFileTask.

View File

@ -699,7 +699,7 @@ func (ts *testSpec) runFileTaskTest(assert *testifyassert.Assertions, require *t
defer func() { defer func() {
assert.Nil(os.Remove(output)) assert.Nil(os.Remove(output))
}() }()
progress, _, err := mm.peerTaskManager.StartFileTask( progress, err := mm.peerTaskManager.StartFileTask(
context.Background(), context.Background(),
&FileTaskRequest{ &FileTaskRequest{
PeerTaskRequest: schedulerv1.PeerTaskRequest{ PeerTaskRequest: schedulerv1.PeerTaskRequest{

View File

@ -485,32 +485,11 @@ func (s *server) doDownload(ctx context.Context, req *dfdaemonv1.DownRequest, st
} }
log := logger.With("peer", peerTask.PeerId, "component", "downloadService") log := logger.With("peer", peerTask.PeerId, "component", "downloadService")
peerTaskProgress, tiny, err := s.peerTaskManager.StartFileTask(ctx, peerTask) peerTaskProgress, err := s.peerTaskManager.StartFileTask(ctx, peerTask)
if err != nil { if err != nil {
return dferrors.New(commonv1.Code_UnknownError, fmt.Sprintf("%s", err)) return dferrors.New(commonv1.Code_UnknownError, fmt.Sprintf("%s", err))
} }
if tiny != nil {
err = stream.Send(&dfdaemonv1.DownResult{
TaskId: tiny.TaskID,
PeerId: tiny.PeerID,
CompletedLength: uint64(len(tiny.Content)),
Done: true,
Output: req.Output,
})
if err != nil {
log.Infof("send download result error: %s", err.Error())
return err
}
log.Infof("tiny file, wrote to output")
if req.Uid != 0 && req.Gid != 0 {
if err = os.Chown(req.Output, int(req.Uid), int(req.Gid)); err != nil {
log.Errorf("change own failed: %s", err)
return err
}
}
return nil
}
for { for {
select { select {
case p, ok := <-peerTaskProgress: case p, ok := <-peerTaskProgress: