From cb57f4fcceb52321f91e3dc4859c673735a355cd Mon Sep 17 00:00:00 2001 From: NoneGG Date: Sun, 28 Jan 2018 20:27:25 +0800 Subject: [PATCH] new: add support for memcached metadata store --- weed/filer/memcached_store/memcached_store.go | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 weed/filer/memcached_store/memcached_store.go diff --git a/weed/filer/memcached_store/memcached_store.go b/weed/filer/memcached_store/memcached_store.go new file mode 100644 index 000000000..9c45bb6df --- /dev/null +++ b/weed/filer/memcached_store/memcached_store.go @@ -0,0 +1,56 @@ +package memcached_store + +import ( + memcache "github.com/bradfitz/gomemcache/memcache" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/glog" +) + +type MemcacheStore struct { + Client *memcache.Client +} + +func NewMemcacheStore(hostPort ...string) *MemcacheStore { + client := memcache.New(hostPort...) + return &MemcacheStore{Client: client} +} + +func (s *MemcacheStore) Get(fullFileName string) (fid string, err error) { + item, err := s.Client.Get(fullFileName) + if err == memcache.ErrCacheMiss { + err = filer.ErrNotFound + } + if err != nil { + return "", err + } + fid = string(item.Value) + return fid, err +} + +func (s *MemcacheStore) Put(fullFileName string, fid string) (err error) { + item := memcache.Item{ + Key: fullFileName, + Value: []byte(fid), + } + err = s.Client.Set(&item) + return err +} + +func (s *MemcacheStore) Delete(fullFileName string) (err error) { + err = s.Client.Delete(fullFileName) + // ErrCacheMiss means key is not cached in memcache + // which is the same as deleted + // so it should not be consider as an error + if err == memcache.ErrCacheMiss { + glog.V(0).Infof("Full file name %s not exists in memcache", fullFileName) + err = nil + } + return err +} + +func (s *MemcacheStore) Close() { + // For now the memcache client do not provide a way to close client + // and all cleanup job depends on GC + // related issue: https://github.com/bradfitz/gomemcache/issues/51 + s.Client = nil +}