github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/kv/kvserver/queue_helpers_testutil.go (about) 1 // Copyright 2019 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package kvserver 12 13 import ( 14 "context" 15 16 "github.com/cockroachdb/cockroach/pkg/util/log" 17 "github.com/cockroachdb/errors" 18 ) 19 20 // Code in this file is for testing usage only. It is exported only because it 21 // is called from outside of the package. 22 23 func (bq *baseQueue) testingAdd( 24 ctx context.Context, repl replicaInQueue, priority float64, 25 ) (bool, error) { 26 return bq.addInternal(ctx, repl.Desc(), repl.ReplicaID(), priority) 27 } 28 29 func forceScanAndProcess(s *Store, q *baseQueue) error { 30 // Check that the system config is available. It is needed by many queues. If 31 // it's not available, some queues silently fail to process any replicas, 32 // which is undesirable for this method. 33 if cfg := s.Gossip().GetSystemConfig(); cfg == nil { 34 return errors.Errorf("system config not available in gossip") 35 } 36 37 newStoreReplicaVisitor(s).Visit(func(repl *Replica) bool { 38 q.maybeAdd(context.Background(), repl, s.cfg.Clock.Now()) 39 return true 40 }) 41 42 q.DrainQueue(s.stopper) 43 return nil 44 } 45 46 func mustForceScanAndProcess(ctx context.Context, s *Store, q *baseQueue) { 47 if err := forceScanAndProcess(s, q); err != nil { 48 log.Fatalf(ctx, "%v", err) 49 } 50 } 51 52 // ForceReplicationScanAndProcess iterates over all ranges and 53 // enqueues any that need to be replicated. 54 func (s *Store) ForceReplicationScanAndProcess() error { 55 return forceScanAndProcess(s, s.replicateQueue.baseQueue) 56 } 57 58 // MustForceReplicaGCScanAndProcess iterates over all ranges and enqueues any that 59 // may need to be GC'd. 60 func (s *Store) MustForceReplicaGCScanAndProcess() { 61 mustForceScanAndProcess(context.TODO(), s, s.replicaGCQueue.baseQueue) 62 } 63 64 // MustForceMergeScanAndProcess iterates over all ranges and enqueues any that 65 // may need to be merged. 66 func (s *Store) MustForceMergeScanAndProcess() { 67 mustForceScanAndProcess(context.TODO(), s, s.mergeQueue.baseQueue) 68 } 69 70 // ForceSplitScanAndProcess iterates over all ranges and enqueues any that 71 // may need to be split. 72 func (s *Store) ForceSplitScanAndProcess() error { 73 return forceScanAndProcess(s, s.splitQueue.baseQueue) 74 } 75 76 // MustForceRaftLogScanAndProcess iterates over all ranges and enqueues any that 77 // need their raft logs truncated and then process each of them. 78 func (s *Store) MustForceRaftLogScanAndProcess() { 79 mustForceScanAndProcess(context.TODO(), s, s.raftLogQueue.baseQueue) 80 } 81 82 // ForceTimeSeriesMaintenanceQueueProcess iterates over all ranges, enqueuing 83 // any that need time series maintenance, then processes the time series 84 // maintenance queue. 85 func (s *Store) ForceTimeSeriesMaintenanceQueueProcess() error { 86 return forceScanAndProcess(s, s.tsMaintenanceQueue.baseQueue) 87 } 88 89 // ForceRaftSnapshotQueueProcess iterates over all ranges, enqueuing 90 // any that need raft snapshots, then processes the raft snapshot 91 // queue. 92 func (s *Store) ForceRaftSnapshotQueueProcess() error { 93 return forceScanAndProcess(s, s.raftSnapshotQueue.baseQueue) 94 } 95 96 // ForceConsistencyQueueProcess runs all the ranges through the consistency 97 // queue. 98 func (s *Store) ForceConsistencyQueueProcess() error { 99 return forceScanAndProcess(s, s.consistencyQueue.baseQueue) 100 } 101 102 // The methods below can be used to control a store's queues. Stopping a queue 103 // is only meant to happen in tests. 104 105 func (s *Store) setGCQueueActive(active bool) { 106 s.gcQueue.SetDisabled(!active) 107 } 108 func (s *Store) setMergeQueueActive(active bool) { 109 s.mergeQueue.SetDisabled(!active) 110 } 111 func (s *Store) setRaftLogQueueActive(active bool) { 112 s.raftLogQueue.SetDisabled(!active) 113 } 114 func (s *Store) setReplicaGCQueueActive(active bool) { 115 s.replicaGCQueue.SetDisabled(!active) 116 } 117 118 // SetReplicateQueueActive controls the replication queue. Only 119 // intended for tests. 120 func (s *Store) SetReplicateQueueActive(active bool) { 121 s.replicateQueue.SetDisabled(!active) 122 } 123 func (s *Store) setSplitQueueActive(active bool) { 124 s.splitQueue.SetDisabled(!active) 125 } 126 func (s *Store) setTimeSeriesMaintenanceQueueActive(active bool) { 127 s.tsMaintenanceQueue.SetDisabled(!active) 128 } 129 func (s *Store) setRaftSnapshotQueueActive(active bool) { 130 s.raftSnapshotQueue.SetDisabled(!active) 131 } 132 func (s *Store) setConsistencyQueueActive(active bool) { 133 s.consistencyQueue.SetDisabled(!active) 134 } 135 func (s *Store) setScannerActive(active bool) { 136 s.scanner.SetDisabled(!active) 137 }