@@ -76,6 +76,7 @@ type ConsulService struct {
76
76
77
77
trackedTasks map [string ]* trackedTask
78
78
serviceStates map [string ]string
79
+ allocToService map [string ][]string
79
80
trackedTskLock sync.Mutex
80
81
}
81
82
@@ -130,12 +131,13 @@ func NewConsulService(config *consulServiceConfig) (*ConsulService, error) {
130
131
}
131
132
132
133
consulService := ConsulService {
133
- client : & consulApiClient {client : c },
134
- logger : config .logger ,
135
- node : config .node ,
136
- trackedTasks : make (map [string ]* trackedTask ),
137
- serviceStates : make (map [string ]string ),
138
- shutdownCh : make (chan struct {}),
134
+ client : & consulApiClient {client : c },
135
+ logger : config .logger ,
136
+ node : config .node ,
137
+ trackedTasks : make (map [string ]* trackedTask ),
138
+ serviceStates : make (map [string ]string ),
139
+ allocToService : make (map [string ][]string ),
140
+ shutdownCh : make (chan struct {}),
139
141
}
140
142
141
143
return & consulService , nil
@@ -148,8 +150,18 @@ func (c *ConsulService) Register(task *structs.Task, alloc *structs.Allocation)
148
150
c .trackedTskLock .Lock ()
149
151
tt := & trackedTask {task : task , alloc : alloc }
150
152
c .trackedTasks [fmt .Sprintf ("%s-%s" , alloc .ID , task .Name )] = tt
153
+
154
+ // Delete any previously registered service as the same alloc is being
155
+ // re-registered.
156
+ for _ , service := range c .allocToService [alloc .ID ] {
157
+ delete (c .serviceStates , service )
158
+ }
151
159
c .trackedTskLock .Unlock ()
160
+
152
161
for _ , service := range task .Services {
162
+ // Track the services this alloc is registering.
163
+ c .allocToService [alloc .ID ] = append (c .allocToService [alloc .ID ], service .Name )
164
+
153
165
c .logger .Printf ("[INFO] consul: registering service %s with consul." , service .Name )
154
166
if err := c .registerService (service , task , alloc ); err != nil {
155
167
mErr .Errors = append (mErr .Errors , err )
@@ -165,6 +177,7 @@ func (c *ConsulService) Deregister(task *structs.Task, alloc *structs.Allocation
165
177
var mErr multierror.Error
166
178
c .trackedTskLock .Lock ()
167
179
delete (c .trackedTasks , fmt .Sprintf ("%s-%s" , alloc .ID , task .Name ))
180
+ delete (c .allocToService , alloc .ID )
168
181
c .trackedTskLock .Unlock ()
169
182
for _ , service := range task .Services {
170
183
serviceID := alloc .Services [service .Name ]
@@ -229,14 +242,14 @@ func (c *ConsulService) performSync() {
229
242
// Add new services which Consul agent isn't aware of
230
243
knownServices [serviceID ] = struct {}{}
231
244
if _ , ok := consulServices [serviceID ]; ! ok {
232
- c .printLogMessage ("[INFO] consul: registering service %s with consul." , service .Name )
245
+ c .printLogMessage ("[INFO] consul: perform sync, registering service %s with consul." , service .Name )
233
246
c .registerService (service , trackedTask .task , trackedTask .alloc )
234
247
continue
235
248
}
236
249
237
250
// If a service has changed, re-register it with Consul agent
238
251
if service .Hash () != c .serviceStates [serviceID ] {
239
- c .printLogMessage ("[INFO] consul: reregistering service %s with consul." , service .Name )
252
+ c .printLogMessage ("[INFO] consul: perform sync hash change, reregistering service %s with consul." , service .Name )
240
253
c .registerService (service , trackedTask .task , trackedTask .alloc )
241
254
continue
242
255
}
@@ -268,7 +281,7 @@ func (c *ConsulService) performSync() {
268
281
for _ , consulService := range consulServices {
269
282
if _ , ok := knownServices [consulService .ID ]; ! ok {
270
283
delete (c .serviceStates , consulService .ID )
271
- c .printLogMessage ("[INFO] consul: deregistering service %v with consul" , consulService .Service )
284
+ c .printLogMessage ("[INFO] consul: perform sync, deregistering service %v with consul" , consulService .Service )
272
285
c .deregisterService (consulService .ID )
273
286
}
274
287
}
0 commit comments