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

     1  // Copyright (c) 2016 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 storage
    22  
    23  import (
    24  	"errors"
    25  	"fmt"
    26  	"time"
    27  
    28  	"github.com/m3db/m3/src/dbnode/client"
    29  	"github.com/m3db/m3/src/dbnode/encoding"
    30  	"github.com/m3db/m3/src/dbnode/encoding/m3tsz"
    31  	"github.com/m3db/m3/src/dbnode/namespace"
    32  	"github.com/m3db/m3/src/dbnode/persist"
    33  	"github.com/m3db/m3/src/dbnode/persist/fs"
    34  	"github.com/m3db/m3/src/dbnode/persist/fs/commitlog"
    35  	"github.com/m3db/m3/src/dbnode/retention"
    36  	m3dbruntime "github.com/m3db/m3/src/dbnode/runtime"
    37  	"github.com/m3db/m3/src/dbnode/storage/block"
    38  	"github.com/m3db/m3/src/dbnode/storage/bootstrap"
    39  	"github.com/m3db/m3/src/dbnode/storage/index"
    40  	"github.com/m3db/m3/src/dbnode/storage/limits"
    41  	"github.com/m3db/m3/src/dbnode/storage/limits/permits"
    42  	"github.com/m3db/m3/src/dbnode/storage/repair"
    43  	"github.com/m3db/m3/src/dbnode/storage/series"
    44  	"github.com/m3db/m3/src/dbnode/ts/writes"
    45  	"github.com/m3db/m3/src/dbnode/x/xio"
    46  	"github.com/m3db/m3/src/dbnode/x/xpool"
    47  	"github.com/m3db/m3/src/x/clock"
    48  	"github.com/m3db/m3/src/x/context"
    49  	"github.com/m3db/m3/src/x/ident"
    50  	"github.com/m3db/m3/src/x/instrument"
    51  	"github.com/m3db/m3/src/x/mmap"
    52  	"github.com/m3db/m3/src/x/pool"
    53  	xsync "github.com/m3db/m3/src/x/sync"
    54  )
    55  
    56  const (
    57  	// defaultBytesPoolBucketCapacity is the default bytes buffer capacity for the default bytes pool bucket.
    58  	defaultBytesPoolBucketCapacity = 256
    59  
    60  	// defaultBytesPoolBucketCount is the default count of elements for the default bytes pool bucket.
    61  	defaultBytesPoolBucketCount = 4096
    62  
    63  	// defaultRepairEnabled enables repair by default.
    64  	defaultRepairEnabled = true
    65  
    66  	// defaultErrorWindowForLoad is the default error window for evaluating server load.
    67  	defaultErrorWindowForLoad = 10 * time.Second
    68  
    69  	// defaultErrorThresholdForLoad is the default error threshold for considering server overloaded.
    70  	defaultErrorThresholdForLoad = 1000
    71  
    72  	// defaultIndexingEnabled disables indexing by default.
    73  	defaultIndexingEnabled = false
    74  
    75  	// defaultNumLoadedBytesLimit is the default limit (2GiB) for the number of outstanding loaded bytes that
    76  	// the memory tracker will allow.
    77  	defaultNumLoadedBytesLimit = 2 << 30
    78  
    79  	defaultMediatorTickInterval = 5 * time.Second
    80  )
    81  
    82  var (
    83  	// defaultBootstrapProcessProvider is the default bootstrap provider for the database.
    84  	defaultBootstrapProcessProvider = bootstrap.NewNoOpProcessProvider()
    85  
    86  	// defaultPoolOptions are the pool options used by default.
    87  	defaultPoolOptions pool.ObjectPoolOptions
    88  )
    89  
    90  var (
    91  	errNamespaceInitializerNotSet = errors.New("namespace registry initializer not set")
    92  	errRepairOptionsNotSet        = errors.New("repair enabled but repair options are not set")
    93  	errIndexOptionsNotSet         = errors.New("index enabled but index options are not set")
    94  	errPersistManagerNotSet       = errors.New("persist manager is not set")
    95  	errIndexClaimsManagerNotSet   = errors.New("index claims manager is not set")
    96  	errBlockLeaserNotSet          = errors.New("block leaser is not set")
    97  	errOnColdFlushNotSet          = errors.New("on cold flush is not set, requires at least a no-op implementation")
    98  	errLimitsOptionsNotSet        = errors.New("limits options are not set")
    99  )
   100  
   101  // NewSeriesOptionsFromOptions creates a new set of database series options from provided options.
   102  func NewSeriesOptionsFromOptions(opts Options, ropts retention.Options) series.Options {
   103  	if ropts == nil {
   104  		ropts = retention.NewOptions()
   105  	}
   106  
   107  	return opts.SeriesOptions().
   108  		SetClockOptions(opts.ClockOptions()).
   109  		SetInstrumentOptions(opts.InstrumentOptions()).
   110  		SetRetentionOptions(ropts).
   111  		SetDatabaseBlockOptions(opts.DatabaseBlockOptions()).
   112  		SetCachePolicy(opts.SeriesCachePolicy()).
   113  		SetContextPool(opts.ContextPool()).
   114  		SetEncoderPool(opts.EncoderPool()).
   115  		SetMultiReaderIteratorPool(opts.MultiReaderIteratorPool()).
   116  		SetIdentifierPool(opts.IdentifierPool()).
   117  		SetBufferBucketPool(opts.BufferBucketPool()).
   118  		SetBufferBucketVersionsPool(opts.BufferBucketVersionsPool()).
   119  		SetRuntimeOptionsManager(opts.RuntimeOptionsManager())
   120  }
   121  
   122  type options struct {
   123  	clockOpts                       clock.Options
   124  	instrumentOpts                  instrument.Options
   125  	nsRegistryInitializer           namespace.Initializer
   126  	blockOpts                       block.Options
   127  	commitLogOpts                   commitlog.Options
   128  	runtimeOptsMgr                  m3dbruntime.OptionsManager
   129  	errWindowForLoad                time.Duration
   130  	errThresholdForLoad             int64
   131  	indexingEnabled                 bool
   132  	repairEnabled                   bool
   133  	truncateType                    series.TruncateType
   134  	transformOptions                series.WriteTransformOptions
   135  	indexOpts                       index.Options
   136  	repairOpts                      repair.Options
   137  	newEncoderFn                    encoding.NewEncoderFn
   138  	newDecoderFn                    encoding.NewDecoderFn
   139  	bootstrapProcessProvider        bootstrap.ProcessProvider
   140  	persistManager                  persist.Manager
   141  	indexClaimsManager              fs.IndexClaimsManager
   142  	blockRetrieverManager           block.DatabaseBlockRetrieverManager
   143  	poolOpts                        pool.ObjectPoolOptions
   144  	contextPool                     context.Pool
   145  	seriesCachePolicy               series.CachePolicy
   146  	seriesOpts                      series.Options
   147  	seriesPool                      series.DatabaseSeriesPool
   148  	bytesPool                       pool.CheckedBytesPool
   149  	encoderPool                     encoding.EncoderPool
   150  	segmentReaderPool               xio.SegmentReaderPool
   151  	readerIteratorPool              encoding.ReaderIteratorPool
   152  	multiReaderIteratorPool         encoding.MultiReaderIteratorPool
   153  	identifierPool                  ident.Pool
   154  	fetchBlockMetadataResultsPool   block.FetchBlockMetadataResultsPool
   155  	fetchBlocksMetadataResultsPool  block.FetchBlocksMetadataResultsPool
   156  	writeBatchPool                  *writes.WriteBatchPool
   157  	bufferBucketPool                *series.BufferBucketPool
   158  	bufferBucketVersionsPool        *series.BufferBucketVersionsPool
   159  	retrieveRequestPool             fs.RetrieveRequestPool
   160  	checkedBytesWrapperPool         xpool.CheckedBytesWrapperPool
   161  	schemaReg                       namespace.SchemaRegistry
   162  	blockLeaseManager               block.LeaseManager
   163  	onColdFlush                     OnColdFlush
   164  	forceColdWritesEnabled          bool
   165  	sourceLoggerBuilder             limits.SourceLoggerBuilder
   166  	iterationOptions                index.IterationOptions
   167  	memoryTracker                   MemoryTracker
   168  	mmapReporter                    mmap.Reporter
   169  	doNotIndexWithFieldsMap         map[string]string
   170  	namespaceRuntimeOptsMgrRegistry namespace.RuntimeOptionsManagerRegistry
   171  	mediatorTickInterval            time.Duration
   172  	adminClient                     client.AdminClient
   173  	newBackgroundProcessFns         []NewBackgroundProcessFn
   174  	namespaceHooks                  NamespaceHooks
   175  	tileAggregator                  TileAggregator
   176  	permitsOptions                  permits.Options
   177  	limitsOptions                   limits.Options
   178  	coreFn                          xsync.CoreFn
   179  }
   180  
   181  // NewOptions creates a new set of storage options with defaults.
   182  // NB: expensive, in tests use DefaultTestOptions instead.
   183  func NewOptions() Options {
   184  	return newOptions(defaultPoolOptions)
   185  }
   186  
   187  func newOptions(poolOpts pool.ObjectPoolOptions) Options {
   188  	bytesPool := pool.NewCheckedBytesPool(nil, poolOpts, func(s []pool.Bucket) pool.BytesPool {
   189  		return pool.NewBytesPool(s, poolOpts)
   190  	})
   191  	bytesPool.Init()
   192  	seriesOpts := series.NewOptions()
   193  
   194  	writeBatchPool := writes.NewWriteBatchPool(poolOpts, 0, nil)
   195  	writeBatchPool.Init()
   196  
   197  	segmentReaderPool := xio.NewSegmentReaderPool(poolOpts)
   198  	segmentReaderPool.Init()
   199  
   200  	retrieveRequestPool := fs.NewRetrieveRequestPool(segmentReaderPool, poolOpts)
   201  	retrieveRequestPool.Init()
   202  
   203  	bytesWrapperPool := xpool.NewCheckedBytesWrapperPool(poolOpts)
   204  	bytesWrapperPool.Init()
   205  
   206  	iOpts := instrument.NewOptions()
   207  	o := &options{
   208  		clockOpts:                clock.NewOptions(),
   209  		instrumentOpts:           iOpts,
   210  		blockOpts:                block.NewOptions(),
   211  		commitLogOpts:            commitlog.NewOptions(),
   212  		runtimeOptsMgr:           m3dbruntime.NewOptionsManager(),
   213  		errWindowForLoad:         defaultErrorWindowForLoad,
   214  		errThresholdForLoad:      defaultErrorThresholdForLoad,
   215  		indexingEnabled:          defaultIndexingEnabled,
   216  		indexOpts:                index.NewOptions(),
   217  		repairEnabled:            defaultRepairEnabled,
   218  		repairOpts:               repair.NewOptions(),
   219  		bootstrapProcessProvider: defaultBootstrapProcessProvider,
   220  		poolOpts:                 poolOpts,
   221  		contextPool: context.NewPool(context.NewOptions().
   222  			SetContextPoolOptions(poolOpts).
   223  			SetFinalizerPoolOptions(poolOpts)),
   224  		seriesCachePolicy:       series.DefaultCachePolicy,
   225  		seriesOpts:              seriesOpts,
   226  		seriesPool:              series.NewDatabaseSeriesPool(poolOpts),
   227  		bytesPool:               bytesPool,
   228  		encoderPool:             encoding.NewEncoderPool(poolOpts),
   229  		segmentReaderPool:       segmentReaderPool,
   230  		readerIteratorPool:      encoding.NewReaderIteratorPool(poolOpts),
   231  		multiReaderIteratorPool: encoding.NewMultiReaderIteratorPool(poolOpts),
   232  		identifierPool: ident.NewPool(bytesPool, ident.PoolOptions{
   233  			IDPoolOptions:           poolOpts,
   234  			TagsPoolOptions:         poolOpts,
   235  			TagsIteratorPoolOptions: poolOpts,
   236  		}),
   237  		fetchBlockMetadataResultsPool:   block.NewFetchBlockMetadataResultsPool(poolOpts, 0),
   238  		fetchBlocksMetadataResultsPool:  block.NewFetchBlocksMetadataResultsPool(poolOpts, 0),
   239  		writeBatchPool:                  writeBatchPool,
   240  		bufferBucketVersionsPool:        series.NewBufferBucketVersionsPool(poolOpts),
   241  		bufferBucketPool:                series.NewBufferBucketPool(poolOpts),
   242  		retrieveRequestPool:             retrieveRequestPool,
   243  		checkedBytesWrapperPool:         bytesWrapperPool,
   244  		schemaReg:                       namespace.NewSchemaRegistry(false, nil),
   245  		onColdFlush:                     &noOpColdFlush{},
   246  		memoryTracker:                   NewMemoryTracker(NewMemoryTrackerOptions(defaultNumLoadedBytesLimit)),
   247  		namespaceRuntimeOptsMgrRegistry: namespace.NewRuntimeOptionsManagerRegistry(),
   248  		mediatorTickInterval:            defaultMediatorTickInterval,
   249  		namespaceHooks:                  &noopNamespaceHooks{},
   250  		tileAggregator:                  &noopTileAggregator{},
   251  		permitsOptions:                  permits.NewOptions(),
   252  		limitsOptions:                   limits.DefaultLimitsOptions(iOpts),
   253  		coreFn:                          xsync.CPUCore,
   254  	}
   255  	return o.SetEncodingM3TSZPooled()
   256  }
   257  
   258  func (o *options) Validate() error {
   259  	// validate namespace registry
   260  	init := o.NamespaceInitializer()
   261  	if init == nil {
   262  		return errNamespaceInitializerNotSet
   263  	}
   264  
   265  	// validate commit log options
   266  	clOpts := o.CommitLogOptions()
   267  	if err := clOpts.Validate(); err != nil {
   268  		return fmt.Errorf("unable to validate commit log options: %v", err)
   269  	}
   270  
   271  	// validate repair options
   272  	if o.RepairEnabled() {
   273  		rOpts := o.RepairOptions()
   274  		if rOpts == nil {
   275  			return errRepairOptionsNotSet
   276  		}
   277  		if err := rOpts.Validate(); err != nil {
   278  			return fmt.Errorf("unable to validate repair options, err: %v", err)
   279  		}
   280  	}
   281  
   282  	// validate indexing options
   283  	iOpts := o.IndexOptions()
   284  	if iOpts == nil {
   285  		return errIndexOptionsNotSet
   286  	}
   287  	if err := iOpts.Validate(); err != nil {
   288  		return fmt.Errorf("unable to validate index options, err: %v", err)
   289  	}
   290  
   291  	// validate that persist manager is present, if not return
   292  	// error if error occurred during default creation otherwise
   293  	// it was set to nil by a caller
   294  	if o.persistManager == nil {
   295  		return errPersistManagerNotSet
   296  	}
   297  
   298  	// validate that index claims manager is present
   299  	if o.indexClaimsManager == nil {
   300  		return errIndexClaimsManagerNotSet
   301  	}
   302  
   303  	// validate series cache policy
   304  	if err := series.ValidateCachePolicy(o.seriesCachePolicy); err != nil {
   305  		return err
   306  	}
   307  
   308  	if o.blockLeaseManager == nil {
   309  		return errBlockLeaserNotSet
   310  	}
   311  
   312  	if o.onColdFlush == nil {
   313  		return errOnColdFlushNotSet
   314  	}
   315  
   316  	if o.limitsOptions == nil {
   317  		return errLimitsOptionsNotSet
   318  	}
   319  
   320  	return nil
   321  }
   322  
   323  func (o *options) SetClockOptions(value clock.Options) Options {
   324  	opts := *o
   325  	opts.clockOpts = value
   326  	opts.blockOpts = opts.blockOpts.SetClockOptions(value)
   327  	opts.commitLogOpts = opts.commitLogOpts.SetClockOptions(value)
   328  	opts.indexOpts = opts.indexOpts.SetClockOptions(value)
   329  	opts.seriesOpts = NewSeriesOptionsFromOptions(&opts, nil)
   330  	return &opts
   331  }
   332  
   333  func (o *options) ClockOptions() clock.Options {
   334  	return o.clockOpts
   335  }
   336  
   337  func (o *options) SetInstrumentOptions(value instrument.Options) Options {
   338  	opts := *o
   339  	opts.instrumentOpts = value
   340  	opts.commitLogOpts = opts.commitLogOpts.SetInstrumentOptions(value)
   341  	opts.indexOpts = opts.indexOpts.SetInstrumentOptions(value)
   342  	opts.seriesOpts = NewSeriesOptionsFromOptions(&opts, nil)
   343  	return &opts
   344  }
   345  
   346  func (o *options) InstrumentOptions() instrument.Options {
   347  	return o.instrumentOpts
   348  }
   349  
   350  func (o *options) SetNamespaceInitializer(value namespace.Initializer) Options {
   351  	opts := *o
   352  	opts.nsRegistryInitializer = value
   353  	return &opts
   354  }
   355  
   356  func (o *options) NamespaceInitializer() namespace.Initializer {
   357  	return o.nsRegistryInitializer
   358  }
   359  
   360  func (o *options) SetDatabaseBlockOptions(value block.Options) Options {
   361  	opts := *o
   362  	opts.blockOpts = value
   363  	opts.seriesOpts = NewSeriesOptionsFromOptions(&opts, nil)
   364  	return &opts
   365  }
   366  
   367  func (o *options) DatabaseBlockOptions() block.Options {
   368  	return o.blockOpts
   369  }
   370  
   371  func (o *options) SetCommitLogOptions(value commitlog.Options) Options {
   372  	opts := *o
   373  	opts.commitLogOpts = value
   374  	return &opts
   375  }
   376  
   377  func (o *options) CommitLogOptions() commitlog.Options {
   378  	return o.commitLogOpts
   379  }
   380  
   381  func (o *options) SetRuntimeOptionsManager(value m3dbruntime.OptionsManager) Options {
   382  	opts := *o
   383  	opts.runtimeOptsMgr = value
   384  	return &opts
   385  }
   386  
   387  func (o *options) RuntimeOptionsManager() m3dbruntime.OptionsManager {
   388  	return o.runtimeOptsMgr
   389  }
   390  
   391  func (o *options) SetErrorWindowForLoad(value time.Duration) Options {
   392  	opts := *o
   393  	opts.errWindowForLoad = value
   394  	return &opts
   395  }
   396  
   397  func (o *options) ErrorWindowForLoad() time.Duration {
   398  	return o.errWindowForLoad
   399  }
   400  
   401  func (o *options) SetErrorThresholdForLoad(value int64) Options {
   402  	opts := *o
   403  	opts.errThresholdForLoad = value
   404  	return &opts
   405  }
   406  
   407  func (o *options) ErrorThresholdForLoad() int64 {
   408  	return o.errThresholdForLoad
   409  }
   410  
   411  func (o *options) SetIndexOptions(value index.Options) Options {
   412  	opts := *o
   413  	opts.indexOpts = value
   414  	return &opts
   415  }
   416  
   417  func (o *options) IndexOptions() index.Options {
   418  	return o.indexOpts
   419  }
   420  
   421  func (o *options) SetRepairEnabled(b bool) Options {
   422  	opts := *o
   423  	opts.repairEnabled = b
   424  	return &opts
   425  }
   426  
   427  func (o *options) RepairEnabled() bool {
   428  	return o.repairEnabled
   429  }
   430  
   431  func (o *options) SetTruncateType(value series.TruncateType) Options {
   432  	opts := *o
   433  	opts.truncateType = value
   434  	return &opts
   435  }
   436  
   437  func (o *options) TruncateType() series.TruncateType {
   438  	return o.truncateType
   439  }
   440  
   441  func (o *options) SetWriteTransformOptions(
   442  	value series.WriteTransformOptions,
   443  ) Options {
   444  	opts := *o
   445  	opts.transformOptions = value
   446  	return &opts
   447  }
   448  
   449  func (o *options) WriteTransformOptions() series.WriteTransformOptions {
   450  	return o.transformOptions
   451  }
   452  
   453  func (o *options) SetRepairOptions(value repair.Options) Options {
   454  	opts := *o
   455  	opts.repairOpts = value
   456  	return &opts
   457  }
   458  
   459  func (o *options) RepairOptions() repair.Options {
   460  	return o.repairOpts
   461  }
   462  
   463  func (o *options) SetEncodingM3TSZPooled() Options {
   464  	opts := *o
   465  
   466  	buckets := []pool.Bucket{{
   467  		Capacity: defaultBytesPoolBucketCapacity,
   468  		Count:    defaultBytesPoolBucketCount,
   469  	}}
   470  	newBackingBytesPool := func(s []pool.Bucket) pool.BytesPool {
   471  		return pool.NewBytesPool(s, opts.poolOpts)
   472  	}
   473  	bytesPool := pool.NewCheckedBytesPool(buckets, o.poolOpts, newBackingBytesPool)
   474  	bytesPool.Init()
   475  	opts.bytesPool = bytesPool
   476  
   477  	// initialize context pool
   478  	opts.contextPool = context.NewPool(context.NewOptions().
   479  		SetContextPoolOptions(opts.poolOpts).
   480  		SetFinalizerPoolOptions(opts.poolOpts))
   481  
   482  	encoderPool := encoding.NewEncoderPool(opts.poolOpts)
   483  	readerIteratorPool := encoding.NewReaderIteratorPool(opts.poolOpts)
   484  
   485  	// initialize segment reader pool
   486  	segmentReaderPool := xio.NewSegmentReaderPool(opts.poolOpts)
   487  	segmentReaderPool.Init()
   488  	opts.segmentReaderPool = segmentReaderPool
   489  
   490  	encodingOpts := encoding.NewOptions().
   491  		SetBytesPool(bytesPool).
   492  		SetEncoderPool(encoderPool).
   493  		SetReaderIteratorPool(readerIteratorPool).
   494  		SetSegmentReaderPool(segmentReaderPool).
   495  		SetMetrics(encoding.NewMetrics(opts.InstrumentOptions().MetricsScope()))
   496  
   497  	// initialize encoder pool
   498  	encoderPool.Init(func() encoding.Encoder {
   499  		return m3tsz.NewEncoder(0, nil, m3tsz.DefaultIntOptimizationEnabled, encodingOpts)
   500  	})
   501  	opts.encoderPool = encoderPool
   502  
   503  	// initialize single reader iterator pool
   504  	readerIteratorPool.Init(m3tsz.DefaultReaderIteratorAllocFn(encodingOpts))
   505  	opts.readerIteratorPool = readerIteratorPool
   506  
   507  	// initialize multi reader iterator pool
   508  	multiReaderIteratorPool := encoding.NewMultiReaderIteratorPool(opts.poolOpts)
   509  	multiReaderIteratorPool.Init(m3tsz.DefaultReaderIteratorAllocFn(encodingOpts))
   510  	opts.multiReaderIteratorPool = multiReaderIteratorPool
   511  
   512  	opts.blockOpts = opts.blockOpts.
   513  		SetEncoderPool(encoderPool).
   514  		SetReaderIteratorPool(readerIteratorPool).
   515  		SetMultiReaderIteratorPool(multiReaderIteratorPool).
   516  		SetBytesPool(bytesPool)
   517  
   518  	opts.seriesOpts = NewSeriesOptionsFromOptions(&opts, nil)
   519  	return &opts
   520  }
   521  
   522  func (o *options) SetNewEncoderFn(value encoding.NewEncoderFn) Options {
   523  	opts := *o
   524  	opts.newEncoderFn = value
   525  	return &opts
   526  }
   527  
   528  func (o *options) NewEncoderFn() encoding.NewEncoderFn {
   529  	return o.newEncoderFn
   530  }
   531  
   532  func (o *options) SetNewDecoderFn(value encoding.NewDecoderFn) Options {
   533  	opts := *o
   534  	opts.newDecoderFn = value
   535  	return &opts
   536  }
   537  
   538  func (o *options) NewDecoderFn() encoding.NewDecoderFn {
   539  	return o.newDecoderFn
   540  }
   541  
   542  func (o *options) SetBootstrapProcessProvider(value bootstrap.ProcessProvider) Options {
   543  	opts := *o
   544  	opts.bootstrapProcessProvider = value
   545  	return &opts
   546  }
   547  
   548  func (o *options) BootstrapProcessProvider() bootstrap.ProcessProvider {
   549  	return o.bootstrapProcessProvider
   550  }
   551  
   552  func (o *options) SetPersistManager(value persist.Manager) Options {
   553  	opts := *o
   554  	opts.persistManager = value
   555  	return &opts
   556  }
   557  
   558  func (o *options) PersistManager() persist.Manager {
   559  	return o.persistManager
   560  }
   561  
   562  func (o *options) SetIndexClaimsManager(value fs.IndexClaimsManager) Options {
   563  	opts := *o
   564  	opts.indexClaimsManager = value
   565  	return &opts
   566  }
   567  
   568  func (o *options) IndexClaimsManager() fs.IndexClaimsManager {
   569  	return o.indexClaimsManager
   570  }
   571  
   572  func (o *options) SetDatabaseBlockRetrieverManager(value block.DatabaseBlockRetrieverManager) Options {
   573  	opts := *o
   574  	opts.blockRetrieverManager = value
   575  	return &opts
   576  }
   577  
   578  func (o *options) DatabaseBlockRetrieverManager() block.DatabaseBlockRetrieverManager {
   579  	return o.blockRetrieverManager
   580  }
   581  
   582  func (o *options) SetContextPool(value context.Pool) Options {
   583  	opts := *o
   584  	opts.contextPool = value
   585  	return &opts
   586  }
   587  
   588  func (o *options) ContextPool() context.Pool {
   589  	return o.contextPool
   590  }
   591  
   592  func (o *options) SetSeriesCachePolicy(value series.CachePolicy) Options {
   593  	opts := *o
   594  	opts.seriesCachePolicy = value
   595  	return &opts
   596  }
   597  
   598  func (o *options) SeriesCachePolicy() series.CachePolicy {
   599  	return o.seriesCachePolicy
   600  }
   601  
   602  func (o *options) SetSeriesOptions(value series.Options) Options {
   603  	opts := *o
   604  	opts.seriesOpts = value
   605  	return &opts
   606  }
   607  
   608  func (o *options) SeriesOptions() series.Options {
   609  	return o.seriesOpts
   610  }
   611  
   612  func (o *options) SetDatabaseSeriesPool(value series.DatabaseSeriesPool) Options {
   613  	opts := *o
   614  	opts.seriesPool = value
   615  	return &opts
   616  }
   617  
   618  func (o *options) DatabaseSeriesPool() series.DatabaseSeriesPool {
   619  	return o.seriesPool
   620  }
   621  
   622  func (o *options) SetBytesPool(value pool.CheckedBytesPool) Options {
   623  	opts := *o
   624  	opts.bytesPool = value
   625  	return &opts
   626  }
   627  
   628  func (o *options) BytesPool() pool.CheckedBytesPool {
   629  	return o.bytesPool
   630  }
   631  
   632  func (o *options) SetEncoderPool(value encoding.EncoderPool) Options {
   633  	opts := *o
   634  	opts.encoderPool = value
   635  	return &opts
   636  }
   637  
   638  func (o *options) EncoderPool() encoding.EncoderPool {
   639  	return o.encoderPool
   640  }
   641  
   642  func (o *options) SetSegmentReaderPool(value xio.SegmentReaderPool) Options {
   643  	opts := *o
   644  	opts.segmentReaderPool = value
   645  	return &opts
   646  }
   647  
   648  func (o *options) SegmentReaderPool() xio.SegmentReaderPool {
   649  	return o.segmentReaderPool
   650  }
   651  
   652  func (o *options) SetReaderIteratorPool(value encoding.ReaderIteratorPool) Options {
   653  	opts := *o
   654  	opts.readerIteratorPool = value
   655  	return &opts
   656  }
   657  
   658  func (o *options) ReaderIteratorPool() encoding.ReaderIteratorPool {
   659  	return o.readerIteratorPool
   660  }
   661  
   662  func (o *options) SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options {
   663  	opts := *o
   664  	opts.multiReaderIteratorPool = value
   665  	return &opts
   666  }
   667  
   668  func (o *options) MultiReaderIteratorPool() encoding.MultiReaderIteratorPool {
   669  	return o.multiReaderIteratorPool
   670  }
   671  
   672  func (o *options) SetIdentifierPool(value ident.Pool) Options {
   673  	opts := *o
   674  	opts.indexOpts = opts.indexOpts.SetIdentifierPool(value)
   675  	opts.identifierPool = value
   676  	return &opts
   677  }
   678  
   679  func (o *options) IdentifierPool() ident.Pool {
   680  	return o.identifierPool
   681  }
   682  
   683  func (o *options) SetFetchBlockMetadataResultsPool(value block.FetchBlockMetadataResultsPool) Options {
   684  	opts := *o
   685  	opts.fetchBlockMetadataResultsPool = value
   686  	return &opts
   687  }
   688  
   689  func (o *options) FetchBlockMetadataResultsPool() block.FetchBlockMetadataResultsPool {
   690  	return o.fetchBlockMetadataResultsPool
   691  }
   692  
   693  func (o *options) SetFetchBlocksMetadataResultsPool(value block.FetchBlocksMetadataResultsPool) Options {
   694  	opts := *o
   695  	opts.fetchBlocksMetadataResultsPool = value
   696  	return &opts
   697  }
   698  
   699  func (o *options) FetchBlocksMetadataResultsPool() block.FetchBlocksMetadataResultsPool {
   700  	return o.fetchBlocksMetadataResultsPool
   701  }
   702  
   703  func (o *options) SetWriteBatchPool(value *writes.WriteBatchPool) Options {
   704  	opts := *o
   705  	opts.writeBatchPool = value
   706  	return &opts
   707  }
   708  
   709  func (o *options) WriteBatchPool() *writes.WriteBatchPool {
   710  	return o.writeBatchPool
   711  }
   712  
   713  func (o *options) SetBufferBucketPool(value *series.BufferBucketPool) Options {
   714  	opts := *o
   715  	opts.bufferBucketPool = value
   716  	return &opts
   717  }
   718  
   719  func (o *options) BufferBucketPool() *series.BufferBucketPool {
   720  	return o.bufferBucketPool
   721  }
   722  
   723  func (o *options) SetBufferBucketVersionsPool(value *series.BufferBucketVersionsPool) Options {
   724  	opts := *o
   725  	opts.bufferBucketVersionsPool = value
   726  	return &opts
   727  }
   728  
   729  func (o *options) BufferBucketVersionsPool() *series.BufferBucketVersionsPool {
   730  	return o.bufferBucketVersionsPool
   731  }
   732  
   733  func (o *options) SetRetrieveRequestPool(value fs.RetrieveRequestPool) Options {
   734  	opts := *o
   735  	opts.retrieveRequestPool = value
   736  	return &opts
   737  }
   738  
   739  func (o *options) RetrieveRequestPool() fs.RetrieveRequestPool {
   740  	return o.retrieveRequestPool
   741  }
   742  
   743  func (o *options) SetCheckedBytesWrapperPool(value xpool.CheckedBytesWrapperPool) Options {
   744  	opts := *o
   745  	opts.checkedBytesWrapperPool = value
   746  	return &opts
   747  }
   748  
   749  func (o *options) CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool {
   750  	return o.checkedBytesWrapperPool
   751  }
   752  
   753  func (o *options) SetSchemaRegistry(registry namespace.SchemaRegistry) Options {
   754  	opts := *o
   755  	opts.schemaReg = registry
   756  	return &opts
   757  }
   758  
   759  func (o *options) SchemaRegistry() namespace.SchemaRegistry {
   760  	return o.schemaReg
   761  }
   762  
   763  func (o *options) SetBlockLeaseManager(leaseMgr block.LeaseManager) Options {
   764  	opts := *o
   765  	opts.blockLeaseManager = leaseMgr
   766  	return &opts
   767  }
   768  
   769  func (o *options) BlockLeaseManager() block.LeaseManager {
   770  	return o.blockLeaseManager
   771  }
   772  
   773  func (o *options) SetOnColdFlush(value OnColdFlush) Options {
   774  	opts := *o
   775  	opts.onColdFlush = value
   776  	return &opts
   777  }
   778  
   779  func (o *options) OnColdFlush() OnColdFlush {
   780  	return o.onColdFlush
   781  }
   782  
   783  func (o *options) SetForceColdWritesEnabled(value bool) Options {
   784  	opts := *o
   785  	opts.forceColdWritesEnabled = value
   786  	return &opts
   787  }
   788  
   789  func (o *options) ForceColdWritesEnabled() bool {
   790  	return o.forceColdWritesEnabled
   791  }
   792  
   793  func (o *options) SetSourceLoggerBuilder(value limits.SourceLoggerBuilder) Options {
   794  	opts := *o
   795  	opts.sourceLoggerBuilder = value
   796  	return &opts
   797  }
   798  
   799  func (o *options) SourceLoggerBuilder() limits.SourceLoggerBuilder {
   800  	return o.sourceLoggerBuilder
   801  }
   802  
   803  func (o *options) SetIterationOptions(value index.IterationOptions) Options {
   804  	opts := *o
   805  	opts.iterationOptions = value
   806  	return &opts
   807  }
   808  
   809  func (o *options) IterationOptions() index.IterationOptions {
   810  	return o.iterationOptions
   811  }
   812  
   813  func (o *options) SetMemoryTracker(memTracker MemoryTracker) Options {
   814  	opts := *o
   815  	opts.memoryTracker = memTracker
   816  	return &opts
   817  }
   818  
   819  func (o *options) MemoryTracker() MemoryTracker {
   820  	return o.memoryTracker
   821  }
   822  
   823  func (o *options) SetMmapReporter(mmapReporter mmap.Reporter) Options {
   824  	opts := *o
   825  	opts.mmapReporter = mmapReporter
   826  	return &opts
   827  }
   828  
   829  func (o *options) MmapReporter() mmap.Reporter {
   830  	return o.mmapReporter
   831  }
   832  
   833  func (o *options) SetDoNotIndexWithFieldsMap(value map[string]string) Options {
   834  	opts := *o
   835  	opts.doNotIndexWithFieldsMap = value
   836  	return &opts
   837  }
   838  
   839  func (o *options) DoNotIndexWithFieldsMap() map[string]string {
   840  	return o.doNotIndexWithFieldsMap
   841  }
   842  
   843  func (o *options) SetNamespaceRuntimeOptionsManagerRegistry(
   844  	value namespace.RuntimeOptionsManagerRegistry,
   845  ) Options {
   846  	opts := *o
   847  	opts.namespaceRuntimeOptsMgrRegistry = value
   848  	return &opts
   849  }
   850  
   851  func (o *options) NamespaceRuntimeOptionsManagerRegistry() namespace.RuntimeOptionsManagerRegistry {
   852  	return o.namespaceRuntimeOptsMgrRegistry
   853  }
   854  
   855  func (o *options) SetMediatorTickInterval(value time.Duration) Options {
   856  	opts := *o
   857  	opts.mediatorTickInterval = value
   858  	return &opts
   859  }
   860  
   861  func (o *options) MediatorTickInterval() time.Duration {
   862  	return o.mediatorTickInterval
   863  }
   864  
   865  func (o *options) SetAdminClient(value client.AdminClient) Options {
   866  	opts := *o
   867  	opts.adminClient = value
   868  	return &opts
   869  }
   870  
   871  func (o *options) AdminClient() client.AdminClient {
   872  	return o.adminClient
   873  }
   874  
   875  func (o *options) SetBackgroundProcessFns(fns []NewBackgroundProcessFn) Options {
   876  	opts := *o
   877  	opts.newBackgroundProcessFns = fns
   878  	return &opts
   879  }
   880  
   881  func (o *options) BackgroundProcessFns() []NewBackgroundProcessFn {
   882  	return o.newBackgroundProcessFns
   883  }
   884  
   885  func (o *options) SetNamespaceHooks(value NamespaceHooks) Options {
   886  	opts := *o
   887  	opts.namespaceHooks = value
   888  	return &opts
   889  }
   890  
   891  func (o *options) NamespaceHooks() NamespaceHooks {
   892  	return o.namespaceHooks
   893  }
   894  
   895  func (o *options) SetTileAggregator(value TileAggregator) Options {
   896  	opts := *o
   897  	opts.tileAggregator = value
   898  
   899  	return &opts
   900  }
   901  
   902  func (o *options) PermitsOptions() permits.Options {
   903  	return o.permitsOptions
   904  }
   905  
   906  func (o *options) SetPermitsOptions(value permits.Options) Options {
   907  	opts := *o
   908  	opts.permitsOptions = value
   909  
   910  	return &opts
   911  }
   912  
   913  func (o *options) LimitsOptions() limits.Options {
   914  	return o.limitsOptions
   915  }
   916  
   917  func (o *options) SetLimitsOptions(value limits.Options) Options {
   918  	opts := *o
   919  	opts.limitsOptions = value
   920  	return &opts
   921  }
   922  
   923  func (o *options) TileAggregator() TileAggregator {
   924  	return o.tileAggregator
   925  }
   926  
   927  func (o *options) CoreFn() xsync.CoreFn {
   928  	return o.coreFn
   929  }
   930  
   931  func (o *options) SetCoreFn(value xsync.CoreFn) Options {
   932  	opts := *o
   933  	opts.coreFn = value
   934  	return &opts
   935  }
   936  
   937  type noOpColdFlush struct{}
   938  
   939  func (n *noOpColdFlush) ColdFlushNamespace(Namespace, ColdFlushNsOpts) (OnColdFlushNamespace, error) {
   940  	return &persist.NoOpColdFlushNamespace{}, nil
   941  }
   942  
   943  type noopNamespaceHooks struct{}
   944  
   945  func (h *noopNamespaceHooks) OnCreatedNamespace(Namespace, GetNamespaceFn) error {
   946  	return nil
   947  }
   948  
   949  type noopTileAggregator struct{}
   950  
   951  func (a *noopTileAggregator) AggregateTiles(
   952  	ctx context.Context,
   953  	sourceNs, targetNs Namespace,
   954  	shardID uint32,
   955  	onFlushSeries persist.OnFlushSeries,
   956  	opts AggregateTilesOptions,
   957  ) (int64, int, error) {
   958  	return 0, 0, nil
   959  }