Affects Version/s: 1.7.4 (Hopper SR4)
Fix Version/s: None
Component/s: Repository Support
When using the KeyValueRepository interface and enableRedisRepositories:
After the initial creation - repository.save() - everything is fine here.
When doing an update operation: calling repository.save() - correctly detects that this is an update and calls
SimpleKeyValueRepository().save() --> KeyValueTemplate.update(....) --> which calls the callback method:
doInRedis(RedisConnection connection ).. In this method I see an issue:
Issue: A call is being made to delete the key
boolean isNew = connection.del(objectKey) == 0;
and it is promptly added back in the same callback method.
During this period if another thread is looking up the key - it indicates the key is not there and shortly afterwards it reappears.
Two issues here:
1) Integrity of redis is not maintained - a key is being deleted in the process of an update.
2) In the event of a crash around this critical section I believe the integrity of the data is getting compromised.
How to reproduce this:
Do an update operation on the repository in a debugger and suspend the thread after the delete operation. Use another client to look up the key.
Should the connection.del(objectKey) be changed to connection.exisits(objectKey) to fix this.