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  }