ipfs-cluster/state/mapstate/map_state.go

72 lines
1.5 KiB
Go
Raw Normal View History

package mapstate
2016-12-02 18:33:39 +00:00
import (
"sync"
2016-12-02 18:33:39 +00:00
"github.com/ipfs/ipfs-cluster/api"
cid "github.com/ipfs/go-cid"
2016-12-02 18:33:39 +00:00
)
const Version = 1
// MapState is a very simple database to store the state of the system
// using a Go map. It is thread safe. It implements the State interface.
2016-12-02 18:33:39 +00:00
type MapState struct {
pinMux sync.RWMutex
PinMap map[string]api.CidArgSerial
Version int
2016-12-02 18:33:39 +00:00
}
// NewMapState initializes the internal map and returns a new MapState object.
func NewMapState() *MapState {
return &MapState{
PinMap: make(map[string]api.CidArgSerial),
}
}
// Add adds a CidArg to the internal map.
func (st *MapState) Add(c api.CidArg) error {
st.pinMux.Lock()
defer st.pinMux.Unlock()
st.PinMap[c.Cid.String()] = c.ToSerial()
2016-12-02 18:33:39 +00:00
return nil
}
// Rm removes a Cid from the internal map.
func (st *MapState) Rm(c *cid.Cid) error {
st.pinMux.Lock()
defer st.pinMux.Unlock()
2016-12-02 18:33:39 +00:00
delete(st.PinMap, c.String())
return nil
}
func (st *MapState) Get(c *cid.Cid) api.CidArg {
st.pinMux.RLock()
defer st.pinMux.RUnlock()
cargs, ok := st.PinMap[c.String()]
if !ok { // make sure no panics
return api.CidArg{}
}
return cargs.ToCidArg()
}
// Has returns true if the Cid belongs to the State.
func (st *MapState) Has(c *cid.Cid) bool {
st.pinMux.RLock()
defer st.pinMux.RUnlock()
_, ok := st.PinMap[c.String()]
return ok
}
// List provides the list of tracked CidArgs.
func (st *MapState) List() []api.CidArg {
st.pinMux.RLock()
defer st.pinMux.RUnlock()
cids := make([]api.CidArg, 0, len(st.PinMap))
for _, v := range st.PinMap {
cids = append(cids, v.ToCidArg())
}
return cids
}