77 "sync"
88 "time"
99
10+ "open-cluster-management.io/sdk-go/pkg/cloudevents/constants"
1011 "open-cluster-management.io/sdk-go/pkg/cloudevents/server/grpc/heartbeat"
1112 "open-cluster-management.io/sdk-go/pkg/cloudevents/server/grpc/metrics"
1213
@@ -17,6 +18,7 @@ import (
1718 cloudeventstypes "github.com/cloudevents/sdk-go/v2/types"
1819 "github.com/google/uuid"
1920 "google.golang.org/grpc/codes"
21+ "google.golang.org/grpc/metadata"
2022 "google.golang.org/grpc/status"
2123 "google.golang.org/protobuf/types/known/emptypb"
2224 "k8s.io/apimachinery/pkg/util/sets"
@@ -28,7 +30,7 @@ import (
2830 "open-cluster-management.io/sdk-go/pkg/cloudevents/server"
2931)
3032
31- type resourceHandler func (ctx context.Context , res * cloudevents.Event ) error
33+ type resourceHandler func (ctx context.Context , subID string , res * cloudevents.Event ) error
3234
3335// subscriber defines a subscriber that can receive and handle resource spec.
3436type subscriber struct {
@@ -215,7 +217,7 @@ func (bkr *GRPCBroker) Subscribe(subReq *pbv1.SubscriptionRequest, subServer pbv
215217 }
216218 }()
217219
218- subscriberID := bkr .register (ctx , subReq .ClusterName , * dataType , func (ctx context.Context , evt * cloudevents.Event ) error {
220+ subID := bkr .register (ctx , subReq .ClusterName , * dataType , func (ctx context.Context , subID string , evt * cloudevents.Event ) error {
219221 // convert the cloudevents.Event to pbv1.CloudEvent
220222 // WARNING: don't use "pbEvt, err := pb.ToProto(evt)" to convert cloudevent to protobuf
221223 pbEvt := & pbv1.CloudEvent {}
@@ -224,7 +226,7 @@ func (bkr *GRPCBroker) Subscribe(subReq *pbv1.SubscriptionRequest, subServer pbv
224226 }
225227
226228 // send the cloudevent to the subscriber
227- logger .V (4 ).Info ("sending the event to spec subscribers" , "eventContext" , evt .Context )
229+ logger .V (4 ).Info ("sending the event to spec subscribers" , "subID" , subID , " eventContext" , evt .Context )
228230 select {
229231 case eventCh <- pbEvt :
230232 case <- ctx .Done ():
@@ -239,12 +241,19 @@ func (bkr *GRPCBroker) Subscribe(subReq *pbv1.SubscriptionRequest, subServer pbv
239241 return nil
240242 })
241243
244+ // Send initial metadata to signal registration is complete
245+ if err := subServer .SendHeader (metadata .Pairs (constants .GRPCSubscriptionIDKey , subID )); err != nil {
246+ logger .Error (err , "failed to send subscription header, , unregister subscriber" , "subID" , subID )
247+ bkr .unregister (ctx , subID )
248+ return err
249+ }
250+
242251 go heartbeater .Start (ctx )
243252
244253 select {
245254 case err := <- sendErrCh :
246- logger .Error (err , "failed to send event, unregister subscriber" , "id " , subscriberID )
247- bkr .unregister (ctx , subscriberID )
255+ logger .Error (err , "failed to send event, unregister subscriber" , "subID " , subID )
256+ bkr .unregister (ctx , subID )
248257 return err
249258 case <- ctx .Done ():
250259 // The context of the stream has been canceled or completed.
@@ -253,7 +262,7 @@ func (bkr *GRPCBroker) Subscribe(subReq *pbv1.SubscriptionRequest, subServer pbv
253262 // - The server closed the stream, potentially due to a shutdown.
254263 // Regardless of the reason, unregister the subscriber and stop processing.
255264 // No error is returned here because the stream closure is expected.
256- bkr .unregister (ctx , subscriberID )
265+ bkr .unregister (ctx , subID )
257266 return nil
258267 }
259268}
@@ -291,13 +300,14 @@ func (bkr *GRPCBroker) respondResyncSpecRequest(ctx context.Context, eventDataTy
291300 }
292301
293302 if len (objs ) == 0 {
294- log .V (4 ).Info ("there are is no objs from the list , do nothing" )
303+ log .V (4 ).Info ("no objs from the lister , do nothing" , "eventContext" , evt . Context )
295304 return nil
296305 }
297306
298307 for _ , obj := range objs {
299308 // respond with the deleting resource regardless of the resource version
300309 if _ , ok := obj .Extensions ()[types .ExtensionDeletionTimestamp ]; ok {
310+ log .V (4 ).Info ("respond spec resync request" , "eventContext" , evt .Context )
301311 err = bkr .handleRes (ctx , obj , eventDataType , "delete_request" )
302312 if err != nil {
303313 log .Error (err , "failed to handle resync spec request" )
@@ -315,6 +325,7 @@ func (bkr *GRPCBroker) respondResyncSpecRequest(ctx context.Context, eventDataTy
315325 // the version of the work is not maintained on source or the source's work is newer than agent, send
316326 // the newer work to agent
317327 if currentResourceVersion == 0 || int64 (currentResourceVersion ) > lastResourceVersion {
328+ log .V (4 ).Info ("respond spec resync request" , "eventContext" , evt .Context )
318329 err := bkr .handleRes (ctx , obj , eventDataType , "update_request" )
319330 if err != nil {
320331 log .Error (err , "failed to handle resync spec request" )
@@ -341,6 +352,7 @@ func (bkr *GRPCBroker) respondResyncSpecRequest(ctx context.Context, eventDataTy
341352 NewEvent ()
342353
343354 // send a delete event for the current resource
355+ log .V (4 ).Info ("respond spec resync request" , "eventContext" , evt .Context )
344356 err := bkr .handleRes (ctx , & obj , eventDataType , "delete_request" )
345357 if err != nil {
346358 log .Error (err , "failed to handle delete request" )
@@ -374,20 +386,16 @@ func (bkr *GRPCBroker) handleRes(
374386 }
375387 clusterName := fmt .Sprintf ("%s" , clusterNameValue )
376388
377- // checks if the event should be processed by the current instance
378- // by verifying the resource consumer name is in the subscriber list, ensuring the
379- // event will be only processed when the consumer is subscribed to the current broker.
380- if ! bkr .IsConsumerSubscribed (clusterName ) {
381- log .V (4 ).Info ("skip the event since the agent is not subscribed." ,
382- "eventContext" , evt .Context , "clusterName" , clusterName )
383- return nil
384- }
385-
386- for _ , subscriber := range bkr .subscribers {
389+ for id , subscriber := range bkr .subscribers {
390+ // checks if the event should be processed by the current instance
391+ // by verifying the resource consumer name is in the subscriber list, ensuring the
392+ // event will be only processed when the consumer is subscribed to the current broker.
387393 if subscriber .clusterName == clusterName && subscriber .dataType == t {
388- if err := subscriber .handler (ctx , evt ); err != nil {
394+ if err := subscriber .handler (ctx , id , evt ); err != nil {
389395 return err
390396 }
397+ } else {
398+ log .V (4 ).Info ("skip the event since the agent is not subscribed." , "subID" , id , "eventContext" , evt .Context )
391399 }
392400 }
393401 return nil
0 commit comments