better error when peer selection fails (#3342)

* better error when peer selection fails

It is pretty hard to diagnose what went wrong when not enough peers for
an operation where found. This change now returns counts of reasons why
peers where discarded.

Changed the error to JSClusterNoPeers as it seems more appropriate
of an error for that operation. Not having enough resources is one of
the conditions for a peer not being considered. But so is having a non
matching tag. Which is why JSClusterNoPeers seems more appropriate
In addition, JSClusterNoPeers was already used as error after one call
to selectPeerGroup already.

example:
no suitable peers for placement: peer selection cluster 'C' with 3 peers
offline: 0
excludeTag: 1
noTagMatch: 2
noSpace: 0
uniqueTag: 0
misc: 0

Examle for mqtt:
mid:12 - "mqtt" - unable to connect: create sessions stream for account "$G":
no suitable peers for placement: peer selection cluster 'MQTT' with 3 peers
        offline: 0
        excludeTag: 0
        noTagMatch: 0
        noSpace: 0
        uniqueTag: 0
        misc: 0
         (10005)

Signed-off-by: Matthias Hanel <mh@synadia.com>

* review comment

Signed-off-by: Matthias Hanel <mh@synadia.com>
This commit is contained in:
Matthias Hanel
2022-08-06 00:17:01 +02:00
committed by GitHub
parent b927b228fc
commit 52c4872666
8 changed files with 148 additions and 67 deletions

View File

@@ -14,8 +14,8 @@ const (
// JSClusterIncompleteErr incomplete results
JSClusterIncompleteErr ErrorIdentifier = 10004
// JSClusterNoPeersErr no suitable peers for placement
JSClusterNoPeersErr ErrorIdentifier = 10005
// JSClusterNoPeersErrF no suitable peers for placement: {err}
JSClusterNoPeersErrF ErrorIdentifier = 10005
// JSClusterNotActiveErr JetStream not in clustered mode
JSClusterNotActiveErr ErrorIdentifier = 10006
@@ -398,7 +398,7 @@ var (
JSAccountResourcesExceededErr: {Code: 400, ErrCode: 10002, Description: "resource limits exceeded for account"},
JSBadRequestErr: {Code: 400, ErrCode: 10003, Description: "bad request"},
JSClusterIncompleteErr: {Code: 503, ErrCode: 10004, Description: "incomplete results"},
JSClusterNoPeersErr: {Code: 400, ErrCode: 10005, Description: "no suitable peers for placement"},
JSClusterNoPeersErrF: {Code: 400, ErrCode: 10005, Description: "no suitable peers for placement: {err}"},
JSClusterNotActiveErr: {Code: 500, ErrCode: 10006, Description: "JetStream not in clustered mode"},
JSClusterNotAssignedErr: {Code: 500, ErrCode: 10007, Description: "JetStream cluster not assigned to this server"},
JSClusterNotAvailErr: {Code: 503, ErrCode: 10008, Description: "JetStream system temporarily unavailable"},
@@ -579,14 +579,20 @@ func NewJSClusterIncompleteError(opts ...ErrorOption) *ApiError {
return ApiErrors[JSClusterIncompleteErr]
}
// NewJSClusterNoPeersError creates a new JSClusterNoPeersErr error: "no suitable peers for placement"
func NewJSClusterNoPeersError(opts ...ErrorOption) *ApiError {
// NewJSClusterNoPeersError creates a new JSClusterNoPeersErrF error: "no suitable peers for placement: {err}"
func NewJSClusterNoPeersError(err error, opts ...ErrorOption) *ApiError {
eopts := parseOpts(opts)
if ae, ok := eopts.err.(*ApiError); ok {
return ae
}
return ApiErrors[JSClusterNoPeersErr]
e := ApiErrors[JSClusterNoPeersErrF]
args := e.toReplacerArgs([]interface{}{"{err}", err})
return &ApiError{
Code: e.Code,
ErrCode: e.ErrCode,
Description: strings.NewReplacer(args...).Replace(e.Description),
}
}
// NewJSClusterNotActiveError creates a new JSClusterNotActiveErr error: "JetStream not in clustered mode"