6
6
"time"
7
7
8
8
"github.com/chroma-core/chroma/go/pkg/grpcutils"
9
-
9
+ "github.com/chroma-core/chroma/go/pkg/leader"
10
10
"github.com/chroma-core/chroma/go/pkg/memberlist_manager"
11
11
"github.com/chroma-core/chroma/go/pkg/proto/coordinatorpb"
12
12
"github.com/chroma-core/chroma/go/pkg/sysdb/coordinator"
@@ -92,6 +92,48 @@ func New(config Config) (*Server, error) {
92
92
}
93
93
}
94
94
95
+ func StartMemberListManagers (leaderCtx context.Context , config Config ) error {
96
+ namespace := config .KubernetesNamespace
97
+
98
+ // Store managers for cleanup
99
+ managers := []struct {
100
+ serviceType string
101
+ manager * memberlist_manager.MemberlistManager
102
+ memberlistName string
103
+ podLabel string
104
+ }{
105
+ {"query" , nil , config .QueryServiceMemberlistName , config .QueryServicePodLabel },
106
+ {"compaction" , nil , config .CompactionServiceMemberlistName , config .CompactionServicePodLabel },
107
+ {"garbage_collection" , nil , config .GarbageCollectionServiceMemberlistName , config .GarbageCollectionServicePodLabel },
108
+ {"log" , nil , config .LogServiceMemberlistName , config .LogServicePodLabel },
109
+ }
110
+
111
+ for i , m := range managers {
112
+ manager , err := createMemberlistManager (namespace , m .memberlistName , m .podLabel , config .WatchInterval , config .ReconcileInterval , config .ReconcileCount )
113
+ if err != nil {
114
+ log .Error ("Failed to create memberlist manager for service" , zap .String ("service" , m .serviceType ), zap .Error (err ))
115
+ return err
116
+ }
117
+ managers [i ].manager = manager
118
+ }
119
+
120
+ // Start all memberlist managers
121
+ for _ , m := range managers {
122
+ if err := m .manager .Start (); err != nil {
123
+ log .Error ("Failed to start memberlist manager for service" , zap .String ("service" , m .serviceType ), zap .Error (err ))
124
+ }
125
+ }
126
+
127
+ // Wait for context cancellation (leadership lost)
128
+ <- leaderCtx .Done ()
129
+
130
+ // Stop all memberlist managers
131
+ for _ , m := range managers {
132
+ m .manager .Stop ()
133
+ }
134
+ return nil
135
+ }
136
+
95
137
func NewWithGrpcProvider (config Config , provider grpcutils.GrpcProvider ) (* Server , error ) {
96
138
log .Info ("Creating new GRPC server with config" , zap .Any ("config" , config ))
97
139
ctx := context .Background ()
@@ -110,54 +152,14 @@ func NewWithGrpcProvider(config Config, provider grpcutils.GrpcProvider) (*Serve
110
152
}
111
153
s .coordinator = * coordinator
112
154
if ! config .Testing {
113
- namespace := config .KubernetesNamespace
114
- // Create memberlist manager for query service
115
- queryMemberlistManager , err := createMemberlistManager (namespace , config .QueryServiceMemberlistName , config .QueryServicePodLabel , config .WatchInterval , config .ReconcileInterval , config .ReconcileCount )
116
- if err != nil {
117
- return nil , err
118
- }
119
-
120
- // Create memberlist manager for compaction service
121
- compactionMemberlistManager , err := createMemberlistManager (namespace , config .CompactionServiceMemberlistName , config .CompactionServicePodLabel , config .WatchInterval , config .ReconcileInterval , config .ReconcileCount )
122
- if err != nil {
123
- return nil , err
124
- }
125
-
126
- // Create memberlist manager for garbage collection service
127
- garbageCollectionMemberlistManager , err := createMemberlistManager (namespace , config .GarbageCollectionServiceMemberlistName , config .GarbageCollectionServicePodLabel , config .WatchInterval , config .ReconcileInterval , config .ReconcileCount )
128
- if err != nil {
129
- return nil , err
130
- }
131
-
132
- // Create memberlist manager for log service
133
- logServiceMemberlistManager , err := createMemberlistManager (namespace , config .LogServiceMemberlistName , config .LogServicePodLabel , config .WatchInterval , config .ReconcileInterval , config .ReconcileCount )
134
- if err != nil {
135
- return nil , err
136
- }
137
-
138
- // Start the memberlist manager for query service
139
- err = queryMemberlistManager .Start ()
140
- if err != nil {
141
- return nil , err
142
- }
143
- // Start the memberlist manager for compaction service
144
- err = compactionMemberlistManager .Start ()
145
- if err != nil {
146
- return nil , err
147
- }
148
-
149
- // Start the memberlist manager for garbage collection service
150
- err = garbageCollectionMemberlistManager .Start ()
151
- if err != nil {
152
- return nil , err
153
- }
154
-
155
- // Start the memberlist manager for log service
156
- err = logServiceMemberlistManager .Start ()
157
- if err != nil {
158
- return nil , err
159
- }
160
-
155
+ // Start leader election for memberlist management
156
+ go leader .AcquireLeaderLock (context .Background (), func (leaderCtx context.Context ) {
157
+ log .Info ("Acquired leadership for memberlist management" )
158
+ if err := StartMemberListManagers (leaderCtx , config ); err != nil {
159
+ log .Error ("Failed to start memberlist manager" , zap .Error (err ))
160
+ }
161
+ log .Info ("Released leadership for memberlist management" )
162
+ })
161
163
log .Info ("Starting GRPC server" )
162
164
s .grpcServer , err = provider .StartGrpcServer ("coordinator" , config .GrpcConfig , func (registrar grpc.ServiceRegistrar ) {
163
165
coordinatorpb .RegisterSysDBServer (registrar , s )
0 commit comments