diff --git a/common/constants/dfget_super_code.go b/common/constants/dfget_super_code.go index b59c3fc75..870045b4a 100644 --- a/common/constants/dfget_super_code.go +++ b/common/constants/dfget_super_code.go @@ -72,6 +72,8 @@ const ( CodeNeedAuth = 608 CodeWaitAuth = 609 CodeSourceError = 610 + CodeGetPieceReport = 611 + CodeGetPeerDown = 612 ) /* the code of task result that dfget will report to supernode */ diff --git a/dfget/core/api/supernode_api.go b/dfget/core/api/supernode_api.go index 674e1bb40..06ea32a57 100644 --- a/dfget/core/api/supernode_api.go +++ b/dfget/core/api/supernode_api.go @@ -21,8 +21,11 @@ import ( "fmt" "time" + "github.com/dragonflyoss/Dragonfly/common/constants" "github.com/dragonflyoss/Dragonfly/common/util" "github.com/dragonflyoss/Dragonfly/dfget/types" + + "github.com/sirupsen/logrus" ) /* the url paths of supernode APIs*/ @@ -77,7 +80,9 @@ func (api *supernodeAPI) Register(node string, req *types.RegisterRequest) ( return nil, fmt.Errorf("%d:%s", code, body) } resp = new(types.RegisterResponse) - e = json.Unmarshal(body, resp) + if e = json.Unmarshal(body, resp); e != nil { + return nil, e + } return resp, e } @@ -90,7 +95,9 @@ func (api *supernodeAPI) PullPieceTask(node string, req *types.PullPieceTaskRequ api.Scheme, node, peerPullPieceTaskPath, util.ParseQuery(req)) resp = new(types.PullPieceTaskResponse) - e = api.get(url, resp) + if e = api.get(url, resp); e != nil { + return nil, e + } return } @@ -100,9 +107,14 @@ func (api *supernodeAPI) ReportPiece(node string, req *types.ReportPieceRequest) url := fmt.Sprintf("%s://%s%s?%s", api.Scheme, node, peerReportPiecePath, util.ParseQuery(req)) - resp = new(types.BaseResponse) - e = api.get(url, resp) + if e = api.get(url, resp); e != nil { + logrus.Errorf("failed to report piece{taskid:%s,range:%s},err: %v", req.TaskID, req.PieceRange, e) + return nil, e + } + if resp != nil && resp.Code != constants.CodeGetPieceReport { + logrus.Errorf("failed to report piece{taskid:%s,range:%s} to supernode: api response code is %d not equal to %d", req.TaskID, req.PieceRange, resp.Code, constants.CodeGetPieceReport) + } return } @@ -114,7 +126,13 @@ func (api *supernodeAPI) ServiceDown(node string, taskID string, cid string) ( api.Scheme, node, peerServiceDownPath, taskID, cid) resp = new(types.BaseResponse) - e = api.get(url, resp) + if e = api.get(url, resp); e != nil { + logrus.Errorf("failed to send service down,err: %v", e) + return nil, e + } + if resp != nil && resp.Code != constants.CodeGetPeerDown { + logrus.Errorf("failed to send service down to supernode: api response code is %d not equal to %d", resp.Code, constants.CodeGetPeerDown) + } return } diff --git a/dfget/core/api/supernode_api_test.go b/dfget/core/api/supernode_api_test.go index 1de6fb6ec..5f476541e 100644 --- a/dfget/core/api/supernode_api_test.go +++ b/dfget/core/api/supernode_api_test.go @@ -100,9 +100,12 @@ func (s *SupernodeAPITestSuite) TestSupernodeAPI_PullPieceTask(c *check.C) { func (s *SupernodeAPITestSuite) TestSupernodeAPI_ReportPiece(c *check.C) { ip := "127.0.0.1" - + req := &types.ReportPieceRequest{ + TaskID: "sssss", + PieceRange: "0-11", + } s.mock.GetFunc = s.mock.CreateGetFunc(200, []byte(`{"Code":700}`), nil) - r, e := s.api.ReportPiece(ip, nil) + r, e := s.api.ReportPiece(ip, req) c.Check(e, check.IsNil) c.Check(r.Code, check.Equals, 700) } diff --git a/supernode/server/0.3_bridge.go b/supernode/server/0.3_bridge.go index a99556631..c95dc3e5b 100644 --- a/supernode/server/0.3_bridge.go +++ b/supernode/server/0.3_bridge.go @@ -200,8 +200,9 @@ func (s *Server) reportPiece(ctx context.Context, rw http.ResponseWriter, req *h return err } - rw.WriteHeader(http.StatusOK) - return nil + return EncodeResponse(rw, http.StatusOK, &types.ResultInfo{ + Code: constants.CodeGetPieceReport, + }) } func (s *Server) reportServiceDown(ctx context.Context, rw http.ResponseWriter, req *http.Request) (err error) { @@ -230,6 +231,7 @@ func (s *Server) reportServiceDown(ctx context.Context, rw http.ResponseWriter, return err } - rw.WriteHeader(http.StatusOK) - return nil + return EncodeResponse(rw, http.StatusOK, &types.ResultInfo{ + Code: constants.CodeGetPeerDown, + }) }