Skip to content

Commit b928106

Browse files
authored
chore: remove NodeID middleware and replace with static function (#2664)
1 parent b15199c commit b928106

File tree

6 files changed

+15
-283
lines changed

6 files changed

+15
-283
lines changed

internal/dispatch/caching/caching.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616

1717
"github.com/authzed/spicedb/internal/dispatch"
1818
"github.com/authzed/spicedb/internal/dispatch/keys"
19-
log "github.com/authzed/spicedb/internal/logging"
2019
"github.com/authzed/spicedb/internal/telemetry/otelconv"
2120
"github.com/authzed/spicedb/pkg/cache"
2221
"github.com/authzed/spicedb/pkg/middleware/nodeid"
@@ -162,11 +161,7 @@ func (cd *Dispatcher) DispatchCheck(ctx context.Context, req *v1.DispatchCheckRe
162161
cd.checkFromCacheCounter.Inc()
163162
// If debugging is requested, add the req and the response to the trace.
164163
if req.Debug == v1.DispatchCheckRequest_ENABLE_BASIC_DEBUGGING {
165-
nodeID, err := nodeid.FromContext(ctx)
166-
if err != nil {
167-
log.Err(err).Msg("failed to get nodeID from context")
168-
}
169-
164+
nodeID := nodeid.Get()
170165
response.Metadata.DebugInfo = &v1.DebugInformation{
171166
Check: &v1.CheckDebugTrace{
172167
Request: req,

internal/dispatch/graph/graph.go

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,7 @@ func (ld *localDispatcher) DispatchCheck(ctx context.Context, req *v1.DispatchCh
241241
resourceType := tuple.StringCoreRR(req.ResourceRelation)
242242
spanName := "DispatchCheck → " + resourceType + "@" + req.Subject.Namespace + "#" + req.Subject.Relation
243243

244-
nodeID, err := nodeid.FromContext(ctx)
245-
if err != nil {
246-
log.Err(err).Msg("failed to get node ID")
247-
}
244+
nodeID := nodeid.Get()
248245

249246
ctx, span := tracer.Start(ctx, spanName, trace.WithAttributes(
250247
attribute.String(otelconv.AttrDispatchResourceType, resourceType),
@@ -263,12 +260,6 @@ func (ld *localDispatcher) DispatchCheck(ctx context.Context, req *v1.DispatchCh
263260
}, rewriteError(ctx, err)
264261
}
265262

266-
// NOTE: we return debug information here to ensure tooling can see the cycle.
267-
nodeID, nerr := nodeid.FromContext(ctx)
268-
if nerr != nil {
269-
log.Err(nerr).Msg("failed to get nodeID from context")
270-
}
271-
272263
return &v1.DispatchCheckResponse{
273264
Metadata: &v1.ResponseMeta{
274265
DispatchCount: 0,
@@ -337,11 +328,7 @@ func (ld *localDispatcher) DispatchCheck(ctx context.Context, req *v1.DispatchCh
337328

338329
// DispatchExpand implements dispatch.Expand interface
339330
func (ld *localDispatcher) DispatchExpand(ctx context.Context, req *v1.DispatchExpandRequest) (*v1.DispatchExpandResponse, error) {
340-
nodeID, err := nodeid.FromContext(ctx)
341-
if err != nil {
342-
log.Err(err).Msg("failed to get node ID")
343-
}
344-
331+
nodeID := nodeid.Get()
345332
ctx, span := tracer.Start(ctx, "DispatchExpand", trace.WithAttributes(
346333
attribute.String(otelconv.AttrDispatchStart, tuple.StringCoreONR(req.ResourceAndRelation)),
347334
attribute.String(otelconv.AttrDispatchNodeID, nodeID),
@@ -377,10 +364,7 @@ func (ld *localDispatcher) DispatchLookupResources2(
377364
req *v1.DispatchLookupResources2Request,
378365
stream dispatch.LookupResources2Stream,
379366
) error {
380-
nodeID, err := nodeid.FromContext(stream.Context())
381-
if err != nil {
382-
log.Err(err).Msg("failed to get node ID")
383-
}
367+
nodeID := nodeid.Get()
384368

385369
ctx, span := tracer.Start(stream.Context(), "DispatchLookupResources2", trace.WithAttributes(
386370
attribute.String(otelconv.AttrDispatchResourceType, tuple.StringCoreRR(req.ResourceRelation)),
@@ -413,10 +397,7 @@ func (ld *localDispatcher) DispatchLookupResources3(
413397
req *v1.DispatchLookupResources3Request,
414398
stream dispatch.LookupResources3Stream,
415399
) error {
416-
nodeID, err := nodeid.FromContext(stream.Context())
417-
if err != nil {
418-
log.Err(err).Msg("failed to get node ID")
419-
}
400+
nodeID := nodeid.Get()
420401

421402
ctx, span := tracer.Start(stream.Context(), "DispatchLookupResources3", trace.WithAttributes(
422403
attribute.String(otelconv.AttrDispatchResourceType, tuple.StringCoreRR(req.ResourceRelation)),
@@ -450,10 +431,7 @@ func (ld *localDispatcher) DispatchLookupSubjects(
450431
req *v1.DispatchLookupSubjectsRequest,
451432
stream dispatch.LookupSubjectsStream,
452433
) error {
453-
nodeID, err := nodeid.FromContext(stream.Context())
454-
if err != nil {
455-
log.Err(err).Msg("failed to get node ID")
456-
}
434+
nodeID := nodeid.Get()
457435

458436
resourceType := tuple.StringCoreRR(req.ResourceRelation)
459437
subjectRelation := tuple.StringCoreRR(req.SubjectRelation)

internal/graph/check.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,7 @@ func (cc *ConcurrentChecker) Check(ctx context.Context, req ValidatedCheckReques
116116
return resolved.Resp, resolved.Err
117117
}
118118

119-
nodeID, err := nodeid.FromContext(ctx)
120-
if err != nil {
121-
// NOTE: we ignore this error here as if the node ID is missing, the debug
122-
// trace is still valid.
123-
log.Err(err).Msg("failed to get node ID")
124-
}
119+
nodeID := nodeid.Get()
125120

126121
// Add debug information if requested.
127122
debugInfo := resolved.Resp.Metadata.DebugInfo
@@ -1326,15 +1321,10 @@ func combineResponseMetadata(ctx context.Context, existing *v1.ResponseMeta, res
13261321
return combined
13271322
}
13281323

1329-
nodeID, err := nodeid.FromContext(ctx)
1330-
if err != nil {
1331-
log.Err(err).Msg("failed to get nodeID from context")
1332-
}
1333-
13341324
debugInfo := &v1.DebugInformation{
13351325
Check: &v1.CheckDebugTrace{
13361326
TraceId: NewTraceID(),
1337-
SourceId: nodeID,
1327+
SourceId: nodeid.Get(),
13381328
},
13391329
}
13401330

pkg/cmd/server/defaults.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"github.com/authzed/spicedb/pkg/datastore"
4040
consistencymw "github.com/authzed/spicedb/pkg/middleware/consistency"
4141
logmw "github.com/authzed/spicedb/pkg/middleware/logging"
42-
"github.com/authzed/spicedb/pkg/middleware/nodeid"
4342
"github.com/authzed/spicedb/pkg/middleware/requestid"
4443
"github.com/authzed/spicedb/pkg/middleware/serverversion"
4544
"github.com/authzed/spicedb/pkg/releases"
@@ -167,7 +166,6 @@ var alwaysDebugOption = grpclog.WithLevels(func(code codes.Code) grpclog.Level {
167166

168167
const (
169168
DefaultMiddlewareRequestID = "requestid"
170-
DefaultMiddlewareNodeID = "nodeid"
171169
DefaultMiddlewareLog = "log"
172170
DefaultMiddlewareGRPCLog = "grpclog"
173171
DefaultMiddlewareGRPCAuth = "grpcauth"
@@ -302,25 +300,18 @@ func DefaultUnaryMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.UnaryS
302300
WithInterceptor(logmw.UnaryServerInterceptor(logmw.ExtractMetadataField(string(requestmeta.RequestIDKey), "requestID"))).
303301
Done(),
304302

305-
NewUnaryMiddleware().
306-
WithName(DefaultMiddlewareNodeID).
307-
WithInterceptor(nodeid.UnaryServerInterceptor("")).
308-
Done(),
309-
310303
NewUnaryMiddleware().
311304
WithName(DefaultMiddlewareGRPCLog + "-debug").
312305
WithInterceptor(selector.UnaryServerInterceptor(
313306
grpclog.UnaryServerInterceptor(InterceptorLogger(opts.Logger), determineEventsToLog(opts), alwaysDebugOption, durationFieldOption, traceIDFieldOption),
314307
selector.MatchFunc(matchesRoute(healthCheckRoute)))).
315-
EnsureAlreadyExecuted(DefaultMiddlewareNodeID).
316308
Done(),
317309

318310
NewUnaryMiddleware().
319311
WithName(DefaultMiddlewareGRPCLog).
320312
WithInterceptor(selector.UnaryServerInterceptor(
321313
grpclog.UnaryServerInterceptor(InterceptorLogger(opts.Logger), determineEventsToLog(opts), defaultCodeToLevel, durationFieldOption, traceIDFieldOption),
322314
selector.MatchFunc(doesNotMatchRoute(healthCheckRoute)))).
323-
EnsureAlreadyExecuted(DefaultMiddlewareNodeID).
324315
Done(),
325316

326317
NewUnaryMiddleware().
@@ -375,25 +366,18 @@ func DefaultStreamingMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.St
375366
WithInterceptor(logmw.StreamServerInterceptor(logmw.ExtractMetadataField(string(requestmeta.RequestIDKey), "requestID"))).
376367
Done(),
377368

378-
NewStreamMiddleware().
379-
WithName(DefaultMiddlewareNodeID).
380-
WithInterceptor(nodeid.StreamServerInterceptor("")).
381-
Done(),
382-
383369
NewStreamMiddleware().
384370
WithName(DefaultMiddlewareGRPCLog + "-debug").
385371
WithInterceptor(selector.StreamServerInterceptor(
386372
grpclog.StreamServerInterceptor(InterceptorLogger(opts.Logger), determineEventsToLog(opts), alwaysDebugOption, durationFieldOption, traceIDFieldOption),
387373
selector.MatchFunc(matchesRoute(healthCheckRoute)))).
388-
EnsureInterceptorAlreadyExecuted(DefaultMiddlewareNodeID).
389374
Done(),
390375

391376
NewStreamMiddleware().
392377
WithName(DefaultMiddlewareGRPCLog).
393378
WithInterceptor(selector.StreamServerInterceptor(
394379
grpclog.StreamServerInterceptor(InterceptorLogger(opts.Logger), determineEventsToLog(opts), defaultCodeToLevel, durationFieldOption, traceIDFieldOption),
395380
selector.MatchFunc(doesNotMatchRoute(healthCheckRoute)))).
396-
EnsureInterceptorAlreadyExecuted(DefaultMiddlewareNodeID).
397381
Done(),
398382

399383
NewStreamMiddleware().
@@ -454,7 +438,6 @@ func DefaultDispatchMiddleware(logger zerolog.Logger, authFunc grpcauth.AuthFunc
454438
grpcMetricsUnaryInterceptor, grpcMetricsStreamingInterceptor := GRPCMetrics(disableGRPCLatencyHistogram)
455439
return []grpc.UnaryServerInterceptor{
456440
requestid.UnaryServerInterceptor(requestid.GenerateIfMissing(true)),
457-
nodeid.UnaryServerInterceptor(""),
458441
logmw.UnaryServerInterceptor(logmw.ExtractMetadataField(string(requestmeta.RequestIDKey), "requestID")),
459442
grpclog.UnaryServerInterceptor(InterceptorLogger(logger), dispatchDefaultCodeToLevel, durationFieldOption, traceIDFieldOption),
460443
grpcMetricsUnaryInterceptor,
@@ -465,7 +448,6 @@ func DefaultDispatchMiddleware(logger zerolog.Logger, authFunc grpcauth.AuthFunc
465448
// NOTE: the logging middlewares are not present here in streaming, to remove their significant overhead
466449
// when returning streaming messages.
467450
requestid.StreamServerInterceptor(requestid.GenerateIfMissing(true)),
468-
nodeid.StreamServerInterceptor(""),
469451
grpcMetricsStreamingInterceptor,
470452
grpcauth.StreamServerInterceptor(authFunc),
471453
datastoremw.StreamServerInterceptor(ds),

pkg/middleware/nodeid/nodeid.go

Lines changed: 5 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
11
package nodeid
22

33
import (
4-
"context"
54
"encoding/hex"
65
"os"
76

87
"github.com/cespare/xxhash/v2"
9-
middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2"
108
"github.com/rs/zerolog/log"
11-
"google.golang.org/grpc"
129
)
1310

1411
const spiceDBPrefix = "spicedb:"
1512

16-
type ctxKeyType struct{}
17-
18-
var nodeIDKey ctxKeyType = struct{}{}
19-
20-
type nodeIDHandle struct {
21-
nodeID string
22-
}
23-
24-
var defaultNodeID string
13+
var computedNodeID string
2514

2615
func init() {
2716
hostname, err := os.Hostname()
@@ -37,66 +26,10 @@ func init() {
3726
return
3827
}
3928

40-
defaultNodeID = spiceDBPrefix + hex.EncodeToString(hasher.Sum(nil))
41-
}
42-
43-
// ContextWithHandle adds a placeholder to a context that will later be
44-
// filled by the Node ID.
45-
func ContextWithHandle(ctx context.Context) context.Context {
46-
return context.WithValue(ctx, nodeIDKey, &nodeIDHandle{})
29+
computedNodeID = spiceDBPrefix + hex.EncodeToString(hasher.Sum(nil))
4730
}
4831

49-
// FromContext reads the node's ID out of a context.Context.
50-
func FromContext(ctx context.Context) (string, error) {
51-
if c := ctx.Value(nodeIDKey); c != nil {
52-
handle := c.(*nodeIDHandle)
53-
if handle.nodeID != "" {
54-
return handle.nodeID, nil
55-
}
56-
}
57-
58-
if err := setInContext(ctx, defaultNodeID); err != nil {
59-
return "", err
60-
}
61-
62-
return defaultNodeID, nil
63-
}
64-
65-
// setInContext adds a node ID to the given context
66-
func setInContext(ctx context.Context, nodeID string) error {
67-
handle := ctx.Value(nodeIDKey)
68-
if handle == nil {
69-
return nil
70-
}
71-
handle.(*nodeIDHandle).nodeID = nodeID
72-
return nil
73-
}
74-
75-
// UnaryServerInterceptor returns a new unary server interceptor that adds the
76-
// node ID to the context. If empty, spicedb:$hostname is used.
77-
func UnaryServerInterceptor(nodeID string) grpc.UnaryServerInterceptor {
78-
return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
79-
newCtx := ContextWithHandle(ctx)
80-
if nodeID != "" {
81-
if err := setInContext(newCtx, nodeID); err != nil {
82-
return nil, err
83-
}
84-
}
85-
return handler(newCtx, req)
86-
}
87-
}
88-
89-
// StreamServerInterceptor returns a new stream server interceptor that adds the
90-
// node ID to the context. If empty, spicedb:$hostname is used.
91-
func StreamServerInterceptor(nodeID string) grpc.StreamServerInterceptor {
92-
return func(srv any, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
93-
wrapped := middleware.WrapServerStream(stream)
94-
wrapped.WrappedContext = ContextWithHandle(wrapped.WrappedContext)
95-
if nodeID != "" {
96-
if err := setInContext(wrapped.WrappedContext, nodeID); err != nil {
97-
return err
98-
}
99-
}
100-
return handler(srv, wrapped)
101-
}
32+
// Get returns the hostname.
33+
func Get() string {
34+
return computedNodeID
10235
}

0 commit comments

Comments
 (0)