// addInternal adds the replica the queue with specified priority. If // the replica is already queued, updates the existing // priority. Expects the queue lock to be held by caller. func (bq *baseQueue) addInternal( ctx context.Context, desc *roachpb.RangeDescriptor, should bool, priority float64, ) (bool, error) { if bq.mu.stopped { return false, errQueueStopped } if bq.mu.disabled { log.Event(ctx, "queue disabled") return false, errQueueDisabled } if !desc.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[desc.RangeID]; ok { return false, nil } item, ok := bq.mu.replicas[desc.RangeID] if !should { if ok { log.Eventf(ctx, "%s: removing from queue", item.value) bq.remove(item) } return false, errReplicaNotAddable } else if ok { if item.priority != priority { log.Eventf(ctx, "%s: updating priority: %0.3f -> %0.3f", desc, item.priority, priority) } // Replica has already been added; update priority. bq.mu.priorityQ.update(item, priority) return false, nil } log.VEventf(ctx, 3, "%s: adding: priority=%0.3f", desc, priority) item = &replicaItem{value: desc.RangeID, priority: priority} bq.add(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 }