From 04a0fc40cdf9ccf4aa96f665917fe4c37ede4112 Mon Sep 17 00:00:00 2001 From: David Dworken Date: Sun, 17 Sep 2023 12:03:42 -0700 Subject: [PATCH] Make errors from updateUsageData(...) crash when running in non-prod to ensure they're detected/handled before deployment --- backend/server/server.go | 1 - internal/server/api.go | 20 +++++--------------- internal/server/srv.go | 8 ++++++++ 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/backend/server/server.go b/backend/server/server.go index 643aa01..572987e 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -186,4 +186,3 @@ func main() { } // TODO(optimization): Maybe optimize the endpoints a bit to reduce the number of round trips required? -// TODO: Add error checking for the calls to updateUsageData(...) that logs it/triggers an alert in prod, but is an error in test diff --git a/internal/server/api.go b/internal/server/api.go index fdda038..424dd7a 100644 --- a/internal/server/api.go +++ b/internal/server/api.go @@ -32,9 +32,7 @@ func (s *Server) apiSubmitHandler(w http.ResponseWriter, r *http.Request) { version := getHishtoryVersion(r) remoteIPAddr := getRemoteAddr(r) - if err := s.updateUsageData(r.Context(), version, remoteIPAddr, entries[0].UserId, entries[0].DeviceId, len(entries), false); err != nil { - fmt.Printf("updateUsageData: %v\n", err) - } + s.handleNonCriticalError(s.updateUsageData(r.Context(), version, remoteIPAddr, entries[0].UserId, entries[0].DeviceId, len(entries), false)) devices, err := s.db.DevicesForUser(r.Context(), entries[0].UserId) checkGormError(err) @@ -64,9 +62,7 @@ func (s *Server) apiBootstrapHandler(w http.ResponseWriter, r *http.Request) { version := getHishtoryVersion(r) remoteIPAddr := getRemoteAddr(r) - if err := s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, false); err != nil { - fmt.Printf("updateUsageData: %v\n", err) - } + s.handleNonCriticalError(s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, false)) historyEntries, err := s.db.AllHistoryEntriesForUser(r.Context(), userId) checkGormError(err) fmt.Printf("apiBootstrapHandler: Found %d entries\n", len(historyEntries)) @@ -84,9 +80,7 @@ func (s *Server) apiQueryHandler(w http.ResponseWriter, r *http.Request) { version := getHishtoryVersion(r) remoteIPAddr := getRemoteAddr(r) - if err := s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, true); err != nil { - fmt.Printf("updateUsageData: %v\n", err) - } + s.handleNonCriticalError(s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, true)) // Delete any entries that match a pending deletion request deletionRequests, err := s.db.DeletionRequestsForUserAndDevice(r.Context(), userId, deviceId) @@ -156,9 +150,7 @@ func (s *Server) apiSubmitDumpHandler(w http.ResponseWriter, r *http.Request) { version := getHishtoryVersion(r) remoteIPAddr := getRemoteAddr(r) - if err := s.updateUsageData(r.Context(), version, remoteIPAddr, userId, srcDeviceId, len(entries), false); err != nil { - fmt.Printf("updateUsageData: %v\n", err) - } + s.handleNonCriticalError(s.updateUsageData(r.Context(), version, remoteIPAddr, userId, srcDeviceId, len(entries), false)) w.Header().Set("Content-Length", "0") w.WriteHeader(http.StatusOK) @@ -226,9 +218,7 @@ func (s *Server) apiRegisterHandler(w http.ResponseWriter, r *http.Request) { version := getHishtoryVersion(r) remoteIPAddr := getRemoteAddr(r) - if err := s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, false); err != nil { - fmt.Printf("updateUsageData: %v\n", err) - } + s.handleNonCriticalError(s.updateUsageData(r.Context(), version, remoteIPAddr, userId, deviceId, 0, false)) if s.statsd != nil { s.statsd.Incr("hishtory.register", []string{}, 1.0) diff --git a/internal/server/srv.go b/internal/server/srv.go index da9f9ab..85039c9 100644 --- a/internal/server/srv.go +++ b/internal/server/srv.go @@ -330,6 +330,14 @@ func (s *Server) getNumConnectionsHandler(w http.ResponseWriter, r *http.Request _, _ = fmt.Fprintf(w, "%#v", stats.OpenConnections) } +func (s *Server) handleNonCriticalError(err error) { + if s.isProductionEnvironment { + fmt.Printf("Unexpected non-critical error: %v", err) + } else { + panic(fmt.Errorf("unexpected non-critical error: %w", err)) + } +} + func (s *Server) updateUsageData(ctx context.Context, version string, remoteAddr string, userId, deviceId string, numEntriesHandled int, isQuery bool) error { var usageData []shared.UsageData usageData, err := s.db.UsageDataFindByUserAndDevice(ctx, userId, deviceId)