github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/dbnode/runtime/types.go (about)

     1  // Copyright (c) 2017 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package runtime
    22  
    23  import (
    24  	"time"
    25  
    26  	"github.com/m3db/m3/src/dbnode/ratelimit"
    27  	"github.com/m3db/m3/src/dbnode/topology"
    28  	xresource "github.com/m3db/m3/src/x/resource"
    29  )
    30  
    31  // Options is a set of runtime options.
    32  type Options interface {
    33  	// Validate will validate the runtime options are valid.
    34  	Validate() error
    35  
    36  	// SetPersistRateLimitOptions sets the persist rate limit options
    37  	SetPersistRateLimitOptions(value ratelimit.Options) Options
    38  
    39  	// PersistRateLimitOptions returns the persist rate limit options
    40  	PersistRateLimitOptions() ratelimit.Options
    41  
    42  	// SetWriteNewSeriesAsync sets whether to write new series asynchronously or not,
    43  	// when true this essentially makes writes for new series eventually consistent
    44  	// as after a write is finished you are not guaranteed to read it back immediately
    45  	// due to inserts into the shard map being buffered. The write is however written
    46  	// to the commit log before completing so it is considered durable.
    47  	SetWriteNewSeriesAsync(value bool) Options
    48  
    49  	// WriteNewSeriesAsync returns whether to write new series asynchronously or not,
    50  	// when true this essentially makes writes for new series eventually consistent
    51  	// as after a write is finished you are not guaranteed to read it back immediately
    52  	// due to inserts into the shard map being buffered. The write is however written
    53  	// to the commit log before completing so it is considered durable.
    54  	WriteNewSeriesAsync() bool
    55  
    56  	// SetWriteNewSeriesBackoffDuration sets the insert backoff duration during
    57  	// periods of heavy insertions, this backoff helps gather larger batches
    58  	// to insert into a shard in a single batch requiring far less write lock
    59  	// acquisitions.
    60  	SetWriteNewSeriesBackoffDuration(value time.Duration) Options
    61  
    62  	// WriteNewSeriesBackoffDuration returns the insert backoff duration during
    63  	// periods of heavy insertions, this backoff helps gather larger batches
    64  	// to insert into a shard in a single batch requiring far less write lock
    65  	// acquisitions.
    66  	WriteNewSeriesBackoffDuration() time.Duration
    67  
    68  	// SetWriteNewSeriesLimitPerShardPerSecond sets the insert rate limit per second,
    69  	// setting to zero disables any rate limit for new series insertions. This rate
    70  	// limit is primarily offered to defend against unintentional bursts of new
    71  	// time series being inserted.
    72  	SetWriteNewSeriesLimitPerShardPerSecond(value int) Options
    73  
    74  	// WriteNewSeriesLimitPerShardPerSecond returns the insert rate limit per second,
    75  	// setting to zero disables any rate limit for new series insertions. This rate
    76  	// limit is primarily offered to defend against unintentional bursts of new
    77  	// time series being inserted.
    78  	WriteNewSeriesLimitPerShardPerSecond() int
    79  
    80  	// SetEncodersPerBlockLimit sets the maximum number of encoders per block
    81  	// allowed. Setting to zero means an unlimited number of encoders are
    82  	// permitted. This rate limit is primarily offered to defend against
    83  	// bursts of out of order writes, which creates many encoders, subsequently
    84  	// causing a large burst in CPU load when trying to merge them.
    85  	SetEncodersPerBlockLimit(value int) Options
    86  
    87  	// EncodersPerBlockLimit sets the maximum number of encoders per block
    88  	// allowed. Setting to zero means an unlimited number of encoders are
    89  	// permitted. This rate limit is primarily offered to defend against
    90  	// bursts of out of order writes, which creates many encoders, subsequently
    91  	// causing a large burst in CPU load when trying to merge them.
    92  	EncodersPerBlockLimit() int
    93  
    94  	// SetTickSeriesBatchSize sets the batch size to process series together
    95  	// during a tick before yielding and sleeping the per series duration
    96  	// multiplied by the batch size.
    97  	// The higher this value is the more variable CPU utilization will be
    98  	// but the shorter ticks will ultimately be.
    99  	SetTickSeriesBatchSize(value int) Options
   100  
   101  	// TickSeriesBatchSize returns the batch size to process series together
   102  	// during a tick before yielding and sleeping the per series duration
   103  	// multiplied by the batch size.
   104  	// The higher this value is the more variable CPU utilization will be
   105  	// but the shorter ticks will ultimately be.
   106  	TickSeriesBatchSize() int
   107  
   108  	// SetTickPerSeriesSleepDuration sets the tick sleep per series value that
   109  	// provides a constant duration to sleep per series at the end of processing
   110  	// a batch of series during a background tick, this can directly effect how
   111  	// fast a block is persisted after is rotated from the mutable series buffer
   112  	// to a series block (since all series need to be merged/processed before a
   113  	// persist can occur).
   114  	SetTickPerSeriesSleepDuration(value time.Duration) Options
   115  
   116  	// TickPerSeriesSleepDuration returns the tick sleep per series value that
   117  	// provides a constant duration to sleep per series at the end of processing
   118  	// a batch of series during a background tick, this can directly effect how
   119  	// fast a block is persisted after is rotated from the mutable series buffer
   120  	// to a series block (since all series need to be merged/processed before a
   121  	// persist can occur).
   122  	TickPerSeriesSleepDuration() time.Duration
   123  
   124  	// SetTickMinimumInterval sets the minimum tick interval to run ticks, this
   125  	// helps throttle the tick when the amount of series is low and the sleeps
   126  	// on a per series basis is short.
   127  	SetTickMinimumInterval(value time.Duration) Options
   128  
   129  	// TickMinimumInterval returns the minimum tick interval to run ticks, this
   130  	// helps throttle the tick when the amount of series is low and the sleeps
   131  	// on a per series basis is short.
   132  	TickMinimumInterval() time.Duration
   133  
   134  	// SetMaxWiredBlocks sets the max blocks to keep wired; zero is used
   135  	// to specify no limit. Wired blocks that are in the buffer, I.E are
   136  	// being written to, cannot be unwired. Similarly, blocks which have
   137  	// just been rotated out of the buffer but have not been flushed yet
   138  	// can also not be unwired. This means that the limit is best effort.
   139  	SetMaxWiredBlocks(value uint) Options
   140  
   141  	// MaxWiredBlocks returns the max blocks to keep wired, zero is used
   142  	// to specify no limit. Wired blocks that are in the buffer, I.E are
   143  	// being written to, cannot be unwired. Similarly, blocks which have
   144  	// just been rotated out of the buffer but have not been flushed yet
   145  	// can also not be unwired. This means that the limit is best effort.
   146  	MaxWiredBlocks() uint
   147  
   148  	// SetClientBootstrapConsistencyLevel sets the client bootstrap
   149  	// consistency level used when bootstrapping from peers. Setting this
   150  	// will take effect immediately, and as such can be used to finish a
   151  	// bootstrap in an unhealthy cluster to recover read capability by setting
   152  	// this value to ReadConsistencyLevelNone.
   153  	SetClientBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) Options
   154  
   155  	// ClientBootstrapConsistencyLevel returns the client bootstrap
   156  	// consistency level used when bootstrapping from peers. Setting this
   157  	// will take effect immediately, and as such can be used to finish a
   158  	// bootstrap in an unhealthy cluster to recover read capability by setting
   159  	// this value to ReadConsistencyLevelNone.
   160  	ClientBootstrapConsistencyLevel() topology.ReadConsistencyLevel
   161  
   162  	// SetClientReadConsistencyLevel sets the client read consistency level
   163  	// used when fetching data from peers for coordinated reads
   164  	SetClientReadConsistencyLevel(value topology.ReadConsistencyLevel) Options
   165  
   166  	// ClientReadConsistencyLevel returns the client read consistency level
   167  	// used when fetching data from peers for coordinated reads
   168  	ClientReadConsistencyLevel() topology.ReadConsistencyLevel
   169  
   170  	// SetClientWriteConsistencyLevel sets the client write consistency level
   171  	// used when fetching data from peers for coordinated writes
   172  	SetClientWriteConsistencyLevel(value topology.ConsistencyLevel) Options
   173  
   174  	// ClientWriteConsistencyLevel returns the client write consistency level
   175  	// used when fetching data from peers for coordinated writes
   176  	ClientWriteConsistencyLevel() topology.ConsistencyLevel
   177  
   178  	// SetTickCancellationCheckInterval sets the interval to check whether the tick
   179  	// has been canceled. This duration also affects the minimum tick duration.
   180  	SetTickCancellationCheckInterval(value time.Duration) Options
   181  
   182  	// TickCancellationCheckInterval is the interval to check whether the tick
   183  	// has been canceled. This duration also affects the minimum tick duration.
   184  	TickCancellationCheckInterval() time.Duration
   185  }
   186  
   187  // OptionsManager updates and supplies runtime options.
   188  type OptionsManager interface {
   189  	// Update updates the current runtime options.
   190  	Update(value Options) error
   191  
   192  	// Get returns the current values.
   193  	Get() Options
   194  
   195  	// RegisterListener registers a listener for updates to runtime options,
   196  	// it will synchronously call back the listener when this method is called
   197  	// to deliver the current set of runtime options.
   198  	RegisterListener(l OptionsListener) xresource.SimpleCloser
   199  
   200  	// Close closes the watcher and all descendent watches.
   201  	Close()
   202  }
   203  
   204  // OptionsListener listens for updates to runtime options.
   205  type OptionsListener interface {
   206  	// SetRuntimeOptions is called when the listener is registered
   207  	// and when any updates occurred passing the new runtime options.
   208  	SetRuntimeOptions(value Options)
   209  }