diff --git a/api/mojang/queue/queue.go b/api/mojang/queue/queue.go index 27fe44a..4a67992 100644 --- a/api/mojang/queue/queue.go +++ b/api/mojang/queue/queue.go @@ -123,12 +123,10 @@ func (ctx *JobsQueue) queueRound() { profiles, err := usernamesToUuids(usernames) if err != nil { - defer func() { - for _, job := range jobs { - job.RespondTo <- nil - } - }() - ctx.maybeShouldPanic(err) + ctx.handleResponseError(err) + for _, job := range jobs { + job.RespondTo <- nil + } return } @@ -170,7 +168,7 @@ func (ctx *JobsQueue) getTextures(uuid string) *mojang.SignedTexturesResponse { ctx.Logger.RecordTimer("mojang_textures.textures.request_time", time.Since(start)) shouldCache := true if err != nil { - ctx.maybeShouldPanic(err) + ctx.handleResponseError(err) shouldCache = false } @@ -181,8 +179,7 @@ func (ctx *JobsQueue) getTextures(uuid string) *mojang.SignedTexturesResponse { return result } -// Starts to panic if there's an unexpected error -func (ctx *JobsQueue) maybeShouldPanic(err error) { +func (ctx *JobsQueue) handleResponseError(err error) { ctx.Logger.Debug("Got response error :err", wd.ErrParam(err)) switch err.(type) { @@ -206,5 +203,5 @@ func (ctx *JobsQueue) maybeShouldPanic(err error) { } } - panic(err) + ctx.Logger.Emergency("Unknown Mojang response error: :err", wd.ErrParam(err)) } diff --git a/api/mojang/queue/queue_test.go b/api/mojang/queue/queue_test.go index 5d8c97c..4372203 100644 --- a/api/mojang/queue/queue_test.go +++ b/api/mojang/queue/queue_test.go @@ -3,6 +3,7 @@ package queue import ( "crypto/rand" "encoding/base64" + "errors" "net" "strings" "syscall" @@ -406,7 +407,7 @@ var expectedErrors = []error{ syscall.ECONNREFUSED, } -func (suite *queueTestSuite) TestShouldNotPanicWhenExpectedErrorReturnedFromUsernameToUuidRequest() { +func (suite *queueTestSuite) TestShouldNotLogErrorWhenExpectedErrorReturnedFromUsernameToUuidRequest() { suite.Logger.On("IncCounter", mock.Anything, mock.Anything) suite.Logger.On("UpdateGauge", mock.Anything, mock.Anything) suite.Logger.On("RecordTimer", mock.Anything, mock.Anything) @@ -426,7 +427,23 @@ func (suite *queueTestSuite) TestShouldNotPanicWhenExpectedErrorReturnedFromUser } } -func (suite *queueTestSuite) TestShouldNotPanicWhenExpectedErrorReturnedFromUuidToTexturesRequest() { +func (suite *queueTestSuite) TestShouldLogEmergencyOnUnexpectedErrorReturnedFromUsernameToUuidRequest() { + suite.Logger.On("IncCounter", mock.Anything, mock.Anything) + suite.Logger.On("UpdateGauge", mock.Anything, mock.Anything) + suite.Logger.On("RecordTimer", mock.Anything, mock.Anything) + suite.Logger.On("Debug", "Got response error :err", mock.Anything).Once() + suite.Logger.On("Emergency", "Unknown Mojang response error: :err", mock.Anything).Once() + + suite.Storage.On("GetUuid", "maksimkurb").Return("", &ValueNotFound{}) + + suite.MojangApi.On("UsernamesToUuids", []string{"maksimkurb"}).Once().Return(nil, errors.New("unexpected error")) + + resultChan := suite.Queue.GetTexturesForUsername("maksimkurb") + suite.Iterate() + suite.Assert().Nil(<-resultChan) +} + +func (suite *queueTestSuite) TestShouldNotLogErrorWhenExpectedErrorReturnedFromUuidToTexturesRequest() { suite.Logger.On("IncCounter", mock.Anything, mock.Anything) suite.Logger.On("UpdateGauge", mock.Anything, mock.Anything) suite.Logger.On("RecordTimer", mock.Anything, mock.Anything) @@ -452,6 +469,28 @@ func (suite *queueTestSuite) TestShouldNotPanicWhenExpectedErrorReturnedFromUuid } } +func (suite *queueTestSuite) TestShouldLogEmergencyOnUnexpectedErrorReturnedFromUuidToTexturesRequest() { + suite.Logger.On("IncCounter", mock.Anything, mock.Anything) + suite.Logger.On("UpdateGauge", mock.Anything, mock.Anything) + suite.Logger.On("RecordTimer", mock.Anything, mock.Anything) + suite.Logger.On("Debug", "Got response error :err", mock.Anything).Once() + suite.Logger.On("Emergency", "Unknown Mojang response error: :err", mock.Anything).Once() + + suite.Storage.On("GetUuid", "maksimkurb").Return("", &ValueNotFound{}) + suite.Storage.On("StoreUuid", "maksimkurb", "0d252b7218b648bfb86c2ae476954d32") + suite.Storage.On("GetTextures", "0d252b7218b648bfb86c2ae476954d32").Return(nil, &ValueNotFound{}) + // Storage.StoreTextures shouldn't be called + + suite.MojangApi.On("UsernamesToUuids", []string{"maksimkurb"}).Once().Return([]*mojang.ProfileInfo{ + {Id: "0d252b7218b648bfb86c2ae476954d32", Name: "maksimkurb"}, + }, nil) + suite.MojangApi.On("UuidToTextures", "0d252b7218b648bfb86c2ae476954d32", true).Once().Return(nil, errors.New("unexpected error")) + + resultChan := suite.Queue.GetTexturesForUsername("maksimkurb") + suite.Iterate() + suite.Assert().Nil(<-resultChan) +} + func (suite *queueTestSuite) TestReceiveTexturesForNotAllowedMojangUsername() { suite.Logger.On("IncCounter", "mojang_textures.invalid_username", int64(1)).Once()