(instances []InstanceDesc, maxUnavailableZones int, zoneResultsQuorum bool)
| 101 | } |
| 102 | |
| 103 | func newZoneAwareResultTracker(instances []InstanceDesc, maxUnavailableZones int, zoneResultsQuorum bool) *zoneAwareResultTracker { |
| 104 | t := &zoneAwareResultTracker{ |
| 105 | waitingByZone: make(map[string]int), |
| 106 | failuresByZone: make(map[string]int), |
| 107 | maxUnavailableZones: maxUnavailableZones, |
| 108 | numInstances: len(instances), |
| 109 | zoneResultsQuorum: zoneResultsQuorum, |
| 110 | errors: make([]error, 0, len(instances)), |
| 111 | } |
| 112 | |
| 113 | for _, instance := range instances { |
| 114 | t.waitingByZone[instance.Zone]++ |
| 115 | } |
| 116 | t.minSuccessfulZones = len(t.waitingByZone) - maxUnavailableZones |
| 117 | t.resultsPerZone = make(map[string][]any, len(t.waitingByZone)) |
| 118 | t.zoneCount = len(t.waitingByZone) |
| 119 | |
| 120 | return t |
| 121 | } |
| 122 | |
| 123 | func (t *zoneAwareResultTracker) done(instance *InstanceDesc, result any, err error) { |
| 124 | if err != nil { |
no outgoing calls