@@ -404,14 +404,14 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
404404	registerer  :=  metrics .DefaultRegisterer ()
405405
406406	// dataWarehouse config 
407- 	dataWarehouseConfig , err  :=  s .readDataWarehouseConfig (ctx ,  logger )
407+ 	dataWarehouseConfig , err  :=  s .readDataWarehouseConfig (logger )
408408	if  err  !=  nil  {
409409		logger .Error ("Failed to read dataWarehouse config" , zap .Error (err ))
410410		return  err 
411411	}
412412
413413	// oauth config 
414- 	oAuthConfig , err  :=  s .readOAuthConfig (ctx ,  logger )
414+ 	oAuthConfig , err  :=  s .readOAuthConfig (logger )
415415	if  err  !=  nil  {
416416		logger .Error ("Failed to read OAuth config" , zap .Error (err ))
417417		return  err 
@@ -427,16 +427,17 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
427427	if  err  !=  nil  {
428428		return  err 
429429	}
430- 	// healthCheckService 
431- 	// Use a dedicated context so we can stop the health checker goroutine cleanly during shutdown 
432- 	healthCheckCtx , healthCheckCancel  :=  context .WithCancel (ctx )
433- 	defer  healthCheckCancel () // Ensure cleanup on all paths (including early returns) 
434430
435431	restHealthChecker  :=  health .NewRestChecker (
436432		"" , "" ,
437433		health .WithTimeout (healthCheckTimeout ),
438434		health .WithCheck ("metrics" , metrics .Check ),
439435	)
436+ 
437+ 	// Use a dedicated context so we can stop the health checker goroutine cleanly during shutdown 
438+ 	healthCheckCtx , healthCheckCancel  :=  context .WithCancel (context .Background ())
439+ 	defer  healthCheckCancel ()
440+ 
440441	go  restHealthChecker .Run (healthCheckCtx )
441442	// healthcheckService 
442443	healthcheckServer  :=  rest .NewServer (
@@ -500,13 +501,16 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
500501	if  err  !=  nil  {
501502		return  err 
502503	}
504+ 
505+ 	pubsubCtx , pubsubCancel  :=  context .WithCancel (context .Background ())
506+ 	defer  pubsubCancel ()
503507	// domainTopicPublisher 
504- 	domainTopicPublisher , err  :=  s .createPublisher (ctx , * s .domainTopic , registerer , logger )
508+ 	domainTopicPublisher , err  :=  s .createPublisher (pubsubCtx , * s .domainTopic , registerer , logger )
505509	if  err  !=  nil  {
506510		return  err 
507511	}
508512	// segmentUsersPublisher 
509- 	segmentUsersPublisher , err  :=  s .createPublisher (ctx , * s .bulkSegmentUsersReceivedTopic , registerer , logger )
513+ 	segmentUsersPublisher , err  :=  s .createPublisher (pubsubCtx , * s .bulkSegmentUsersReceivedTopic , registerer , logger )
510514	if  err  !=  nil  {
511515		return  err 
512516	}
@@ -722,7 +726,6 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
722726
723727	// featureService 
724728	featureService , err  :=  s .createFeatureService (
725- 		ctx ,
726729		accountClient ,
727730		experimentClient ,
728731		autoOpsClient ,
@@ -861,18 +864,17 @@ func (s *server) Run(ctx context.Context, metrics metrics.Metrics, logger *zap.L
861864		shutdownStartTime  :=  time .Now ()
862865		logger .Info ("Starting graceful shutdown sequence" )
863866
864- 		// Cancel the health checker goroutines to prevent connection errors during shutdown 
865- 		healthCheckCancel ()
866- 		// Mark as unhealthy so readiness probes fail 
867- 		// This ensures Kubernetes readiness probe fails on next check, 
868- 		// preventing new traffic from being routed to this pod. 
869- 		restHealthChecker .Stop ()
870- 
871867		// Wait for K8s endpoint propagation 
872868		// This prevents "context deadline exceeded" errors during high traffic. 
873869		time .Sleep (propagationDelay )
874870		logger .Info ("Starting HTTP/gRPC server shutdown" )
875871
872+ 		// Mark as unhealthy so readiness probes fail 
873+ 		// This ensures Kubernetes readiness probe fails on next check, 
874+ 		// preventing new traffic from being routed to this pod. 
875+ 		healthcheckServer .Stop (5  *  time .Second )
876+ 		restHealthChecker .Stop ()
877+ 
876878		// Stop REST servers in parallel (these call gRPC servers internally) 
877879		// Stop these first to drain REST traffic before stopping gRPC 
878880		var  restWg  sync.WaitGroup 
@@ -993,9 +995,6 @@ func (s *server) createPublisher(
993995	registerer  metrics.Registerer ,
994996	logger  * zap.Logger ,
995997) (publisher.Publisher , error ) {
996- 	ctx , cancel  :=  context .WithTimeout (ctx , 5 * time .Second )
997- 	defer  cancel ()
998- 
999998	// Create PubSub client using the factory 
1000999	pubSubType  :=  factory .PubSubType (* s .pubSubType )
10011000	factoryOpts  :=  []factory.Option {
@@ -1035,7 +1034,6 @@ func (s *server) createPublisher(
10351034}
10361035
10371036func  (s  * server ) readOAuthConfig (
1038- 	ctx  context.Context ,
10391037	logger  * zap.Logger ,
10401038) (* auth.OAuthConfig , error ) {
10411039	bytes , err  :=  os .ReadFile (* s .oauthConfigPath )
@@ -1129,7 +1127,6 @@ func (s *server) createEnvironmentService(
11291127}
11301128
11311129func  (s  * server ) createFeatureService (
1132- 	ctx  context.Context ,
11331130	accountClient  accountclient.Client ,
11341131	experimentClient  experimentclient.Client ,
11351132	autoOpsClient  autoopsclient.Client ,
@@ -1218,7 +1215,6 @@ func (s *server) createGatewayHandlers() []gatewayapi.HandlerRegistrar {
12181215}
12191216
12201217func  (s  * server ) readDataWarehouseConfig (
1221- 	ctx  context.Context ,
12221218	logger  * zap.Logger ,
12231219) (* DataWarehouseConfig , error ) {
12241220	// If config path is provided, read from file 
0 commit comments