-
Bug
-
Resolution: Done
-
Major
-
None
-
None
-
None
With async cross-site (IRAC) and max-idle:
replicatedCache:
backups:
AccA:
backup:
strategy: "ASYNC"
stateTransfer:
chunkSize: "512"
timeout: "2400000"
maxRetries: "30"
waitTime: "2000"
mode: "AUTO"
mode: "SYNC"
statistics: "true"
encoding:
key:
mediaType: "text/plain"
value:
mediaType: "application/octet-stream"
expiration:
lifespan: "-1"
maxIdle: "1200000"
The following NullPointerException is thrown:
java.lang.NullPointerException: Cannot invoke "org.infinispan.metadata.impl.IracMetadata.getVersion()" because "remoteMetadata" is null at org.infinispan.interceptors.impl.NonTxIracRemoteSiteInterceptor.validateRemoteUpdate(NonTxIracRemoteSiteInterceptor.java:153) ... org.infinispan.xsite.ClusteredCacheBackupReceiver.removeKey(ClusteredCacheBackupReceiver.java:224) at org.infinispan.xsite.commands.remote.IracPutManyRequest$Expire.execute(IracPutManyRequest.java:186) at org.infinispan.xsite.commands.remote.IracPutManyRequest.executeOperation(IracPutManyRequest.java:61) at org.infinispan.xsite.commands.remote.IracUpdateKeyRequest.invokeInLocalCache(IracUpdateKeyRequest.java:24) at org.infinispan.xsite.commands.remote.XSiteCacheRequest.invokeInLocalSite(XSiteCacheRequest.java:55)
One possible cause, the IRAC queue is being flushed when a concurrent write happens. The tombstone is removed and nullis sent with the expiration command.
Another cause may be a concurrent tombstone cleanup while the queue is flushed.
We should skip sending the expiration request when tombstone is null here:
infinispan/core/src/main/java/org/infinispan/xsite/irac/DefaultIracManager.java
Lines 430 to 432 in 2ef455e
| if (data.state.isExpiration()) {| |cmd.addExpire(data.state.getKey(), data.tombstone);| |}else if (data.entry == null) { |
Additional information
Original report: infinispan/infinispan-operator#2270
- links to