From e9c3663ccebee8f4bc7fc7132bb3c06514066a3a Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:01:01 +0100 Subject: [PATCH] [chore] ensure worker contexts have request ID (#2120) --- internal/gtscontext/wrap.go | 55 ++++++++++++++++++++ internal/middleware/requestid.go | 14 +++-- internal/processing/workers/fromclientapi.go | 15 +++--- internal/processing/workers/fromfediapi.go | 15 +++--- 4 files changed, 79 insertions(+), 20 deletions(-) create mode 100644 internal/gtscontext/wrap.go diff --git a/internal/gtscontext/wrap.go b/internal/gtscontext/wrap.go new file mode 100644 index 000000000..29a9af659 --- /dev/null +++ b/internal/gtscontext/wrap.go @@ -0,0 +1,55 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package gtscontext + +import ( + "context" + "time" +) + +// WithValues wraps 'ctx' to use its deadline, done channel and error, but use value store of 'values'. +func WithValues(ctx context.Context, values context.Context) context.Context { + if ctx == nil { + panic("nil base context") + } + return &wrapContext{ + base: ctx, + vals: values, + } +} + +type wrapContext struct { + base context.Context + vals context.Context +} + +func (ctx *wrapContext) Deadline() (deadline time.Time, ok bool) { + return ctx.base.Deadline() +} + +func (ctx *wrapContext) Done() <-chan struct{} { + return ctx.base.Done() +} + +func (ctx *wrapContext) Err() error { + return ctx.base.Err() +} + +func (ctx *wrapContext) Value(key any) any { + return ctx.vals.Value(key) +} diff --git a/internal/middleware/requestid.go b/internal/middleware/requestid.go index 3bf38092f..00b1ff299 100644 --- a/internal/middleware/requestid.go +++ b/internal/middleware/requestid.go @@ -39,8 +39,8 @@ var ( base32enc = base32.NewEncoding("0123456789abcdefghjkmnpqrstvwxyz").WithPadding(-1) ) -// generateID generates a new ID string. -func generateID() string { +// NewRequestID generates a new request ID string. +func NewRequestID() string { // 0:8 = timestamp // 8:12 = entropy // @@ -69,12 +69,10 @@ func AddRequestID(header string) gin.HandlerFunc { // Have we found anything? if id == "" { // Generate new ID. - // - // 0:8 = timestamp - // 8:12 = entropy - id = generateID() - // Set the request ID in the req header in case we pass the request along - // to another service + id = NewRequestID() + + // Set the request ID in the req header in case + // we pass the request along to another service. c.Request.Header.Set(header, id) } diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go index 40efc20bb..c48bb7044 100644 --- a/internal/processing/workers/fromclientapi.go +++ b/internal/processing/workers/fromclientapi.go @@ -25,6 +25,7 @@ import ( "codeberg.org/gruf/go-logger/v2/level" "github.com/superseriousbusiness/gotosocial/internal/ap" "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtscontext" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/log" @@ -46,13 +47,15 @@ type clientAPI struct { account *account.Processor } -func (p *Processor) EnqueueClientAPI(ctx context.Context, msgs ...messages.FromClientAPI) { - log.Trace(ctx, "enqueuing") - _ = p.workers.ClientAPI.MustEnqueueCtx(ctx, func(ctx context.Context) { +func (p *Processor) EnqueueClientAPI(cctx context.Context, msgs ...messages.FromClientAPI) { + _ = p.workers.ClientAPI.MustEnqueueCtx(cctx, func(wctx context.Context) { + // Copy caller ctx values to worker's. + wctx = gtscontext.WithValues(wctx, cctx) + + // Process worker messages. for _, msg := range msgs { - log.Trace(ctx, "processing: %+v", msg) - if err := p.ProcessFromClientAPI(ctx, msg); err != nil { - log.Errorf(ctx, "error processing client API message: %v", err) + if err := p.ProcessFromClientAPI(wctx, msg); err != nil { + log.Errorf(wctx, "error processing client API message: %v", err) } } }) diff --git a/internal/processing/workers/fromfediapi.go b/internal/processing/workers/fromfediapi.go index 50add88a3..57e087499 100644 --- a/internal/processing/workers/fromfediapi.go +++ b/internal/processing/workers/fromfediapi.go @@ -24,6 +24,7 @@ import ( "codeberg.org/gruf/go-kv" "codeberg.org/gruf/go-logger/v2/level" "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/gtscontext" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" @@ -44,13 +45,15 @@ type fediAPI struct { account *account.Processor } -func (p *Processor) EnqueueFediAPI(ctx context.Context, msgs ...messages.FromFediAPI) { - log.Trace(ctx, "enqueuing") - _ = p.workers.Federator.MustEnqueueCtx(ctx, func(ctx context.Context) { +func (p *Processor) EnqueueFediAPI(cctx context.Context, msgs ...messages.FromFediAPI) { + _ = p.workers.Federator.MustEnqueueCtx(cctx, func(wctx context.Context) { + // Copy caller ctx values to worker's. + wctx = gtscontext.WithValues(wctx, cctx) + + // Process worker messages. for _, msg := range msgs { - log.Trace(ctx, "processing: %+v", msg) - if err := p.ProcessFromFediAPI(ctx, msg); err != nil { - log.Errorf(ctx, "error processing fedi API message: %v", err) + if err := p.ProcessFromFediAPI(wctx, msg); err != nil { + log.Errorf(wctx, "error processing fedi API message: %v", err) } } })