Skip to content

Commit b06dd9b

Browse files
authored
Merge branch 'master' into master
2 parents 8c9c5af + c930c97 commit b06dd9b

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

state/memcached/memcached.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
hosts = "hosts"
1919
maxIdleConnections = "maxIdleConnections"
2020
timeout = "timeout"
21+
ttlInSeconds = "ttlInSeconds"
2122
// These defaults are already provided by gomemcache
2223
defaultMaxIdleConnections = 2
2324
defaultTimeout = 1000 * time.Millisecond
@@ -102,10 +103,33 @@ func getMemcachedMetadata(metadata state.Metadata) (*memcachedMetadata, error) {
102103
return &meta, nil
103104
}
104105

106+
func (m *Memcached) parseTTL(req *state.SetRequest) (*int32, error) {
107+
if val, ok := req.Metadata[ttlInSeconds]; ok && val != "" {
108+
parsedVal, err := strconv.ParseInt(val, 10, 0)
109+
if err != nil {
110+
return nil, err
111+
}
112+
parsedInt := int32(parsedVal)
113+
114+
return &parsedInt, nil
115+
}
116+
117+
return nil, nil
118+
}
119+
105120
func (m *Memcached) setValue(req *state.SetRequest) error {
106121
var bt []byte
122+
ttl, err := m.parseTTL(req)
123+
if err != nil {
124+
return fmt.Errorf("failed to parse ttl %s: %s", req.Key, err)
125+
}
126+
107127
bt, _ = utils.Marshal(req.Value, m.json.Marshal)
108-
err := m.client.Set(&memcache.Item{Key: req.Key, Value: bt})
128+
if ttl != nil {
129+
err = m.client.Set(&memcache.Item{Key: req.Key, Value: bt, Expiration: *ttl})
130+
} else {
131+
err = m.client.Set(&memcache.Item{Key: req.Key, Value: bt})
132+
}
109133
if err != nil {
110134
return fmt.Errorf("failed to set key %s: %s", req.Key, err)
111135
}

state/memcached/memcached_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package memcached
22

33
import (
4+
"strconv"
45
"strings"
56
"testing"
67
"time"
78

89
"github.com/dapr/components-contrib/state"
10+
"github.com/dapr/kit/logger"
911
"github.com/stretchr/testify/assert"
1012
)
1113

@@ -65,3 +67,52 @@ func TestMemcachedMetadata(t *testing.T) {
6567
assert.Equal(t, 5000*time.Millisecond, metadata.timeout)
6668
})
6769
}
70+
71+
func TestParseTTL(t *testing.T) {
72+
store := NewMemCacheStateStore(logger.NewLogger("test"))
73+
t.Run("TTL Not an integer", func(t *testing.T) {
74+
ttlInSeconds := "not an integer"
75+
ttl, err := store.parseTTL(&state.SetRequest{
76+
Metadata: map[string]string{
77+
"ttlInSeconds": ttlInSeconds,
78+
},
79+
})
80+
81+
assert.NotNil(t, err, "tll is not an integer")
82+
assert.Nil(t, ttl)
83+
})
84+
t.Run("TTL specified with wrong key", func(t *testing.T) {
85+
ttlInSeconds := 12345
86+
ttl, err := store.parseTTL(&state.SetRequest{
87+
Metadata: map[string]string{
88+
"expirationTime": strconv.Itoa(ttlInSeconds),
89+
},
90+
})
91+
92+
assert.NoError(t, err)
93+
assert.Nil(t, ttl)
94+
})
95+
t.Run("TTL is a number", func(t *testing.T) {
96+
ttlInSeconds := 12345
97+
ttl, err := store.parseTTL(&state.SetRequest{
98+
Metadata: map[string]string{
99+
"ttlInSeconds": strconv.Itoa(ttlInSeconds),
100+
},
101+
})
102+
103+
assert.NoError(t, err)
104+
assert.Equal(t, int(*ttl), ttlInSeconds)
105+
})
106+
107+
t.Run("TTL never expires", func(t *testing.T) {
108+
ttlInSeconds := 0
109+
ttl, err := store.parseTTL(&state.SetRequest{
110+
Metadata: map[string]string{
111+
"ttlInSeconds": strconv.Itoa(ttlInSeconds),
112+
},
113+
})
114+
115+
assert.NoError(t, err)
116+
assert.Equal(t, int(*ttl), ttlInSeconds)
117+
})
118+
}

0 commit comments

Comments
 (0)