Skip to content

Commit c00ec6a

Browse files
committed
Improved error handling
1 parent 7548d59 commit c00ec6a

File tree

4 files changed

+37
-12
lines changed

4 files changed

+37
-12
lines changed

client/error.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ var (
4343
InternalServerError = StatusError{StatusCode: http.StatusInternalServerError, message: "internal server error"}
4444
)
4545

46+
// StatusError is an error with a given HTTP status code.
4647
type StatusError struct {
4748
StatusCode int
4849
message string
@@ -75,6 +76,7 @@ func IsStatusErrorWithCode(err error, code int) bool {
7576
return false
7677
}
7778

79+
// ErrorResponse is the JSON structure returned in an API error.
7880
type ErrorResponse struct {
7981
Error string
8082
}
@@ -99,6 +101,26 @@ func IsInternalServer(err error) bool {
99101
return IsStatusErrorWithCode(err, http.StatusInternalServerError)
100102
}
101103

104+
// NewServiceUnavailableError creates a service unavailable error with given message.
105+
func NewServiceUnavailableError(msg string) error {
106+
return StatusError{StatusCode: http.StatusServiceUnavailable, message: msg}
107+
}
108+
109+
// NewBadRequestError creates a bad request error with given message.
110+
func NewBadRequestError(msg string) error {
111+
return StatusError{StatusCode: http.StatusBadRequest, message: msg}
112+
}
113+
114+
// NewPreconditionFailedError creates a precondition failed error with given message.
115+
func NewPreconditionFailedError(msg string) error {
116+
return StatusError{StatusCode: http.StatusPreconditionFailed, message: msg}
117+
}
118+
119+
// NewInternalServerError creates a internal server error with given message.
120+
func NewInternalServerError(msg string) error {
121+
return StatusError{StatusCode: http.StatusInternalServerError, message: msg}
122+
}
123+
102124
// ParseResponseError returns an error from given response.
103125
// It tries to parse the body (if given body is nil, will be read from response)
104126
// for ErrorResponse.

service/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ func (s *httpServer) databaseAutoUpgradeHandler(w http.ResponseWriter, r *http.R
592592

593593
if !isRunning {
594594
// We must have reached the running state before we can handle this kind of request
595+
s.log.Debug().Msg("Received /database-auto-upgrade request while not in running phase")
595596
writeError(w, http.StatusBadRequest, "Must be in running state to do upgrades")
596597
return
597598
}
@@ -625,6 +626,7 @@ func (s *httpServer) databaseAutoUpgradeHandler(w http.ResponseWriter, r *http.R
625626
handleError(w, err)
626627
} else {
627628
if err := c.StartDatabaseUpgrade(ctx, force); err != nil {
629+
s.log.Debug().Err(err).Msg("Forwarding StartDatabaseUpgrade failed")
628630
handleError(w, err)
629631
} else {
630632
w.WriteHeader(http.StatusOK)
@@ -650,6 +652,7 @@ func (s *httpServer) databaseAutoUpgradeHandler(w http.ResponseWriter, r *http.R
650652
handleError(w, err)
651653
} else {
652654
if err := c.RetryDatabaseUpgrade(ctx); err != nil {
655+
s.log.Debug().Err(err).Msg("Forwarding RetryDatabaseUpgrade failed")
653656
handleError(w, err)
654657
} else {
655658
w.WriteHeader(http.StatusOK)

service/service.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
788788
location := master.CreateStarterURL("/hello")
789789
return ClusterConfig{}, maskAny(RedirectError{location})
790790
} else {
791-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "No master known"))
791+
return ClusterConfig{}, maskAny(client.NewBadRequestError("No master known"))
792792
}
793793
}
794794

@@ -830,7 +830,7 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
830830
if slaveAddr == "" {
831831
host, _, err := net.SplitHostPort(remoteAddress)
832832
if err != nil {
833-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "SlaveAddress must be set."))
833+
return ClusterConfig{}, maskAny(client.NewBadRequestError("SlaveAddress must be set."))
834834
}
835835
slaveAddr = normalizeHostName(host)
836836
} else {
@@ -840,21 +840,21 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
840840

841841
// Check request
842842
if req.SlaveID == "" {
843-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "SlaveID must be set."))
843+
return ClusterConfig{}, maskAny(client.NewBadRequestError("SlaveID must be set."))
844844
}
845845

846846
// Check datadir
847847
if !s.allowSameDataDir {
848848
for _, p := range s.myPeers.AllPeers {
849849
if p.Address == slaveAddr && p.DataDir == req.DataDir && p.ID != req.SlaveID {
850-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "Cannot use same directory as peer."))
850+
return ClusterConfig{}, maskAny(client.NewBadRequestError("Cannot use same directory as peer."))
851851
}
852852
}
853853
}
854854

855855
// Check IsSecure, cannot mix secure / non-secure
856856
if req.IsSecure != s.IsSecure() {
857-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "Cannot mix secure / non-secure peers."))
857+
return ClusterConfig{}, maskAny(client.NewBadRequestError("Cannot mix secure / non-secure peers."))
858858
}
859859

860860
// If slaveID already known, then return data right away.
@@ -869,7 +869,7 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
869869
} else {
870870
// Slave address may not change
871871
if p.Address != slaveAddr {
872-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "Cannot change slave address while using an existing ID."))
872+
return ClusterConfig{}, maskAny(client.NewBadRequestError("Cannot change slave address while using an existing ID."))
873873
}
874874
}
875875
s.myPeers.AllPeers[i].DataDir = req.DataDir
@@ -878,7 +878,7 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
878878
} else {
879879
// In single server mode, do not accept new slaves
880880
if s.mode.IsSingleMode() {
881-
return ClusterConfig{}, maskAny(errors.Wrap(client.BadRequestError, "In single server mode, slaves cannot be added."))
881+
return ClusterConfig{}, maskAny(client.NewBadRequestError("In single server mode, slaves cannot be added."))
882882
}
883883
// Ok. We're now in cluster or resilient single mode.
884884
// ID not yet found, add it

service/upgrade_manager.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,12 @@ func (m *upgradeManager) StartDatabaseUpgrade(ctx context.Context, force bool) e
273273
plan, err := m.readUpgradePlan(ctx)
274274
if err != nil && !agency.IsKeyNotFound(err) {
275275
// Failed to read upgrade plan
276-
return errors.Wrapf(err, "Failed to read upgrade plan")
276+
return errors.Wrap(err, "Failed to read upgrade plan")
277277
}
278278

279279
// Check plan status
280280
if !plan.IsReady() && !force {
281-
return errors.Wrap(client.BadRequestError, "Current upgrade plan has not finished yet")
281+
return maskAny(client.NewBadRequestError("Current upgrade plan has not finished yet"))
282282
}
283283

284284
// Create upgrade plan
@@ -375,14 +375,14 @@ func (m *upgradeManager) RetryDatabaseUpgrade(ctx context.Context) error {
375375

376376
if !mode.HasAgency() {
377377
// Without an agency there is not upgrade plan to retry
378-
return errors.Wrap(client.BadRequestError, "Retry needs an agency")
378+
return maskAny(client.NewBadRequestError("Retry needs an agency"))
379379
}
380380

381381
// Retry upgrade with agency.
382382
plan, err := m.readUpgradePlan(ctx)
383383
if agency.IsKeyNotFound(err) {
384384
// There is no upgrade plan
385-
return errors.Wrap(client.BadRequestError, "There is no upgrade plan")
385+
return maskAny(client.NewBadRequestError("There is no upgrade plan"))
386386
}
387387
if err != nil {
388388
// Failed to read upgrade plan
@@ -391,7 +391,7 @@ func (m *upgradeManager) RetryDatabaseUpgrade(ctx context.Context) error {
391391

392392
// Check failure status
393393
if !plan.IsFailed() {
394-
return errors.Wrap(client.BadRequestError, "The upgrade plan has not failed")
394+
return maskAny(client.NewBadRequestError("The upgrade plan has not failed"))
395395
}
396396

397397
// Reset failures and write plan

0 commit comments

Comments
 (0)