DATAREDIS-589 - Move secondary index cleanup to MappingExpirationListener.
We now no longer rely on ApplicationEvents captured in the RedisKeyValueAdapter for performing cleanup operations for expired keys, but do this along with the phantom key removal. This removes a flaw when initializing a non repository related KeyspaceEventListener publishing events that actually are unrelated to the Adapter. Additionally upgraded test infrastructure to utilize Redis 3.2.6 with disabled protected-mode and enabled keyspace-events. Original pull request: #232.
This commit is contained in:
committed by
Mark Paluch
parent
0999c04332
commit
0f7607e515
@@ -24,6 +24,7 @@ import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.AfterClass;
|
||||
@@ -43,6 +44,7 @@ import org.springframework.data.redis.connection.RedisConnection;
|
||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||
import org.springframework.data.redis.core.RedisKeyValueAdapter.EnableKeyspaceEvents;
|
||||
import org.springframework.data.redis.core.convert.Bucket;
|
||||
import org.springframework.data.redis.core.convert.KeyspaceConfiguration;
|
||||
import org.springframework.data.redis.core.convert.MappingConfiguration;
|
||||
@@ -92,6 +94,7 @@ public class RedisKeyValueAdapterTests {
|
||||
mappingContext.afterPropertiesSet();
|
||||
|
||||
adapter = new RedisKeyValueAdapter(template, mappingContext);
|
||||
adapter.setEnableKeyspaceEvents(EnableKeyspaceEvents.ON_STARTUP);
|
||||
adapter.afterPropertiesSet();
|
||||
|
||||
template.execute(new RedisCallback<Void>() {
|
||||
@@ -239,26 +242,67 @@ public class RedisKeyValueAdapterTests {
|
||||
assertThat(template.opsForSet().members("persons:firstname:rand"), not(hasItem("1")));
|
||||
}
|
||||
|
||||
@Test // DATAREDIS-425
|
||||
public void keyExpiredEventShouldRemoveHelperStructures() {
|
||||
/**
|
||||
* @see DATAREDIS-425
|
||||
*/
|
||||
@Test
|
||||
public void keyExpiredEventShouldRemoveHelperStructures() throws InterruptedException {
|
||||
|
||||
Map<String, String> map = new LinkedHashMap<String, String>();
|
||||
map.put("_class", Person.class.getName());
|
||||
map.put("firstname", "rand");
|
||||
map.put("address.country", "Andor");
|
||||
|
||||
template.opsForHash().putAll("persons:1", map);
|
||||
template.expire("persons:1", 1, TimeUnit.SECONDS);
|
||||
|
||||
template.opsForSet().add("persons", "1");
|
||||
template.opsForSet().add("persons:firstname:rand", "1");
|
||||
template.opsForSet().add("persons:1:idx", "persons:firstname:rand");
|
||||
|
||||
adapter.onApplicationEvent(new RedisKeyExpiredEvent("persons:1".getBytes(Bucket.CHARSET)));
|
||||
int iterationCount = 0;
|
||||
while (template.hasKey("persons:1") && iterationCount++ < 3) { // ci might be a little slow
|
||||
Thread.sleep(2000);
|
||||
}
|
||||
|
||||
assertThat(template.hasKey("persons:1"), is(false));
|
||||
assertThat(template.hasKey("persons:firstname:rand"), is(false));
|
||||
assertThat(template.hasKey("persons:1:idx"), is(false));
|
||||
assertThat(template.opsForSet().members("persons"), not(hasItem("1")));
|
||||
}
|
||||
|
||||
@Test // DATAREDIS-512
|
||||
/**
|
||||
* @see DATAREDIS-589
|
||||
*/
|
||||
@Test
|
||||
public void keyExpiredEventWithoutKeyspaceShouldBeIgnored() throws InterruptedException {
|
||||
|
||||
Map<String, String> map = new LinkedHashMap<String, String>();
|
||||
map.put("_class", Person.class.getName());
|
||||
map.put("firstname", "rand");
|
||||
map.put("address.country", "Andor");
|
||||
|
||||
template.opsForHash().putAll("persons:1", map);
|
||||
template.opsForHash().putAll("1", map);
|
||||
|
||||
template.expire("1", 1, TimeUnit.SECONDS);
|
||||
|
||||
template.opsForSet().add("persons", "1");
|
||||
template.opsForSet().add("persons:firstname:rand", "1");
|
||||
template.opsForSet().add("persons:1:idx", "persons:firstname:rand");
|
||||
|
||||
Thread.sleep(2000);
|
||||
|
||||
assertThat(template.hasKey("persons:1"), is(true));
|
||||
assertThat(template.hasKey("persons:firstname:rand"), is(true));
|
||||
assertThat(template.hasKey("persons:1:idx"), is(true));
|
||||
assertThat(template.opsForSet().members("persons"), hasItem("1"));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAREDIS-512
|
||||
*/
|
||||
@Test
|
||||
public void putWritesIndexDataCorrectly() {
|
||||
|
||||
Person rand = new Person();
|
||||
|
||||
Reference in New Issue
Block a user