From 8f0f3b495d0c715cc57d0d384bc5839acf9ece3f Mon Sep 17 00:00:00 2001 From: Ward Vandewege Date: Fri, 25 Mar 2022 16:37:28 -0400 Subject: [PATCH] 18896: add locking. Also handle v1 tokens shorter than 5 characters. Arvados-DCO-1.1-Signed-off-by: Ward Vandewege --- lib/controller/router/router.go | 6 +++++- sdk/go/httpserver/logger.go | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) 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) -- 2.30.2