Skip to content

Commit 7726479

Browse files
wolfchkovVolchkov Andrey
and
Volchkov Andrey
authored
feat: added support of durable delete to the AerospikeExpiredDocumentsCleaner, and the possibility of replacing the default ExpiredDocumentsCleaner bean (#1652)
Co-authored-by: Volchkov Andrey <[email protected]>
1 parent a29e8cd commit 7726479

5 files changed

+136
-4
lines changed

embedded-aerospike/src/main/java/com/playtika/test/aerospike/AerospikeExpiredDocumentsCleaner.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.aerospike.client.AerospikeClient;
44
import com.aerospike.client.Language;
55
import com.aerospike.client.Value;
6+
import com.aerospike.client.policy.WritePolicy;
67
import com.aerospike.client.query.Statement;
78
import com.aerospike.client.task.ExecuteTask;
89
import com.aerospike.client.task.RegisterTask;
@@ -22,16 +23,22 @@ public class AerospikeExpiredDocumentsCleaner implements ExpiredDocumentsCleaner
2223

2324
private final AerospikeClient client;
2425
private final String namespace;
26+
private final boolean durableDelete;
2527

26-
public AerospikeExpiredDocumentsCleaner(AerospikeClient client, String namespace) {
28+
public AerospikeExpiredDocumentsCleaner(AerospikeClient client, String namespace, boolean durableDelete) {
2729
Assert.notNull(client, "Aerospike client can not be null");
2830
Assert.notNull(namespace, "Namespace can not be null");
2931
this.client = client;
3032
this.namespace = namespace;
33+
this.durableDelete = durableDelete;
3134

3235
registerUdf();
3336
}
3437

38+
public AerospikeExpiredDocumentsCleaner(AerospikeClient client, String namespace) {
39+
this(client, namespace, false);
40+
}
41+
3542
private void registerUdf() {
3643
ClassLoader classLoader = AerospikeExpiredDocumentsCleaner.class.getClassLoader();
3744
RegisterTask registerTask = client.register(null, classLoader, RESOURCE_PATH, SERVER_PATH, Language.LUA);
@@ -51,8 +58,9 @@ public void cleanExpiredDocumentsBefore(long expireTimeMillis) {
5158

5259
Statement statement = new Statement();
5360
statement.setNamespace(namespace);
54-
55-
ExecuteTask executeTask = client.execute(null, statement, PACKAGE_NAME, FUNC_NAME, value);
61+
WritePolicy writePolicy = new WritePolicy(client.getWritePolicyDefault());
62+
writePolicy.durableDelete = durableDelete;
63+
ExecuteTask executeTask = client.execute(writePolicy, statement, PACKAGE_NAME, FUNC_NAME, value);
5664
executeTask.waitTillComplete(SLEEP_INTERVAL, TIMEOUT);
5765
}
5866
}

embedded-aerospike/src/main/java/com/playtika/test/aerospike/AerospikeProperties.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@ConfigurationProperties("embedded.aerospike")
1414
public class AerospikeProperties extends CommonContainerProperties {
1515

16-
static final String AEROSPIKE_BEAN_NAME = "aerospike";
16+
public static final String AEROSPIKE_BEAN_NAME = "aerospike";
1717

1818
boolean enabled = true;
1919
String namespace = "TEST";

embedded-aerospike/src/main/java/com/playtika/test/aerospike/EmbeddedAerospikeTestOperationsAutoConfiguration.java

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public PackageInstaller aerospikePackageInstaller(
4444
}
4545

4646
@Bean
47+
@ConditionalOnMissingBean
4748
@ConditionalOnProperty(value = "embedded.aerospike.time-travel.enabled", havingValue="true", matchIfMissing = true)
4849
public ExpiredDocumentsCleaner expiredDocumentsCleaner(AerospikeClient client,
4950
AerospikeProperties properties) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.playtika.test.aerospike;
2+
3+
import com.aerospike.client.AerospikeClient;
4+
import com.aerospike.client.Bin;
5+
import com.aerospike.client.Key;
6+
import com.aerospike.client.policy.ClientPolicy;
7+
import com.aerospike.client.policy.WritePolicy;
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.beans.factory.annotation.Value;
11+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Configuration;
15+
import org.springframework.context.annotation.Primary;
16+
17+
import java.time.Instant;
18+
import java.time.temporal.ChronoUnit;
19+
import java.util.concurrent.TimeUnit;
20+
21+
import static org.assertj.core.api.Assertions.assertThat;
22+
23+
@SpringBootTest(
24+
classes = AerospikeExpiredDocumentsCleanerWithDurableDeleteTest.TestConfiguration.class
25+
)
26+
class AerospikeExpiredDocumentsCleanerWithDurableDeleteTest {
27+
28+
static final String SET_NAME = "some-set";
29+
30+
@Value("${embedded.aerospike.namespace}")
31+
String namespace;
32+
@Autowired
33+
ExpiredDocumentsCleaner durableDeleteExpiredDocumentsCleaner;
34+
@Autowired
35+
AerospikeClient aerospikeClient;
36+
37+
@Test
38+
public void shouldNotRemoveExpiredWithDurableDeleteFlagBecauseOfAerospikeCommunityEdition() {
39+
Key key = new Key(namespace, SET_NAME, "shouldRemoveExpired");
40+
putBin(key, (int) TimeUnit.DAYS.toSeconds(1));
41+
42+
Instant plus23 = Instant.now().plus(23, ChronoUnit.HOURS);
43+
durableDeleteExpiredDocumentsCleaner.cleanExpiredDocumentsBefore(plus23);
44+
assertThat(aerospikeClient.get(null, key)).isNotNull();
45+
46+
Instant plus25 = Instant.now().plus(25, ChronoUnit.HOURS);
47+
durableDeleteExpiredDocumentsCleaner.cleanExpiredDocumentsBefore(plus25);
48+
assertThat(aerospikeClient.get(null, key)).isNotNull();
49+
}
50+
private void putBin(Key key, int expiration) {
51+
Bin bin = new Bin("mybin", "myvalue");
52+
53+
WritePolicy writePolicy = new WritePolicy(aerospikeClient.getWritePolicyDefault());
54+
writePolicy.expiration = expiration;
55+
aerospikeClient.put(writePolicy, key, bin);
56+
}
57+
58+
@EnableAutoConfiguration
59+
@Configuration
60+
static class TestConfiguration {
61+
62+
@Primary
63+
@Bean(destroyMethod = "close")
64+
public AerospikeClient aerospikeClient(@Value("${embedded.aerospike.host}") String host,
65+
@Value("${embedded.aerospike.port}") int port) {
66+
ClientPolicy clientPolicy = new ClientPolicy();
67+
clientPolicy.timeout = 10_000;//in millis
68+
return new AerospikeClient(clientPolicy, host, port);
69+
}
70+
71+
@Bean
72+
public ExpiredDocumentsCleaner durableDeleteExpiredDocumentsCleaner(AerospikeClient client,
73+
AerospikeProperties properties) {
74+
return new AerospikeExpiredDocumentsCleaner(client, properties.getNamespace(), true);
75+
}
76+
}
77+
78+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.playtika.test.aerospike;
2+
3+
import com.aerospike.client.AerospikeClient;
4+
import org.junit.jupiter.api.Test;
5+
import org.mockito.Mockito;
6+
import org.springframework.boot.autoconfigure.AutoConfigurations;
7+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
13+
public class ReplaceExpiredDocumentsCleanerBeanTest {
14+
15+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
16+
.withUserConfiguration(TestConfiguration.class)
17+
.withConfiguration(AutoConfigurations.of(
18+
EmbeddedAerospikeBootstrapConfiguration.class,
19+
EmbeddedAerospikeTestOperationsAutoConfiguration.class));
20+
21+
@Test
22+
public void contextLoadsWithOtherExpiredDocumentsCleaner() {
23+
contextRunner.run(context -> assertThat(context)
24+
.hasNotFailed()
25+
.doesNotHaveBean("expiredDocumentsCleaner")
26+
.hasBean("otherExpiredDocumentsCleaner")
27+
);
28+
}
29+
30+
@Configuration
31+
public static class TestConfiguration {
32+
33+
@Bean
34+
public ExpiredDocumentsCleaner otherExpiredDocumentsCleaner() {
35+
return Mockito.mock(ExpiredDocumentsCleaner.class);
36+
}
37+
38+
@Bean
39+
public AerospikeClient mockAerospikeClient() {
40+
return Mockito.mock(AerospikeClient.class);
41+
}
42+
43+
}
44+
45+
}

0 commit comments

Comments
 (0)