fix: grpc download tidy file error (#1697)
Signed-off-by: Jim Ma <majinjing3@gmail.com>
This commit is contained in:
parent
cb55b1d809
commit
c5f4ca50fa
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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{
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue