Skip to content

Commit da5a8aa

Browse files
authored
Merge pull request #283 from semihbkgr/hazelcast-tag-ttl
feat: add TTL support for tags in Hazelcast store
2 parents aa0d213 + 2caf9d9 commit da5a8aa

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

store/hazelcast/hazelcast.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ const (
2626
HazelcastType = "hazelcast"
2727
// HazelcastTagPattern represents the tag pattern to be used as a key in specified storage
2828
HazelcastTagPattern = "gocache_tag_%s"
29-
30-
TagKeyExpiry = 720 * time.Hour
3129
)
3230

3331
// HazelcastStore is a store for Hazelcast
@@ -76,12 +74,12 @@ func (s *HazelcastStore) Set(ctx context.Context, key any, value any, options ..
7674
return err
7775
}
7876
if tags := opts.Tags; len(tags) > 0 {
79-
s.setTags(ctx, s.hzMap, key, tags)
77+
s.setTags(ctx, s.hzMap, key, tags, opts.TagsTTL)
8078
}
8179
return nil
8280
}
8381

84-
func (s *HazelcastStore) setTags(ctx context.Context, hzMap HazelcastMapInterface, key any, tags []string) {
82+
func (s *HazelcastStore) setTags(ctx context.Context, hzMap HazelcastMapInterface, key any, tags []string, ttl time.Duration) {
8583
group, ctx := errgroup.WithContext(ctx)
8684
for _, tag := range tags {
8785
currentTag := tag
@@ -91,18 +89,20 @@ func (s *HazelcastStore) setTags(ctx context.Context, hzMap HazelcastMapInterfac
9189
if err != nil {
9290
return err
9391
}
94-
if tagValue == nil {
95-
return hzMap.SetWithTTL(ctx, tagKey, key.(string), TagKeyExpiry)
96-
}
97-
cacheKeys := strings.Split(tagValue.(string), ",")
98-
for _, cacheKey := range cacheKeys {
99-
if key == cacheKey {
100-
return nil
92+
93+
newTagValue := key.(string)
94+
if tagValue != nil {
95+
cacheKeys := strings.Split(tagValue.(string), ",")
96+
for _, cacheKey := range cacheKeys {
97+
if key == cacheKey {
98+
return nil
99+
}
101100
}
101+
cacheKeys = append(cacheKeys, key.(string))
102+
newTagValue = strings.Join(cacheKeys, ",")
102103
}
103-
cacheKeys = append(cacheKeys, key.(string))
104-
newTagValue := strings.Join(cacheKeys, ",")
105-
return hzMap.SetWithTTL(ctx, tagKey, newTagValue, TagKeyExpiry)
104+
105+
return hzMap.SetWithTTL(ctx, tagKey, newTagValue, ttl)
106106
})
107107
}
108108
group.Wait()

store/hazelcast/hazelcast_test.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func TestHazelcastSetWithTags(t *testing.T) {
9898

9999
hzMap := NewMockHazelcastMapInterface(ctrl)
100100
hzMap.EXPECT().SetWithTTL(ctx, cacheKey, cacheValue, time.Duration(0)).Return(nil)
101-
hzMap.EXPECT().SetWithTTL(gomock.Any(), "gocache_tag_tag1", cacheKey, TagKeyExpiry).Return(nil)
101+
hzMap.EXPECT().SetWithTTL(gomock.Any(), "gocache_tag_tag1", cacheKey, time.Duration(0)).Return(nil)
102102
hzMap.EXPECT().Get(gomock.Any(), "gocache_tag_tag1").Return(nil, nil)
103103

104104
store := NewHazelcast(hzMap)
@@ -110,6 +110,29 @@ func TestHazelcastSetWithTags(t *testing.T) {
110110
assert.Nil(t, err)
111111
}
112112

113+
func TestHazelcastSetWithTagsTTL(t *testing.T) {
114+
// Given
115+
ctrl := gomock.NewController(t)
116+
117+
ctx := context.Background()
118+
119+
cacheKey := "my-key"
120+
cacheValue := "my-cache-value"
121+
122+
hzMap := NewMockHazelcastMapInterface(ctrl)
123+
hzMap.EXPECT().SetWithTTL(ctx, cacheKey, cacheValue, time.Duration(0)).Return(nil)
124+
hzMap.EXPECT().SetWithTTL(gomock.Any(), "gocache_tag_tag1", cacheKey, 10*time.Second).Return(nil)
125+
hzMap.EXPECT().Get(gomock.Any(), "gocache_tag_tag1").Return(nil, nil)
126+
127+
store := NewHazelcast(hzMap)
128+
129+
// When
130+
err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"}), lib_store.WithTagsTTL(10*time.Second))
131+
132+
// Then
133+
assert.Nil(t, err)
134+
}
135+
113136
func TestHazelcastDelete(t *testing.T) {
114137
// Given
115138
ctrl := gomock.NewController(t)

0 commit comments

Comments
 (0)