consul/state: remove checks during service deregistration
This commit is contained in:
parent
db1bcdc863
commit
5bb69db6b3
|
@ -177,6 +177,23 @@ func checksTableSchema() *memdb.TableSchema {
|
||||||
Lowercase: true,
|
Lowercase: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"node_service": &memdb.IndexSchema{
|
||||||
|
Name: "node_service",
|
||||||
|
AllowMissing: true,
|
||||||
|
Unique: false,
|
||||||
|
Indexer: &memdb.CompoundIndex{
|
||||||
|
Indexes: []memdb.Indexer{
|
||||||
|
&memdb.StringFieldIndex{
|
||||||
|
Field: "Node",
|
||||||
|
Lowercase: true,
|
||||||
|
},
|
||||||
|
&memdb.StringFieldIndex{
|
||||||
|
Field: "ServiceID",
|
||||||
|
Lowercase: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,6 +321,20 @@ func (s *StateStore) deleteNodeServiceTxn(idx uint64, nodeID, serviceID string,
|
||||||
return fmt.Errorf("failed service lookup: %s", err)
|
return fmt.Errorf("failed service lookup: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete any checks associated with the service
|
||||||
|
checks, err := tx.Get("checks", "node_service", nodeID, serviceID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed service check lookup: %s", err)
|
||||||
|
}
|
||||||
|
for check := checks.Next(); check != nil; check = checks.Next() {
|
||||||
|
if err := tx.Delete("checks", check); err != nil {
|
||||||
|
return fmt.Errorf("failed deleting service check: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := tx.Insert("index", &IndexEntry{"checks", idx}); err != nil {
|
||||||
|
return fmt.Errorf("failed updating index: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Delete the service and update the index
|
// Delete the service and update the index
|
||||||
if err := tx.Delete("services", service); err != nil {
|
if err := tx.Delete("services", service); err != nil {
|
||||||
return fmt.Errorf("failed deleting service: %s", err)
|
return fmt.Errorf("failed deleting service: %s", err)
|
||||||
|
|
|
@ -260,17 +260,41 @@ func TestStateStore_DeleteNodeService(t *testing.T) {
|
||||||
t.Fatalf("bad: %#v (err: %#v)", ns, err)
|
t.Fatalf("bad: %#v (err: %#v)", ns, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete the service
|
// Register a check with the service
|
||||||
if err := s.DeleteNodeService(3, "node1", "service1"); err != nil {
|
check := &structs.HealthCheck{
|
||||||
|
Node: "node1",
|
||||||
|
CheckID: "check1",
|
||||||
|
ServiceName: "redis",
|
||||||
|
ServiceID: "service1",
|
||||||
|
}
|
||||||
|
if err := s.EnsureCheck(3, check); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The service doesn't exist and the index was updated
|
// Service check exists
|
||||||
|
checks, err := s.NodeChecks("node1")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
if len(checks) != 1 {
|
||||||
|
t.Fatalf("wrong number of checks: %d", len(checks))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the service
|
||||||
|
if err := s.DeleteNodeService(4, "node1", "service1"); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The service and check don't exist and the index was updated
|
||||||
ns, err = s.NodeServices("node1")
|
ns, err = s.NodeServices("node1")
|
||||||
if err != nil || ns == nil || len(ns.Services) != 0 {
|
if err != nil || ns == nil || len(ns.Services) != 0 {
|
||||||
t.Fatalf("bad: %#v (err: %#v)", ns, err)
|
t.Fatalf("bad: %#v (err: %#v)", ns, err)
|
||||||
}
|
}
|
||||||
if idx := s.maxIndex("services"); idx != 3 {
|
checks, err = s.NodeChecks("node1")
|
||||||
|
if err != nil || len(checks) != 0 {
|
||||||
|
t.Fatalf("bad: %#v (err: %s)", checks, err)
|
||||||
|
}
|
||||||
|
if idx := s.maxIndex("services"); idx != 4 {
|
||||||
t.Fatalf("bad index: %d", idx)
|
t.Fatalf("bad index: %d", idx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue