Compare commits

..

1 Commits

Author SHA1 Message Date
georgehao
becfd41b0e fix(prover):fix prover panic infinite retry (#824)
Co-authored-by: georgehao <georgehao@users.noreply.github.com>
2023-08-18 16:42:05 +08:00
3 changed files with 22 additions and 25 deletions

View File

@@ -165,7 +165,7 @@ func (c *CoordinatorClient) GetTask(ctx context.Context, req *GetTaskRequest) (*
}
// SubmitProof sends a request to the coordinator to submit proof.
func (c *CoordinatorClient) SubmitProof(ctx context.Context, req *SubmitProofRequest) error {
func (c *CoordinatorClient) SubmitProof(ctx context.Context, req *SubmitProofRequest) (needDelete bool, err error) {
var result SubmitProofResponse
resp, err := c.client.R().
@@ -175,27 +175,24 @@ func (c *CoordinatorClient) SubmitProof(ctx context.Context, req *SubmitProofReq
Post("/coordinator/v1/submit_proof")
if err != nil {
log.Error("submit proof request failed: %v", err)
return fmt.Errorf("submit proof request failed: %w", ConnectErr)
return false, fmt.Errorf("submit proof request failed: %v", err)
}
if resp.StatusCode() != 200 {
log.Error("failed to submit proof, status code: %v", resp.StatusCode())
return fmt.Errorf("failed to submit proof, status code not 200: %w", ConnectErr)
return false, fmt.Errorf("failed to submit proof, status code: %v", resp.StatusCode())
}
if result.ErrCode == types.ErrJWTTokenExpired {
log.Info("JWT expired, attempting to re-login")
if err := c.Login(ctx); err != nil {
log.Error("JWT expired, re-login failed: %v", err)
return fmt.Errorf("JWT expired, re-login failed: %w", ConnectErr)
return false, fmt.Errorf("JWT expired, re-login failed: %v", err)
}
log.Info("re-login success")
return c.SubmitProof(ctx, req)
}
if result.ErrCode != types.Success {
return fmt.Errorf("error code: %v, error message: %v", result.ErrCode, result.ErrMsg)
return true, fmt.Errorf("error code: %v, error message: %v", result.ErrCode, result.ErrMsg)
}
return nil
return true, nil
}

View File

@@ -1,13 +1,9 @@
package client
import (
"errors"
"scroll-tech/common/types/message"
)
var ConnectErr = errors.New("connect coordinator error")
// ChallengeResponse defines the response structure for random API
type ChallengeResponse struct {
ErrCode int `json:"errcode"`

View File

@@ -162,7 +162,7 @@ func (r *Prover) proveAndSubmit() error {
proofMsg, err = r.prove(task)
if err != nil { // handling error from prove
log.Error("failed to prove task", "task_type", task.Task.Type, "task-id", task.Task.ID, "err", err)
return r.submitErr(task, true, message.ProofFailureNoPanic, err)
return r.submitErr(task, message.ProofFailureNoPanic, err)
}
return r.submitProof(proofMsg)
}
@@ -321,12 +321,14 @@ func (r *Prover) submitProof(msg *message.ProofDetail) error {
}
// send the submit request
if err := r.coordinatorClient.SubmitProof(r.ctx, req); err != nil {
if !errors.Is(errors.Unwrap(err), client.ConnectErr) {
if deleteErr := r.stack.Delete(msg.ID); deleteErr != nil {
log.Error("prover stack pop failed", "task_type", msg.Type, "task_id", msg.ID, "err", deleteErr)
}
needDeleteTask, err := r.coordinatorClient.SubmitProof(r.ctx, req)
if needDeleteTask {
if deleteErr := r.stack.Delete(msg.ID); deleteErr != nil {
log.Error("prover stack pop failed", "task_type", msg.Type, "task_id", msg.ID, "err", deleteErr)
}
}
if err != nil {
return fmt.Errorf("error submitting proof: %v", err)
}
@@ -335,7 +337,7 @@ func (r *Prover) submitProof(msg *message.ProofDetail) error {
return nil
}
func (r *Prover) submitErr(task *store.ProvingTask, isRetry bool, proofFailureType message.ProofFailureType, err error) error {
func (r *Prover) submitErr(task *store.ProvingTask, proofFailureType message.ProofFailureType, err error) error {
// prepare the submit request
req := &client.SubmitProofRequest{
TaskID: task.Task.ID,
@@ -347,12 +349,14 @@ func (r *Prover) submitErr(task *store.ProvingTask, isRetry bool, proofFailureTy
}
// send the submit request
if submitErr := r.coordinatorClient.SubmitProof(r.ctx, req); submitErr != nil {
if !errors.Is(errors.Unwrap(err), client.ConnectErr) {
if deleteErr := r.stack.Delete(task.Task.ID); deleteErr != nil {
log.Error("prover stack pop failed", "task_type", task.Task.Type, "task_id", task.Task.ID, "err", deleteErr)
}
needDeleteTask, submitErr := r.coordinatorClient.SubmitProof(r.ctx, req)
if needDeleteTask {
if deleteErr := r.stack.Delete(task.Task.ID); deleteErr != nil {
log.Error("prover stack pop failed", "task_type", task.Task.Type, "task_id", task.Task.ID, "err", deleteErr)
}
}
if submitErr != nil {
return fmt.Errorf("error submitting proof: %v", submitErr)
}