"context"
"net"
"net/http"
+ "sync"
"time"
"git.arvados.org/arvados.git/sdk/go/ctxlog"
var (
requestTimeContextKey = contextKey{"requestTime"}
responseLogFieldsContextKey = contextKey{"responseLogFields"}
+ mutexContextKey = contextKey{"mutex"}
)
type hijacker interface {
}
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
}
}
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)