You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
package filer
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
)
|
|
|
|
type metadataEventSinkKey struct{}
|
|
|
|
// MetadataEventSink captures the last metadata event emitted while serving a
|
|
// request. It is request-scoped and accessed only by the goroutine handling
|
|
// the gRPC call, so no mutex is needed.
|
|
type MetadataEventSink struct {
|
|
last *filer_pb.SubscribeMetadataResponse
|
|
}
|
|
|
|
func WithMetadataEventSink(ctx context.Context) (context.Context, *MetadataEventSink) {
|
|
sink := &MetadataEventSink{}
|
|
return context.WithValue(ctx, metadataEventSinkKey{}, sink), sink
|
|
}
|
|
|
|
func metadataEventSinkFromContext(ctx context.Context) *MetadataEventSink {
|
|
if ctx == nil {
|
|
return nil
|
|
}
|
|
sink, _ := ctx.Value(metadataEventSinkKey{}).(*MetadataEventSink)
|
|
return sink
|
|
}
|
|
|
|
// Record stores the event, replacing any previously recorded one.
|
|
// Each filer RPC emits at most one NotifyUpdateEvent, so only the last
|
|
// event is retained. If an RPC were to emit multiple events, only the
|
|
// final one would be returned to the caller.
|
|
func (s *MetadataEventSink) Record(event *filer_pb.SubscribeMetadataResponse) {
|
|
if s == nil || event == nil {
|
|
return
|
|
}
|
|
s.last = event
|
|
}
|
|
|
|
func (s *MetadataEventSink) Last() *filer_pb.SubscribeMetadataResponse {
|
|
if s == nil {
|
|
return nil
|
|
}
|
|
return s.last
|
|
}
|