// NewARC creates an ARC of the given size func NewARC(size int) (*ARCCache, error) { // Create the sub LRUs b1, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } b2, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } t1, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } t2, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } // Initialize the ARC c := &ARCCache{ size: size, p: 0, t1: t1, b1: b1, t2: t2, b2: b2, } return c, nil }
// writeNode returns a node to be modified, if the current // node as already been modified during the course of // the transaction, it is used in-place. func (t *Txn) writeNode(n *Node) *Node { // Ensure the modified set exists if t.modified == nil { lru, err := simplelru.NewLRU(defaultModifiedCache, nil) if err != nil { panic(err) } t.modified = lru } // If this node has already been modified, we can // continue to use it during this transaction. if _, ok := t.modified.Get(n); ok { return n } // Copy the existing node nc := new(Node) if n.prefix != nil { nc.prefix = make([]byte, len(n.prefix)) copy(nc.prefix, n.prefix) } if n.leaf != nil { nc.leaf = new(leafNode) *nc.leaf = *n.leaf } if len(n.edges) != 0 { nc.edges = make([]edge, len(n.edges)) copy(nc.edges, n.edges) } // Mark this node as modified t.modified.Add(n, nil) return nc }
func New(size int) (*Cache, error) { list, err := lru.NewLRU(size, clean) if err != nil { return nil, err } runtime.SetFinalizer(list, (*lru.LRU).Purge) return &Cache{list: list}, nil }
// NewWithEvict constructs a fixed size cache with the given eviction // callback. func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) if err != nil { return nil, err } c := &Cache{ lru: lru, } return c, nil }
// New2QParams creates a new TwoQueueCache using the provided // parameter values. func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { if size <= 0 { return nil, fmt.Errorf("invalid size") } if recentRatio < 0.0 || recentRatio > 1.0 { return nil, fmt.Errorf("invalid recent ratio") } if ghostRatio < 0.0 || ghostRatio > 1.0 { return nil, fmt.Errorf("invalid ghost ratio") } // Determine the sub-sizes recentSize := int(float64(size) * recentRatio) evictSize := int(float64(size) * ghostRatio) // Allocate the LRUs recent, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } frequent, err := simplelru.NewLRU(size, nil) if err != nil { return nil, err } recentEvict, err := simplelru.NewLRU(evictSize, nil) if err != nil { return nil, err } // Initialize the cache c := &TwoQueueCache{ size: size, recentSize: recentSize, recent: recent, frequent: frequent, recentEvict: recentEvict, } return c, nil }
// NewCache creates a new cache func NewCache(name string, maxEntries int, maxSizeMB int, maxAge time.Duration) *Cache { c := &Cache{ name: name, maxAge: maxAge, maxSizeBytes: maxSizeMB * 1024 * 1024, } var err error c.lruBackend, err = simplelru.NewLRU(maxEntries, simplelru.EvictCallback(c.onEvicted)) if err != nil { panic(err) } return c }
// writeNode returns a node to be modified, if the current node has already been // modified during the course of the transaction, it is used in-place. Set // forLeafUpdate to true if you are getting a write node to update the leaf, // which will set leaf mutation tracking appropriately as well. func (t *Txn) writeNode(n *Node, forLeafUpdate bool) *Node { // Ensure the writable set exists. if t.writable == nil { lru, err := simplelru.NewLRU(defaultModifiedCache, nil) if err != nil { panic(err) } t.writable = lru } // If this node has already been modified, we can continue to use it // during this transaction. If a node gets kicked out of cache then we // *may* notify for its mutation if we end up copying the node again, // but we don't make any guarantees about notifying for intermediate // mutations that were never exposed outside of a transaction. if _, ok := t.writable.Get(n); ok { return n } // Mark this node as being mutated. if t.trackMutate { t.trackChannel(&(n.mutateCh)) } // Mark its leaf as being mutated, if appropriate. if t.trackMutate && forLeafUpdate && n.leaf != nil { t.trackChannel(&(n.leaf.mutateCh)) } // Copy the existing node. nc := &Node{ mutateCh: make(chan struct{}), leaf: n.leaf, } if n.prefix != nil { nc.prefix = make([]byte, len(n.prefix)) copy(nc.prefix, n.prefix) } if len(n.edges) != 0 { nc.edges = make([]edge, len(n.edges)) copy(nc.edges, n.edges) } // Mark this node as writable. t.writable.Add(nc, nil) return nc }
func (lg *Log) SetCacheSize(size int) { lg.cache, _ = lru.NewLRU(size, nil) }