github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/dbnode/retention/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 retention 22 23 import ( 24 "errors" 25 "time" 26 ) 27 28 const ( 29 // defaultRetentionPeriod is how long we keep data in memory by default. 30 defaultRetentionPeriod = 2 * 24 * time.Hour 31 32 // defaultFutureRetentionPeriod is how long we keep data in memory in the 33 // future (if cold writes are enabled) by default. If this default is used, 34 // M3DB will not accept any future writes outside of the bufferFuture 35 // threshold. 36 defaultFutureRetentionPeriod = time.Duration(0) 37 38 // defaultBlockSize is the default block size 39 defaultBlockSize = 2 * time.Hour 40 41 // defaultBufferFuture is the default buffer future limit 42 defaultBufferFuture = 2 * time.Minute 43 44 // defaultBufferPast is the default buffer past limit 45 defaultBufferPast = 10 * time.Minute 46 47 // defaultDataExpiry is the default bool for whether data expiry is on 48 defaultDataExpiry = true 49 50 // defaultDataExpiryAfterNotAccessedPeriod is the default data expiry after not accessed period 51 defaultDataExpiryAfterNotAccessedPeriod = 5 * time.Minute 52 ) 53 54 var ( 55 errBufferFutureNonNegative = errors.New("buffer future must be non-negative") 56 errBufferPastNonNegative = errors.New("buffer past must be non-negative") 57 errBlockSizePositive = errors.New("block size must positive") 58 errBufferFutureTooLarge = errors.New("buffer future must be smaller than block size") 59 errBufferPastTooLarge = errors.New("buffer past must be smaller than block size") 60 errRetentionPeriodTooSmall = errors.New("retention period must not be smaller than block size") 61 ) 62 63 type options struct { 64 retentionPeriod time.Duration 65 futureRetentionPeriod time.Duration 66 blockSize time.Duration 67 bufferFuture time.Duration 68 bufferPast time.Duration 69 dataExpiryAfterNotAccessedPeriod time.Duration 70 dataExpiry bool 71 } 72 73 // NewOptions creates new retention options 74 func NewOptions() Options { 75 return &options{ 76 retentionPeriod: defaultRetentionPeriod, 77 futureRetentionPeriod: defaultFutureRetentionPeriod, 78 blockSize: defaultBlockSize, 79 bufferFuture: defaultBufferFuture, 80 bufferPast: defaultBufferPast, 81 dataExpiry: defaultDataExpiry, 82 dataExpiryAfterNotAccessedPeriod: defaultDataExpiryAfterNotAccessedPeriod, 83 } 84 } 85 86 func (o *options) Validate() error { 87 if o.bufferFuture < 0 { 88 return errBufferFutureNonNegative 89 } 90 if o.bufferPast < 0 { 91 return errBufferPastNonNegative 92 } 93 if o.blockSize <= 0 { 94 return errBlockSizePositive 95 } 96 if o.bufferFuture >= o.blockSize { 97 return errBufferFutureTooLarge 98 } 99 if o.bufferPast >= o.blockSize { 100 return errBufferPastTooLarge 101 } 102 if o.retentionPeriod < o.blockSize { 103 return errRetentionPeriodTooSmall 104 } 105 return nil 106 } 107 108 func (o *options) Equal(value Options) bool { 109 return o.retentionPeriod == value.RetentionPeriod() && 110 o.futureRetentionPeriod == value.FutureRetentionPeriod() && 111 o.blockSize == value.BlockSize() && 112 o.bufferFuture == value.BufferFuture() && 113 o.bufferPast == value.BufferPast() && 114 o.dataExpiry == value.BlockDataExpiry() && 115 o.dataExpiryAfterNotAccessedPeriod == value.BlockDataExpiryAfterNotAccessedPeriod() 116 } 117 118 func (o *options) SetRetentionPeriod(value time.Duration) Options { 119 opts := *o 120 opts.retentionPeriod = value 121 return &opts 122 } 123 124 func (o *options) RetentionPeriod() time.Duration { 125 return o.retentionPeriod 126 } 127 128 func (o *options) SetFutureRetentionPeriod(value time.Duration) Options { 129 opts := *o 130 opts.futureRetentionPeriod = value 131 return &opts 132 } 133 134 func (o *options) FutureRetentionPeriod() time.Duration { 135 return o.futureRetentionPeriod 136 } 137 138 func (o *options) SetBlockSize(value time.Duration) Options { 139 opts := *o 140 opts.blockSize = value 141 return &opts 142 } 143 144 func (o *options) BlockSize() time.Duration { 145 return o.blockSize 146 } 147 148 func (o *options) SetBufferFuture(value time.Duration) Options { 149 opts := *o 150 opts.bufferFuture = value 151 return &opts 152 } 153 154 func (o *options) BufferFuture() time.Duration { 155 return o.bufferFuture 156 } 157 158 func (o *options) SetBufferPast(value time.Duration) Options { 159 opts := *o 160 opts.bufferPast = value 161 return &opts 162 } 163 164 func (o *options) BufferPast() time.Duration { 165 return o.bufferPast 166 } 167 168 func (o *options) SetBlockDataExpiry(value bool) Options { 169 opts := *o 170 opts.dataExpiry = value 171 return &opts 172 } 173 174 func (o *options) BlockDataExpiry() bool { 175 return o.dataExpiry 176 } 177 178 func (o *options) SetBlockDataExpiryAfterNotAccessedPeriod(value time.Duration) Options { 179 opts := *o 180 opts.dataExpiryAfterNotAccessedPeriod = value 181 return &opts 182 } 183 184 func (o *options) BlockDataExpiryAfterNotAccessedPeriod() time.Duration { 185 return o.dataExpiryAfterNotAccessedPeriod 186 }