Skip to content

Commit 909bda1

Browse files
committed
added deleteAllMatchingEntries
Signed-off-by: munishchouhan <hrma017@gmail.com>
1 parent b2790ee commit 909bda1

7 files changed

Lines changed: 88 additions & 0 deletions

File tree

src/main/groovy/io/seqera/wave/service/counter/AbstractCounterStore.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ abstract class AbstractCounterStore implements CounterStore {
5555
Map<String, Long> getAllMatchingEntries(String pattern) {
5656
provider.getAllMatchingEntries(getPrefix(), pattern)
5757
}
58+
59+
@Override
60+
void deleteAllMatchingEntries(String pattern) {
61+
provider.getAllMatchingEntries(getPrefix(), pattern)
62+
}
5863
}

src/main/groovy/io/seqera/wave/service/counter/CounterStore.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,10 @@ interface CounterStore {
3434
* @return all the entries whose field matches 'pattern'
3535
*/
3636
Map<String, Long> getAllMatchingEntries(String pattern)
37+
38+
/**
39+
* @param pattern
40+
* @return void
41+
*/
42+
void deleteAllMatchingEntries(String pattern)
3743
}

src/main/groovy/io/seqera/wave/service/counter/impl/CounterProvider.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,12 @@ interface CounterProvider {
3535
* @return all the entries whose field matches 'pattern'
3636
*/
3737
Map<String, Long> getAllMatchingEntries(String key, String pattern)
38+
39+
/**
40+
*
41+
* @param key
42+
* @param pattern
43+
* @return void
44+
*/
45+
void deleteAllMatchingEntries(String key, String pattern)
3846
}

src/main/groovy/io/seqera/wave/service/counter/impl/LocalCounterProvider.groovy

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,16 @@ class LocalCounterProvider implements CounterProvider {
6161
}
6262
return result
6363
}
64+
65+
@Override
66+
void deleteAllMatchingEntries(String key, String pattern) {
67+
Pattern compiledPattern = Pattern.compile(pattern.replace('*', '.*'))
68+
Map keyStore = store.get(key)
69+
if (keyStore){
70+
def matchingPairs = keyStore.findAll {entry -> compiledPattern.matcher(entry.key).matches()}
71+
matchingPairs.each { k, v ->
72+
keyStore.remove(k)
73+
}
74+
}
75+
}
6476
}

src/main/groovy/io/seqera/wave/service/counter/impl/RedisCounterProvider.groovy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,17 @@ class RedisCounterProvider implements CounterProvider {
7070
return result
7171
}
7272
}
73+
74+
@Override
75+
void deleteAllMatchingEntries(String key, String pattern) {
76+
try(Jedis conn=pool.getResource() ) {
77+
final scanResult = conn.hscan(key, "0", new ScanParams().match(pattern).count(hscanCount))
78+
if( !scanResult )
79+
return
80+
for(String entry : scanResult.result) {
81+
final parts = entry.tokenize('=')
82+
conn.hdel(key, parts[0])
83+
}
84+
}
85+
}
7386
}

src/test/groovy/io/seqera/wave/service/counter/impl/LocalCounterProviderTest.groovy

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,26 @@ class LocalCounterProviderTest extends Specification {
7373
['pulls/o/abc.com.au/d/2024-05-30':1]
7474
}
7575

76+
def 'should delete records with given pattern' () {
77+
when:
78+
localCounterProvider.inc('metrics/v1', 'builds/o/foo.com', 1)
79+
localCounterProvider.inc('metrics/v1', 'builds/o/bar.io', 1)
80+
localCounterProvider.inc('metrics/v1', 'builds/o/abc.org', 2)
81+
localCounterProvider.inc('metrics/v1', 'pulls/o/foo.it', 1)
82+
localCounterProvider.inc('metrics/v1', 'pulls/o/bar.es', 2)
83+
localCounterProvider.inc('metrics/v1', 'pulls/o/abc.in', 3)
84+
localCounterProvider.inc('metrics/v1', 'pulls/o/abc.com.au/d/2024-07-15', 1)
85+
localCounterProvider.inc('metrics/v1', 'pulls/o/abc.com.au/d/2024-07-14', 1)
86+
localCounterProvider.inc('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14', 1)
87+
localCounterProvider.inc('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14', 1)
88+
89+
then:'delete all pull counter keys'
90+
localCounterProvider.deleteAllMatchingEntries('metrics/v1', 'pulls/o/*')
91+
localCounterProvider.getAllMatchingEntries('metrics/v1', 'pulls/o/*') == [:]
92+
localCounterProvider.getAllMatchingEntries('metrics/v1', 'pulls/o/*/d/2024-05-30') == [:]
93+
and:'delete only build per specific date counter keys'
94+
localCounterProvider.deleteAllMatchingEntries('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14')
95+
localCounterProvider.getAllMatchingEntries('metrics/v1', 'builds/o/*') == ['builds/o/foo.com':1, 'builds/o/bar.io':1, 'builds/o/abc.org':2]
96+
}
97+
7698
}

src/test/groovy/io/seqera/wave/service/counter/impl/RedisCounterProviderTest.groovy

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,26 @@ class RedisCounterProviderTest extends Specification implements RedisTestContain
8282
redisCounterProvider.getAllMatchingEntries('metrics/v1', 'pulls/o/*/d/2024-05-30') ==
8383
['pulls/o/abc.com.au/d/2024-05-30':1]
8484
}
85+
86+
def 'should delete records with given pattern' () {
87+
when:
88+
redisCounterProvider.inc('metrics/v1', 'builds/o/foo.com', 1)
89+
redisCounterProvider.inc('metrics/v1', 'builds/o/bar.io', 1)
90+
redisCounterProvider.inc('metrics/v1', 'builds/o/abc.org', 2)
91+
redisCounterProvider.inc('metrics/v1', 'pulls/o/foo.it', 1)
92+
redisCounterProvider.inc('metrics/v1', 'pulls/o/bar.es', 2)
93+
redisCounterProvider.inc('metrics/v1', 'pulls/o/abc.in', 3)
94+
redisCounterProvider.inc('metrics/v1', 'pulls/o/abc.com.au/d/2024-07-15', 1)
95+
redisCounterProvider.inc('metrics/v1', 'pulls/o/abc.com.au/d/2024-07-14', 1)
96+
redisCounterProvider.inc('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14', 1)
97+
redisCounterProvider.inc('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14', 1)
98+
99+
then:'delete all pull counter keys'
100+
redisCounterProvider.deleteAllMatchingEntries('metrics/v1', 'pulls/o/*')
101+
redisCounterProvider.getAllMatchingEntries('metrics/v1', 'pulls/o/*') == [:]
102+
redisCounterProvider.getAllMatchingEntries('metrics/v1', 'pulls/o/*/d/2024-05-30') == [:]
103+
and:'delete only build per specific date counter keys'
104+
redisCounterProvider.deleteAllMatchingEntries('metrics/v1', 'builds/o/abc.com.au/d/2024-07-14')
105+
redisCounterProvider.getAllMatchingEntries('metrics/v1', 'builds/o/*') == ['builds/o/foo.com':1, 'builds/o/bar.io':1, 'builds/o/abc.org':2]
106+
}
85107
}

0 commit comments

Comments
 (0)