-
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