github.com/m3db/m3@v1.5.0/src/x/pool/config.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 pool
    22  
    23  import (
    24  	"errors"
    25  	"strconv"
    26  
    27  	"github.com/m3db/m3/src/x/instrument"
    28  )
    29  
    30  // ObjectPoolConfiguration contains configuration for object pools.
    31  type ObjectPoolConfiguration struct {
    32  	// The size of the pool.
    33  	Size Size `yaml:"size"`
    34  
    35  	// The watermark configuration.
    36  	Watermark WatermarkConfiguration `yaml:"watermark"`
    37  }
    38  
    39  // NewObjectPoolOptions creates a new set of object pool options.
    40  func (c *ObjectPoolConfiguration) NewObjectPoolOptions(
    41  	instrumentOpts instrument.Options,
    42  ) ObjectPoolOptions {
    43  	size := _defaultSize
    44  	if c.Size > 0 {
    45  		size = int(c.Size)
    46  	}
    47  
    48  	return NewObjectPoolOptions().
    49  		SetInstrumentOptions(instrumentOpts).
    50  		SetSize(size).
    51  		SetDynamic(c.Size.IsDynamic()).
    52  		SetRefillLowWatermark(c.Watermark.RefillLowWatermark).
    53  		SetRefillHighWatermark(c.Watermark.RefillHighWatermark)
    54  }
    55  
    56  // BucketizedPoolConfiguration contains configuration for bucketized pools.
    57  type BucketizedPoolConfiguration struct {
    58  	// The pool bucket configuration.
    59  	Buckets []BucketConfiguration `yaml:"buckets"`
    60  
    61  	// The watermark configuration.
    62  	Watermark WatermarkConfiguration `yaml:"watermark"`
    63  }
    64  
    65  // NewObjectPoolOptions creates a new set of object pool options.
    66  func (c *BucketizedPoolConfiguration) NewObjectPoolOptions(
    67  	instrumentOpts instrument.Options,
    68  ) ObjectPoolOptions {
    69  	return NewObjectPoolOptions().
    70  		SetInstrumentOptions(instrumentOpts).
    71  		SetRefillLowWatermark(c.Watermark.RefillLowWatermark).
    72  		SetRefillHighWatermark(c.Watermark.RefillHighWatermark)
    73  }
    74  
    75  // NewBuckets create a new list of buckets.
    76  func (c *BucketizedPoolConfiguration) NewBuckets() []Bucket {
    77  	buckets := make([]Bucket, 0, len(c.Buckets))
    78  	for _, bconfig := range c.Buckets {
    79  		bucket := bconfig.NewBucket()
    80  		buckets = append(buckets, bucket)
    81  	}
    82  	return buckets
    83  }
    84  
    85  // BucketConfiguration contains configuration for a pool bucket.
    86  type BucketConfiguration struct {
    87  	// The count of the items in the bucket.
    88  	Count Size `yaml:"count"`
    89  
    90  	// The capacity of each item in the bucket.
    91  	Capacity int `yaml:"capacity"`
    92  }
    93  
    94  // NewBucket creates a new bucket.
    95  func (c *BucketConfiguration) NewBucket() Bucket {
    96  	return Bucket{
    97  		Capacity: c.Capacity,
    98  		Count:    c.Count,
    99  	}
   100  }
   101  
   102  // WatermarkConfiguration contains watermark configuration for pools.
   103  type WatermarkConfiguration struct {
   104  	// The low watermark to start refilling the pool, if zero none.
   105  	RefillLowWatermark float64 `yaml:"low" validate:"min=0.0,max=1.0"`
   106  
   107  	// The high watermark to stop refilling the pool, if zero none.
   108  	RefillHighWatermark float64 `yaml:"high" validate:"min=0.0,max=1.0"`
   109  }
   110  
   111  // Size stores pool capacity for pools that can be either dynamic or pre-allocated
   112  type Size int
   113  
   114  // UnmarshalText unmarshals Size.
   115  func (s *Size) UnmarshalText(b []byte) error {
   116  	if string(b) == "dynamic" {
   117  		*s = DynamicPoolSize
   118  		return nil
   119  	}
   120  
   121  	i, err := strconv.ParseInt(string(b), 10, 64)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	if i < 0 {
   127  		return errors.New("pool capacity cannot be negative")
   128  	}
   129  
   130  	*s = Size(i)
   131  
   132  	return nil
   133  }
   134  
   135  // IsDynamic returns whether the pool should be fixed size or not.
   136  func (s Size) IsDynamic() bool {
   137  	return s == DynamicPoolSize
   138  }