Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion cli/replicaset/cartridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,14 +245,16 @@ func (c *CartridgeApplication) discovery() (Replicasets, error) {
}
if topology.IsBootstrapped {
if newTopology.IsBootstrapped {
updateInstancesAliases(newTopology.Replicasets, topology.Replicasets)
topology = newTopology
}
} else {
topology = newTopology
}

// Stop if we already found a valid topology.
return topology.IsBootstrapped && !topology.IsCritical, nil
return topology.IsBootstrapped && !topology.IsCritical &&
!hasMissingInstancesAliases(topology.Replicasets), nil
},
))
if err != nil {
Expand All @@ -271,6 +273,37 @@ func (c *CartridgeApplication) discovery() (Replicasets, error) {
return recalculateMasters(replicasets), err
}

// hasMissingInstancesAliases checks if any instance has empty alias.
func hasMissingInstancesAliases(replicasets []Replicaset) bool {
for _, rs := range replicasets {
for _, inst := range rs.Instances {
if len(inst.Alias) == 0 {
return true
}
}
}
return false
}

// updateInstancesAliases tries to update missing instances aliases with another instances data.
func updateInstancesAliases(replicasets, other []Replicaset) {
instAliases := make(map[string]string, 0)
for _, rs := range other {
for _, inst := range rs.Instances {
instAliases[inst.UUID] = inst.Alias
}
}
for i, rs := range replicasets {
for ii, inst := range rs.Instances {
if len(inst.Alias) == 0 {
if alias, ok := instAliases[inst.UUID]; ok && len(alias) > 0 {
replicasets[i].Instances[ii].Alias = alias
}
}
}
}
}

// Promote promotes an instance in the cartridge application.
func (c *CartridgeApplication) Promote(ctx PromoteCtx) error {
replicasets, err := c.Discovery(UseCache)
Expand Down
Loading