Dmitrii Stepanov
b142b6f48e
FSTree file counter used by writecache. As writecache has now only one storage, so it is required to use real object size to get writecache size more accurate than `count * max_object_size`. Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package fstree
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// FileCounter used to count files in FSTree. The implementation must be thread-safe.
|
|
type FileCounter interface {
|
|
Set(count, size uint64)
|
|
Inc(size uint64)
|
|
Dec(size uint64)
|
|
}
|
|
|
|
type noopCounter struct{}
|
|
|
|
func (c *noopCounter) Set(uint64, uint64) {}
|
|
func (c *noopCounter) Inc(uint64) {}
|
|
func (c *noopCounter) Dec(uint64) {}
|
|
|
|
func counterEnabled(c FileCounter) bool {
|
|
_, noop := c.(*noopCounter)
|
|
return !noop
|
|
}
|
|
|
|
type SimpleCounter struct {
|
|
mtx sync.RWMutex
|
|
count uint64
|
|
size uint64
|
|
}
|
|
|
|
func NewSimpleCounter() *SimpleCounter {
|
|
return &SimpleCounter{}
|
|
}
|
|
|
|
func (c *SimpleCounter) Set(count, size uint64) {
|
|
c.mtx.Lock()
|
|
defer c.mtx.Unlock()
|
|
|
|
c.count = count
|
|
c.size = size
|
|
}
|
|
|
|
func (c *SimpleCounter) Inc(size uint64) {
|
|
c.mtx.Lock()
|
|
defer c.mtx.Unlock()
|
|
|
|
c.count++
|
|
c.size += size
|
|
}
|
|
|
|
func (c *SimpleCounter) Dec(size uint64) {
|
|
c.mtx.Lock()
|
|
defer c.mtx.Unlock()
|
|
|
|
if c.count > 0 {
|
|
c.count--
|
|
} else {
|
|
panic("fstree.SimpleCounter: invalid count")
|
|
}
|
|
if c.size >= size {
|
|
c.size -= size
|
|
} else {
|
|
panic("fstree.SimpleCounter: invalid size")
|
|
}
|
|
}
|
|
|
|
func (c *SimpleCounter) CountSize() (uint64, uint64) {
|
|
c.mtx.RLock()
|
|
defer c.mtx.RUnlock()
|
|
|
|
return c.count, c.size
|
|
}
|