12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // Copyright 2016 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package storage
- import (
- "encoding/binary"
- "github.com/ethereum/go-ethereum/metrics"
- )
- //metrics variables
- var (
- dbStorePutCounter = metrics.NewRegisteredCounter("storage.db.dbstore.put.count", nil)
- )
- // LocalStore is a combination of inmemory db over a disk persisted db
- // implements a Get/Put with fallback (caching) logic using any 2 ChunkStores
- type LocalStore struct {
- memStore ChunkStore
- DbStore ChunkStore
- }
- // This constructor uses MemStore and DbStore as components
- func NewLocalStore(hash SwarmHasher, params *StoreParams) (*LocalStore, error) {
- dbStore, err := NewDbStore(params.ChunkDbPath, hash, params.DbCapacity, params.Radius)
- if err != nil {
- return nil, err
- }
- return &LocalStore{
- memStore: NewMemStore(dbStore, params.CacheCapacity),
- DbStore: dbStore,
- }, nil
- }
- func (self *LocalStore) CacheCounter() uint64 {
- return uint64(self.memStore.(*MemStore).Counter())
- }
- func (self *LocalStore) DbCounter() uint64 {
- return self.DbStore.(*DbStore).Counter()
- }
- // LocalStore is itself a chunk store
- // unsafe, in that the data is not integrity checked
- func (self *LocalStore) Put(chunk *Chunk) {
- chunk.dbStored = make(chan bool)
- self.memStore.Put(chunk)
- if chunk.wg != nil {
- chunk.wg.Add(1)
- }
- go func() {
- dbStorePutCounter.Inc(1)
- self.DbStore.Put(chunk)
- if chunk.wg != nil {
- chunk.wg.Done()
- }
- }()
- }
- // Get(chunk *Chunk) looks up a chunk in the local stores
- // This method is blocking until the chunk is retrieved
- // so additional timeout may be needed to wrap this call if
- // ChunkStores are remote and can have long latency
- func (self *LocalStore) Get(key Key) (chunk *Chunk, err error) {
- chunk, err = self.memStore.Get(key)
- if err == nil {
- return
- }
- chunk, err = self.DbStore.Get(key)
- if err != nil {
- return
- }
- chunk.Size = int64(binary.LittleEndian.Uint64(chunk.SData[0:8]))
- self.memStore.Put(chunk)
- return
- }
- // Close local store
- func (self *LocalStore) Close() {}
|