summaryrefslogtreecommitdiff
path: root/plugins/kv/memcached
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2021-01-07 01:06:50 +0300
committerValery Piashchynski <[email protected]>2021-01-07 01:06:50 +0300
commitc1465d3bcdf24a78440300aa51e7cfc92ce874a8 (patch)
tree6e0f5107eba90df73724b6611ca6adfa148d2a3f /plugins/kv/memcached
parentc9f670ee734355cbc5d504186946b7db67cf62b5 (diff)
KV, updated, bug fixed, with intergration tests via plugins
Diffstat (limited to 'plugins/kv/memcached')
-rw-r--r--plugins/kv/memcached/plugin.go25
-rw-r--r--plugins/kv/memcached/storage_test.go108
2 files changed, 65 insertions, 68 deletions
diff --git a/plugins/kv/memcached/plugin.go b/plugins/kv/memcached/plugin.go
index 69f96bfe..f5111c04 100644
--- a/plugins/kv/memcached/plugin.go
+++ b/plugins/kv/memcached/plugin.go
@@ -1,7 +1,6 @@
package memcached
import (
- "context"
"strings"
"time"
@@ -58,8 +57,18 @@ func (s *Plugin) Stop() error {
return nil
}
+// RPCService returns associated rpc service.
+func (s *Plugin) RPC() interface{} {
+ return kv.NewRPCServer(s, s.log)
+}
+
+// Name returns plugin user-friendly name
+func (s *Plugin) Name() string {
+ return PluginName
+}
+
// Has checks the key for existence
-func (s Plugin) Has(ctx context.Context, keys ...string) (map[string]bool, error) {
+func (s Plugin) Has(keys ...string) (map[string]bool, error) {
const op = errors.Op("memcached Has")
if keys == nil {
return nil, errors.E(op, errors.NoKeys)
@@ -84,7 +93,7 @@ func (s Plugin) Has(ctx context.Context, keys ...string) (map[string]bool, error
// Get gets the item for the given key. ErrCacheMiss is returned for a
// memcache cache miss. The key must be at most 250 bytes in length.
-func (s Plugin) Get(ctx context.Context, key string) ([]byte, error) {
+func (s Plugin) Get(key string) ([]byte, error) {
const op = errors.Op("memcached Get")
// to get cases like " "
keyTrimmed := strings.TrimSpace(key)
@@ -106,7 +115,7 @@ func (s Plugin) Get(ctx context.Context, key string) ([]byte, error) {
// return map with key -- string
// and map value as value -- []byte
-func (s Plugin) MGet(ctx context.Context, keys ...string) (map[string]interface{}, error) {
+func (s Plugin) MGet(keys ...string) (map[string]interface{}, error) {
const op = errors.Op("memcached MGet")
if keys == nil {
return nil, errors.E(op, errors.NoKeys)
@@ -141,7 +150,7 @@ func (s Plugin) MGet(ctx context.Context, keys ...string) (map[string]interface{
// Expiration is the cache expiration time, in seconds: either a relative
// time from now (up to 1 month), or an absolute Unix epoch time.
// Zero means the Item has no expiration time.
-func (s Plugin) Set(ctx context.Context, items ...kv.Item) error {
+func (s Plugin) Set(items ...kv.Item) error {
const op = errors.Op("memcached Set")
if items == nil {
return errors.E(op, errors.NoKeys)
@@ -182,7 +191,7 @@ func (s Plugin) Set(ctx context.Context, items ...kv.Item) error {
// Expiration is the cache expiration time, in seconds: either a relative
// time from now (up to 1 month), or an absolute Unix epoch time.
// Zero means the Item has no expiration time.
-func (s Plugin) MExpire(ctx context.Context, items ...kv.Item) error {
+func (s Plugin) MExpire(items ...kv.Item) error {
const op = errors.Op("memcached MExpire")
for i := range items {
if items[i].TTL == "" || strings.TrimSpace(items[i].Key) == "" {
@@ -209,12 +218,12 @@ func (s Plugin) MExpire(ctx context.Context, items ...kv.Item) error {
}
// return time in seconds (int32) for a given keys
-func (s Plugin) TTL(ctx context.Context, keys ...string) (map[string]interface{}, error) {
+func (s Plugin) TTL(keys ...string) (map[string]interface{}, error) {
const op = errors.Op("memcached HTTLas")
return nil, errors.E(op, errors.Str("not valid request for memcached, see https://github.com/memcached/memcached/issues/239"))
}
-func (s Plugin) Delete(ctx context.Context, keys ...string) error {
+func (s Plugin) Delete(keys ...string) error {
const op = errors.Op("memcached Has")
if keys == nil {
return errors.E(op, errors.NoKeys)
diff --git a/plugins/kv/memcached/storage_test.go b/plugins/kv/memcached/storage_test.go
index 4b59bbd0..3d37748b 100644
--- a/plugins/kv/memcached/storage_test.go
+++ b/plugins/kv/memcached/storage_test.go
@@ -1,7 +1,6 @@
package memcached
import (
- "context"
"strconv"
"sync"
"testing"
@@ -16,7 +15,7 @@ func initStorage() kv.Storage {
}
func cleanup(t *testing.T, s kv.Storage, keys ...string) {
- err := s.Delete(context.Background(), keys...)
+ err := s.Delete(keys...)
if err != nil {
t.Fatalf("error during cleanup: %s", err.Error())
}
@@ -25,9 +24,7 @@ func cleanup(t *testing.T, s kv.Storage, keys ...string) {
func TestStorage_Has(t *testing.T) {
s := initStorage()
- ctx := context.Background()
-
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
assert.False(t, v["key"])
}
@@ -41,13 +38,12 @@ func TestStorage_Has_Set_Has(t *testing.T) {
}
}()
- ctx := context.Background()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
// no such key
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -57,7 +53,7 @@ func TestStorage_Has_Set_Has(t *testing.T) {
TTL: "",
}))
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
@@ -73,13 +69,12 @@ func TestStorage_Has_Set_MGet(t *testing.T) {
}
}()
- ctx := context.Background()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
// no such key
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -89,13 +84,13 @@ func TestStorage_Has_Set_MGet(t *testing.T) {
TTL: "",
}))
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
assert.True(t, v["key2"])
- res, err := s.MGet(ctx, "key", "key2")
+ res, err := s.MGet("key", "key2")
assert.NoError(t, err)
assert.Len(t, res, 2)
}
@@ -109,13 +104,12 @@ func TestStorage_Has_Set_Get(t *testing.T) {
}
}()
- ctx := context.Background()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
// no such key
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -125,13 +119,13 @@ func TestStorage_Has_Set_Get(t *testing.T) {
TTL: "",
}))
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
assert.True(t, v["key2"])
- res, err := s.Get(ctx, "key")
+ res, err := s.Get("key")
assert.NoError(t, err)
if string(res) != "hello world" {
@@ -148,13 +142,12 @@ func TestStorage_Set_Del_Get(t *testing.T) {
}
}()
- ctx := context.Background()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
// no such key
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -164,27 +157,26 @@ func TestStorage_Set_Del_Get(t *testing.T) {
TTL: "",
}))
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
assert.True(t, v["key2"])
// check that keys are present
- res, err := s.MGet(ctx, "key", "key2")
+ res, err := s.MGet("key", "key2")
assert.NoError(t, err)
assert.Len(t, res, 2)
- assert.NoError(t, s.Delete(ctx, "key", "key2"))
+ assert.NoError(t, s.Delete("key", "key2"))
// check that keys are not present
- res, err = s.MGet(ctx, "key", "key2")
+ res, err = s.MGet("key", "key2")
assert.NoError(t, err)
assert.Len(t, res, 0)
}
func TestStorage_Set_GetM(t *testing.T) {
s := initStorage()
- ctx := context.Background()
defer func() {
cleanup(t, s, "key", "key2")
@@ -194,11 +186,11 @@ func TestStorage_Set_GetM(t *testing.T) {
}
}()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -208,14 +200,13 @@ func TestStorage_Set_GetM(t *testing.T) {
TTL: "",
}))
- res, err := s.MGet(ctx, "key", "key2")
+ res, err := s.MGet("key", "key2")
assert.NoError(t, err)
assert.Len(t, res, 2)
}
func TestStorage_MExpire_TTL(t *testing.T) {
s := initStorage()
- ctx := context.Background()
defer func() {
cleanup(t, s, "key", "key2")
if err := s.Close(); err != nil {
@@ -224,12 +215,12 @@ func TestStorage_MExpire_TTL(t *testing.T) {
}()
// ensure that storage is clean
- v, err := s.Has(ctx, "key", "key2")
+ v, err := s.Has("key", "key2")
assert.NoError(t, err)
assert.False(t, v["key"])
assert.False(t, v["key2"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -252,12 +243,12 @@ func TestStorage_MExpire_TTL(t *testing.T) {
Value: "",
TTL: nowPlusFive,
}
- assert.NoError(t, s.MExpire(ctx, i1, i2))
+ assert.NoError(t, s.MExpire(i1, i2))
time.Sleep(time.Second * 6)
// ensure that storage is clean
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
assert.False(t, v["key"])
assert.False(t, v["key2"])
@@ -265,7 +256,6 @@ func TestStorage_MExpire_TTL(t *testing.T) {
func TestNilAndWrongArgs(t *testing.T) {
s := initStorage()
- ctx := context.Background()
defer func() {
cleanup(t, s, "key")
if err := s.Close(); err != nil {
@@ -274,46 +264,45 @@ func TestNilAndWrongArgs(t *testing.T) {
}()
// check
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
assert.False(t, v["key"])
- _, err = s.Has(ctx, "")
+ _, err = s.Has("")
assert.Error(t, err)
- _, err = s.Get(ctx, "")
+ _, err = s.Get("")
assert.Error(t, err)
- _, err = s.Get(ctx, " ")
+ _, err = s.Get(" ")
assert.Error(t, err)
- _, err = s.Get(ctx, " ")
+ _, err = s.Get(" ")
assert.Error(t, err)
- _, err = s.MGet(ctx, "key", "key2", "")
+ _, err = s.MGet("key", "key2", "")
assert.Error(t, err)
- _, err = s.MGet(ctx, "key", "key2", " ")
+ _, err = s.MGet("key", "key2", " ")
assert.Error(t, err)
- assert.Error(t, s.Set(ctx, kv.Item{}))
+ assert.Error(t, s.Set(kv.Item{}))
- err = s.Delete(ctx, "")
+ err = s.Delete("")
assert.Error(t, err)
- err = s.Delete(ctx, "key", "")
+ err = s.Delete("key", "")
assert.Error(t, err)
- err = s.Delete(ctx, "key", " ")
+ err = s.Delete("key", " ")
assert.Error(t, err)
- err = s.Delete(ctx, "key")
+ err = s.Delete("key")
assert.NoError(t, err)
}
func TestStorage_SetExpire_TTL(t *testing.T) {
s := initStorage()
- ctx := context.Background()
defer func() {
cleanup(t, s, "key", "key2")
if err := s.Close(); err != nil {
@@ -322,12 +311,12 @@ func TestStorage_SetExpire_TTL(t *testing.T) {
}()
// ensure that storage is clean
- v, err := s.Has(ctx, "key", "key2")
+ v, err := s.Has("key", "key2")
assert.NoError(t, err)
assert.False(t, v["key"])
assert.False(t, v["key2"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -341,7 +330,7 @@ func TestStorage_SetExpire_TTL(t *testing.T) {
nowPlusFive := time.Now().Add(time.Second * 5).Format(time.RFC3339)
// set timeout to 5 sec
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "value",
TTL: nowPlusFive,
@@ -355,7 +344,7 @@ func TestStorage_SetExpire_TTL(t *testing.T) {
time.Sleep(time.Second * 6)
// ensure that storage is clean
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
assert.False(t, v["key"])
assert.False(t, v["key2"])
@@ -370,13 +359,12 @@ func TestConcurrentReadWriteTransactions(t *testing.T) {
}
}()
- ctx := context.Background()
- v, err := s.Has(ctx, "key")
+ v, err := s.Has("key")
assert.NoError(t, err)
// no such key
assert.False(t, v["key"])
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key",
Value: "hello world",
TTL: "",
@@ -386,7 +374,7 @@ func TestConcurrentReadWriteTransactions(t *testing.T) {
TTL: "",
}))
- v, err = s.Has(ctx, "key", "key2")
+ v, err = s.Has("key", "key2")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
@@ -403,7 +391,7 @@ func TestConcurrentReadWriteTransactions(t *testing.T) {
m.Lock()
// set is writable transaction
// it should stop readable
- assert.NoError(t, s.Set(ctx, kv.Item{
+ assert.NoError(t, s.Set(kv.Item{
Key: "key" + strconv.Itoa(i),
Value: "hello world" + strconv.Itoa(i),
TTL: "",
@@ -421,7 +409,7 @@ func TestConcurrentReadWriteTransactions(t *testing.T) {
defer wg.Done()
for i := 0; i <= 1000; i++ {
m.RLock()
- v, err = s.Has(ctx, "key")
+ v, err = s.Has("key")
assert.NoError(t, err)
// no such key
assert.True(t, v["key"])
@@ -434,7 +422,7 @@ func TestConcurrentReadWriteTransactions(t *testing.T) {
defer wg.Done()
for i := 0; i <= 1000; i++ {
m.Lock()
- err = s.Delete(ctx, "key"+strconv.Itoa(i))
+ err = s.Delete("key" + strconv.Itoa(i))
assert.NoError(t, err)
m.Unlock()
}