view errors.go @ 47:71b6822763da default tip

Fix more race conditions in Accept logic
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 26 Jul 2019 12:10:39 +0200
parents fdd258eb58bc
children
line wrap: on
line source

package clusterconsensus

import "fmt"

const (
	// An error with the ConsensusClient
	ERR_CALL     string = "ERR_CALL"
	ERR_IO              = "ERR_IO"
	ERR_ENCODING        = "ERR_ENCODING"
	// We're currently in a bad state; try again later
	ERR_STATE    = "ERR_STATE"
	ERR_MAJORITY = "ERR_MAJORITY"
	ERR_DENIED   = "ERR_DENIED"
	ERR_SEQUENCE = "ERR_SEQUENCE"
	ERR_GAP      = "ERR_GAP"
	ERR_CONNECT  = "ERR_CONNECT"
)

type ConsensusError struct {
	// one of ERR_*
	errEnum string
	// Description
	desc string
	// And/or
	inner error
}

func NewError(code, desc string, inner error) ConsensusError {
	return ConsensusError{errEnum: code, desc: desc, inner: inner}
}

func (e ConsensusError) Error() string {
	if e.inner != nil {
		return fmt.Sprintf("%s: %s %s", e.errEnum, e.desc, e.inner.Error())
	} else {
		return fmt.Sprintf("%s: %s", e.errEnum, e.desc)
	}
}

// Whether it makes sense to retry the operation later.
func (e ConsensusError) Retryable() bool {
	return e.errEnum == ERR_STATE || e.errEnum == ERR_CALL || e.errEnum == ERR_MAJORITY
}

// Returns an error code from ERR_*
func (e ConsensusError) Code() string {
	return e.errEnum
}