github.com/m3db/m3@v1.5.0/src/dbnode/persist/fs/retriever_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 fs
    22  
    23  import (
    24  	"errors"
    25  	"runtime"
    26  
    27  	"github.com/m3db/m3/src/dbnode/storage/block"
    28  	"github.com/m3db/m3/src/dbnode/storage/limits"
    29  	"github.com/m3db/m3/src/dbnode/x/xio"
    30  	"github.com/m3db/m3/src/x/ident"
    31  	"github.com/m3db/m3/src/x/pool"
    32  )
    33  
    34  var (
    35  	// Allow max concurrency to match available CPUs.
    36  	defaultFetchConcurrency = runtime.GOMAXPROCS(0)
    37  	defaultCacheOnRetrieve  = false
    38  
    39  	errBlockLeaseManagerNotSet = errors.New("block lease manager is not set")
    40  )
    41  
    42  type blockRetrieverOptions struct {
    43  	requestPool       RetrieveRequestPool
    44  	bytesPool         pool.CheckedBytesPool
    45  	fetchConcurrency  int
    46  	cacheOnRetrieve   bool
    47  	identifierPool    ident.Pool
    48  	blockLeaseManager block.LeaseManager
    49  	queryLimits       limits.QueryLimits
    50  }
    51  
    52  // NewBlockRetrieverOptions creates a new set of block retriever options
    53  func NewBlockRetrieverOptions() BlockRetrieverOptions {
    54  	bytesPool := pool.NewCheckedBytesPool([]pool.Bucket{
    55  		{Count: 4096, Capacity: 128},
    56  	}, nil, func(s []pool.Bucket) pool.BytesPool {
    57  		return pool.NewBytesPool(s, nil)
    58  	})
    59  	bytesPool.Init()
    60  
    61  	segmentReaderPool := xio.NewSegmentReaderPool(nil)
    62  	segmentReaderPool.Init()
    63  
    64  	requestPool := NewRetrieveRequestPool(segmentReaderPool, nil)
    65  	requestPool.Init()
    66  
    67  	o := &blockRetrieverOptions{
    68  		requestPool:      requestPool,
    69  		bytesPool:        bytesPool,
    70  		fetchConcurrency: defaultFetchConcurrency,
    71  		cacheOnRetrieve:  defaultCacheOnRetrieve,
    72  		identifierPool:   ident.NewPool(bytesPool, ident.PoolOptions{}),
    73  		queryLimits:      limits.NoOpQueryLimits(),
    74  	}
    75  
    76  	return o
    77  }
    78  
    79  func (o *blockRetrieverOptions) Validate() error {
    80  	if o.blockLeaseManager == nil {
    81  		return errBlockLeaseManagerNotSet
    82  	}
    83  	return nil
    84  }
    85  
    86  func (o *blockRetrieverOptions) SetRetrieveRequestPool(value RetrieveRequestPool) BlockRetrieverOptions {
    87  	opts := *o
    88  	opts.requestPool = value
    89  	return &opts
    90  }
    91  
    92  func (o *blockRetrieverOptions) RetrieveRequestPool() RetrieveRequestPool {
    93  	return o.requestPool
    94  }
    95  
    96  func (o *blockRetrieverOptions) SetBytesPool(value pool.CheckedBytesPool) BlockRetrieverOptions {
    97  	opts := *o
    98  	opts.bytesPool = value
    99  	return &opts
   100  }
   101  
   102  func (o *blockRetrieverOptions) BytesPool() pool.CheckedBytesPool {
   103  	return o.bytesPool
   104  }
   105  
   106  func (o *blockRetrieverOptions) SetFetchConcurrency(value int) BlockRetrieverOptions {
   107  	opts := *o
   108  	opts.fetchConcurrency = value
   109  	return &opts
   110  }
   111  
   112  func (o *blockRetrieverOptions) FetchConcurrency() int {
   113  	return o.fetchConcurrency
   114  }
   115  
   116  func (o *blockRetrieverOptions) SetCacheBlocksOnRetrieve(value bool) BlockRetrieverOptions {
   117  	opts := *o
   118  	opts.cacheOnRetrieve = value
   119  	return &opts
   120  }
   121  
   122  func (o *blockRetrieverOptions) CacheBlocksOnRetrieve() bool {
   123  	return o.cacheOnRetrieve
   124  }
   125  
   126  func (o *blockRetrieverOptions) SetIdentifierPool(value ident.Pool) BlockRetrieverOptions {
   127  	opts := *o
   128  	opts.identifierPool = value
   129  	return &opts
   130  }
   131  
   132  func (o *blockRetrieverOptions) IdentifierPool() ident.Pool {
   133  	return o.identifierPool
   134  }
   135  
   136  func (o *blockRetrieverOptions) SetBlockLeaseManager(leaseMgr block.LeaseManager) BlockRetrieverOptions {
   137  	opts := *o
   138  	opts.blockLeaseManager = leaseMgr
   139  	return &opts
   140  }
   141  
   142  func (o *blockRetrieverOptions) BlockLeaseManager() block.LeaseManager {
   143  	return o.blockLeaseManager
   144  }
   145  
   146  func (o *blockRetrieverOptions) SetQueryLimits(value limits.QueryLimits) BlockRetrieverOptions {
   147  	opts := *o
   148  	opts.queryLimits = value
   149  	return &opts
   150  }
   151  
   152  func (o *blockRetrieverOptions) QueryLimits() limits.QueryLimits {
   153  	return o.queryLimits
   154  }