diff --git a/politeiad/backendv2/tstorebe/plugins/ticketvote/cmds.go b/politeiad/backendv2/tstorebe/plugins/ticketvote/cmds.go index 157cf7e5f..5eb3ffc23 100644 --- a/politeiad/backendv2/tstorebe/plugins/ticketvote/cmds.go +++ b/politeiad/backendv2/tstorebe/plugins/ticketvote/cmds.go @@ -1315,7 +1315,7 @@ func (p *ticketVotePlugin) ballot(token []byte, votes []ticketvote.CastVote, br "found %v", t) e := ticketvote.VoteErrorInternalError cvr.Ticket = v.Ticket - cvr.ErrorCode = e + cvr.ErrorCode = &e cvr.ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) goto saveReply @@ -1347,7 +1347,7 @@ func (p *ticketVotePlugin) ballot(token []byte, votes []ticketvote.CastVote, br "%v", t, err) e := ticketvote.VoteErrorInternalError cvr.Ticket = v.Ticket - cvr.ErrorCode = e + cvr.ErrorCode = &e cvr.ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) goto saveReply @@ -1364,7 +1364,7 @@ func (p *ticketVotePlugin) ballot(token []byte, votes []ticketvote.CastVote, br log.Errorf("cmdCastBallot: voteColliderSave %v: %v", t, err) e := ticketvote.VoteErrorInternalError cvr.Ticket = v.Ticket - cvr.ErrorCode = e + cvr.ErrorCode = &e cvr.ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) goto saveReply @@ -1429,7 +1429,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if err != nil { e := ticketvote.VoteErrorTokenInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: not hex", ticketvote.VoteErrors[e]) continue @@ -1439,7 +1439,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if !bytes.Equal(t, token) { e := ticketvote.VoteErrorMultipleRecordVotes receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = ticketvote.VoteErrors[e] continue } @@ -1448,7 +1448,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if voteDetails == nil { e := ticketvote.VoteErrorVoteStatusInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: vote is "+ "not active", ticketvote.VoteErrors[e]) continue @@ -1456,7 +1456,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if voteHasEnded(bestBlock, voteDetails.EndBlockHeight) { e := ticketvote.VoteErrorVoteStatusInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: vote has "+ "ended", ticketvote.VoteErrors[e]) continue @@ -1467,7 +1467,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if err != nil { e := ticketvote.VoteErrorVoteBitInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = ticketvote.VoteErrors[e] continue } @@ -1476,7 +1476,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if err != nil { e := ticketvote.VoteErrorVoteBitInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], err) continue @@ -1487,7 +1487,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if !ok { e := ticketvote.VoteErrorTicketNotEligible receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = ticketvote.VoteErrors[e] continue } @@ -1497,14 +1497,14 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if !isActive { e := ticketvote.VoteErrorVoteStatusInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: vote is "+ "not active", ticketvote.VoteErrors[e]) } if isDup { e := ticketvote.VoteErrorTicketAlreadyVoted receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = ticketvote.VoteErrors[e] continue } @@ -1521,7 +1521,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, // that are not found in the cache are fetched manually. tickets := make([]string, 0, len(cb.Ballot)) for k, v := range votes { - if receipts[k].ErrorCode != ticketvote.VoteErrorInvalid { + if receipts[k].ErrorCode != nil { // Vote has an error. Skip it. continue } @@ -1554,7 +1554,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, // Verify the signatures for k, v := range votes { - if receipts[k].ErrorCode != ticketvote.VoteErrorInvalid { + if receipts[k].ErrorCode != nil { // Vote has an error. Skip it. continue } @@ -1567,7 +1567,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, "%v: %v", t, v.Ticket) e := ticketvote.VoteErrorInternalError receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) continue @@ -1578,7 +1578,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, "%v %v", t, v.Ticket, commitmentAddr.err) e := ticketvote.VoteErrorInternalError receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) continue @@ -1587,7 +1587,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, if err != nil { e := ticketvote.VoteErrorSignatureInvalid receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], err) continue @@ -1641,7 +1641,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, ballotCount int ) for k, v := range votes { - if receipts[k].ErrorCode != ticketvote.VoteErrorInvalid { + if receipts[k].ErrorCode != nil { // Vote has an error. Skip it. continue } @@ -1679,7 +1679,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, // Fill in the receipts for k, v := range votes { - if receipts[k].ErrorCode != ticketvote.VoteErrorInvalid { + if receipts[k].ErrorCode != nil { // Vote has an error. Skip it. continue } @@ -1690,7 +1690,7 @@ func (p *ticketVotePlugin) cmdCastBallot(token []byte, payload string) (string, "%v", t, v.Ticket) e := ticketvote.VoteErrorInternalError receipts[k].Ticket = v.Ticket - receipts[k].ErrorCode = e + receipts[k].ErrorCode = &e receipts[k].ErrorContext = fmt.Sprintf("%v: %v", ticketvote.VoteErrors[e], t) continue diff --git a/politeiad/plugins/ticketvote/ticketvote.go b/politeiad/plugins/ticketvote/ticketvote.go index 4d7470afd..3acd547f1 100644 --- a/politeiad/plugins/ticketvote/ticketvote.go +++ b/politeiad/plugins/ticketvote/ticketvote.go @@ -497,8 +497,8 @@ type CastVoteReply struct { // The follwing fields will only be present if an error occurred // while attempting to cast the vote. - ErrorCode VoteErrorT `json:"errorcode,omitempty"` - ErrorContext string `json:"errorcontext,omitempty"` + ErrorCode *VoteErrorT `json:"errorcode,omitempty"` + ErrorContext string `json:"errorcontext,omitempty"` } // CastBallot casts a ballot of votes. A ballot can only contain votes for a diff --git a/politeiawww/api/ticketvote/v1/v1.go b/politeiawww/api/ticketvote/v1/v1.go index 2465d64be..1a20b388c 100644 --- a/politeiawww/api/ticketvote/v1/v1.go +++ b/politeiawww/api/ticketvote/v1/v1.go @@ -446,8 +446,8 @@ type CastVoteReply struct { // The follwing fields will only be present if an error occurred // while attempting to cast the vote. - ErrorCode VoteErrorT `json:"errorcode,omitempty"` - ErrorContext string `json:"errorcontext,omitempty"` + ErrorCode *VoteErrorT `json:"errorcode,omitempty"` + ErrorContext string `json:"errorcontext,omitempty"` } // CastBallot casts a ballot of votes. A ballot can only contain the votes for diff --git a/politeiawww/cmd/pictl/cmdcastballot.go b/politeiawww/cmd/pictl/cmdcastballot.go index a77210278..a7f5dd629 100644 --- a/politeiawww/cmd/pictl/cmdcastballot.go +++ b/politeiawww/cmd/pictl/cmdcastballot.go @@ -194,7 +194,7 @@ func (c *cmdCastBallot) Execute(args []string) error { h := eligibleTickets[i] // Check for vote error - if v.ErrorContext != "" { + if v.ErrorCode != nil { failedReceipts = append(failedReceipts, v) failedTickets = append(failedTickets, h) continue diff --git a/politeiawww/cmd/politeiavoter/trickle.go b/politeiawww/cmd/politeiavoter/trickle.go index 48e9f8d5e..60d8d6d77 100644 --- a/politeiawww/cmd/politeiavoter/trickle.go +++ b/politeiawww/cmd/politeiavoter/trickle.go @@ -145,12 +145,11 @@ func waitRandom(min, max byte) time.Duration { func (p *piv) voteTicket(ectx context.Context, bunchID, voteID, of int, va voteAlarm) error { voteID++ // make human readable - //fmt.Printf("bunchID: %v voterID: %v at: %v\n", bunchID, voteID, va.At) // Wait err := WaitUntil(ectx, va.At) if err != nil { - return fmt.Errorf("%v bunch %v vote %v failed: %v\n", + return fmt.Errorf("%v bunch %v vote %v failed: %v", time.Now(), bunchID, voteID, err) } @@ -186,16 +185,9 @@ func (p *piv) voteTicket(ectx context.Context, bunchID, voteID, of int, va voteA // Unrecoverable error return fmt.Errorf("unrecoverable error: %v", err) - } else { - // XXX TODO(lukebp) please make this a pointer and only - // evaluate these errors when it is set. For now we - // have to treat VoteErrorInvalid as valid because of - // this. - switch vr.ErrorCode { - // Success - case tkv1.VoteErrorInvalid: - // XXX treat as success for now - + } else if vr.ErrorCode != nil { + // Evaluate errors when ErrorCode is set + switch *vr.ErrorCode { // Silently ignore. case tkv1.VoteErrorTicketAlreadyVoted: // This happens during network errors. Since @@ -257,7 +249,7 @@ func (p *piv) voteTicket(ectx context.Context, bunchID, voteID, of int, va voteA return nil } - + } else { // Success, log it and exit err = p.jsonLog(successJournal, va.Vote.Token, vr) if err != nil { diff --git a/politeiawww/legacy/proposals.go b/politeiawww/legacy/proposals.go index 27066048e..06b31678f 100644 --- a/politeiawww/legacy/proposals.go +++ b/politeiawww/legacy/proposals.go @@ -832,8 +832,11 @@ func convertVoteTypeToWWW(t tkplugin.VoteT) www.VoteT { } } -func convertVoteErrorCodeToWWW(e tkplugin.VoteErrorT) decredplugin.ErrorStatusT { - switch e { +func convertVoteErrorCodeToWWW(e *tkplugin.VoteErrorT) decredplugin.ErrorStatusT { + if e == nil { + return decredplugin.ErrorStatusInvalid + } + switch *e { case tkplugin.VoteErrorInvalid: return decredplugin.ErrorStatusInvalid case tkplugin.VoteErrorInternalError: diff --git a/politeiawww/legacy/ticketvote/process.go b/politeiawww/legacy/ticketvote/process.go index 2d293573a..a5fd69745 100644 --- a/politeiawww/legacy/ticketvote/process.go +++ b/politeiawww/legacy/ticketvote/process.go @@ -391,25 +391,32 @@ func convertVoteParamsToV1(v ticketvote.VoteParams) v1.VoteParams { return vp } -func convertVoteErrorToV1(e ticketvote.VoteErrorT) v1.VoteErrorT { - switch e { +func convertVoteErrorToV1(e *ticketvote.VoteErrorT) *v1.VoteErrorT { + if e == nil { + return nil + } + + var ve v1.VoteErrorT + switch *e { case ticketvote.VoteErrorInvalid: - return v1.VoteErrorInvalid + ve = v1.VoteErrorInvalid case ticketvote.VoteErrorInternalError: - return v1.VoteErrorInternalError + ve = v1.VoteErrorInternalError case ticketvote.VoteErrorRecordNotFound: - return v1.VoteErrorRecordNotFound + ve = v1.VoteErrorRecordNotFound case ticketvote.VoteErrorVoteBitInvalid: - return v1.VoteErrorVoteBitInvalid + ve = v1.VoteErrorVoteBitInvalid case ticketvote.VoteErrorVoteStatusInvalid: - return v1.VoteErrorVoteStatusInvalid + ve = v1.VoteErrorVoteStatusInvalid case ticketvote.VoteErrorTicketAlreadyVoted: - return v1.VoteErrorTicketAlreadyVoted + ve = v1.VoteErrorTicketAlreadyVoted case ticketvote.VoteErrorTicketNotEligible: - return v1.VoteErrorTicketNotEligible + ve = v1.VoteErrorTicketNotEligible default: - return v1.VoteErrorInternalError + ve = v1.VoteErrorInternalError } + + return &ve } func convertCastVoteRepliesToV1(replies []ticketvote.CastVoteReply) []v1.CastVoteReply {