// addInternal adds the replica the queue with specified priority. If // the replica is already queued, updates the existing // priority. Expects the queue lock is held by caller. func (bq *baseQueue) addInternal(repl *Replica, should bool, priority float64) (bool, error) { if bq.mu.stopped { return false, errQueueStopped } if bq.mu.disabled { log.Event(bq.ctx, "queue disabled") return false, errQueueDisabled } if !repl.IsInitialized() { // We checked this above in MaybeAdd(), but we need to check it // again for Add(). return false, errors.New("replica not initialized") } // If the replica is currently in purgatory, don't re-add it. if _, ok := bq.mu.purgatory[repl.RangeID]; ok { return false, nil } item, ok := bq.mu.replicas[repl.RangeID] if !should { if ok { log.Eventf(bq.ctx, "%s: removing", item.value) bq.remove(item) } return false, errReplicaNotAddable } else if ok { if item.priority != priority { log.Eventf(bq.ctx, "%s: updating priority: %0.3f -> %0.3f", repl, item.priority, priority) } // Replica has already been added; update priority. bq.mu.priorityQ.update(item, priority) return false, nil } log.VEventf(3, bq.ctx, "%s: adding: priority=%0.3f", repl, priority) item = &replicaItem{value: repl.RangeID, priority: priority} heap.Push(&bq.mu.priorityQ, item) bq.mu.replicas[repl.RangeID] = item // If adding this replica has pushed the queue past its maximum size, // remove the lowest priority element. if pqLen := bq.mu.priorityQ.Len(); pqLen > bq.maxSize { bq.remove(bq.mu.priorityQ[pqLen-1]) } // Signal the processLoop that a replica has been added. select { case bq.incoming <- struct{}{}: default: // No need to signal again. } return true, nil }
// maybeCleanupBootstrapAddresses cleans up the stored bootstrap addresses to // include only those currently available via gossip. The gossip mutex must // be held by the caller. func (g *Gossip) maybeCleanupBootstrapAddressesLocked() { if g.storage == nil || g.hasCleanedBS { return } defer func() { g.hasCleanedBS = true }() log.Event(g.ctx, "cleaning up bootstrap addresses") g.resolvers = g.resolvers[:0] g.resolverIdx = 0 g.bootstrapInfo.Addresses = g.bootstrapInfo.Addresses[:0] g.bootstrapAddrs = map[util.UnresolvedAddr]struct{}{} g.resolverAddrs = map[util.UnresolvedAddr]resolver.Resolver{} g.resolversTried = map[int]struct{}{} var desc roachpb.NodeDescriptor if err := g.mu.is.visitInfos(func(key string, i *Info) error { if strings.HasPrefix(key, KeyNodeIDPrefix) { if err := i.Value.GetProto(&desc); err != nil { return err } if desc.Address == g.mu.is.NodeAddr { return nil } g.maybeAddResolver(desc.Address) g.maybeAddBootstrapAddress(desc.Address) } return nil }); err != nil { log.Error(g.ctx, err) return } if err := g.storage.WriteBootstrapInfo(&g.bootstrapInfo); err != nil { log.Error(g.ctx, err) } }