From: Ward Vandewege Date: Fri, 25 Mar 2022 20:37:28 +0000 (-0400) Subject: 18896: add locking. Also handle v1 tokens shorter than 5 characters. X-Git-Tag: 2.4.0~21^2~2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/8f0f3b495d0c715cc57d0d384bc5839acf9ece3f 18896: add locking. Also handle v1 tokens shorter than 5 characters. Arvados-DCO-1.1-Signed-off-by: Ward Vandewege --- diff --git a/lib/controller/router/router.go b/lib/controller/router/router.go index e42d9a555b..05bdb4754f 100644 --- a/lib/controller/router/router.go +++ b/lib/controller/router/router.go @@ -597,7 +597,11 @@ func (rtr *router) addRoute(endpoint arvados.APIEndpoint, defaultOpts func() int tokenUUIDs = append(tokenUUIDs, tokenParts[1]) } } else { - tokenUUIDs = append(tokenUUIDs, "v1 token ending in "+t[len(t)-5:]) + end := t + if len(t) > 5 { + end = t[len(t)-5:] + } + tokenUUIDs = append(tokenUUIDs, "v1 token ending in "+end) } } httpserver.SetResponseLogFields(req.Context(), logrus.Fields{"tokenUUIDs": tokenUUIDs}) diff --git a/sdk/go/httpserver/logger.go b/sdk/go/httpserver/logger.go index 437429611c..ef2ec41704 100644 --- a/sdk/go/httpserver/logger.go +++ b/sdk/go/httpserver/logger.go @@ -9,6 +9,7 @@ import ( "context" "net" "net/http" + "sync" "time" "git.arvados.org/arvados.git/sdk/go/ctxlog" @@ -23,6 +24,7 @@ type contextKey struct { var ( requestTimeContextKey = contextKey{"requestTime"} responseLogFieldsContextKey = contextKey{"responseLogFields"} + mutexContextKey = contextKey{"mutex"} ) type hijacker interface { @@ -66,11 +68,18 @@ func HandlerWithDeadline(timeout time.Duration, next http.Handler) http.Handler } func SetResponseLogFields(ctx context.Context, fields logrus.Fields) { - ctxfields := ctx.Value(&responseLogFieldsContextKey) - if c, ok := ctxfields.(logrus.Fields); ok { - for k, v := range fields { - c[k] = v + m := ctx.Value(&mutexContextKey) + if mutex, ok := m.(sync.Mutex); ok { + mutex.Lock() + defer mutex.Unlock() + ctxfields := ctx.Value(&responseLogFieldsContextKey) + if c, ok := ctxfields.(logrus.Fields); ok { + for k, v := range fields { + c[k] = v + } } + } else { + // We can't lock, don't set the fields } } @@ -92,6 +101,7 @@ func LogRequests(h http.Handler) http.Handler { ctx := req.Context() ctx = context.WithValue(ctx, &requestTimeContextKey, time.Now()) ctx = context.WithValue(ctx, &responseLogFieldsContextKey, logrus.Fields{}) + ctx = context.WithValue(ctx, &mutexContextKey, sync.Mutex{}) ctx = ctxlog.Context(ctx, lgr) req = req.WithContext(ctx)