-
Bug
-
Resolution: Done
-
Blocker
-
3.7.2.Final, 4.0.0.Alpha1, 4.0.0.Alpha2
-
None
-
None
When I have a repository with federated data sources (e.g. the FileSystemConnector) and am using the InfinispanBinaryStore, I get this NPE removing a node with a binary property, e.g.:
@Test public void testDeleteDatastreamNode() throws Exception { Session session = repo.login(); final Node node = new JcrTools().findOrCreateNode(session, "/testDatastreamNode1", NT_FILE); final Node contentNode = new JcrTools().findOrCreateChild(node, JCR_CONTENT, NT_RESOURCE); final ValueFactory modevf = (ValueFactory) node.getSession().getValueFactory(); final javax.jcr.Binary binary = modevf.createBinary(new ByteArrayInputStream("asdf".getBytes())); contentNode.setProperty(JCR_DATA, binary); session.save(); session.logout(); session = repo.login(); session.getNode("/testDatastreamNode1").remove(); session.save(); ## The NPE occurs here session.logout(); }
The stack trace (under 4.0.0.Alpha2) includes:
javax.jcr.RepositoryException: java.lang.NullPointerException at org.modeshape.jcr.cache.document.DocumentTranslator.decrementBinaryReferenceCount(DocumentTranslator.java:1265) at org.modeshape.jcr.cache.document.WritableSessionCache.persistChanges(WritableSessionCache.java:952) at org.modeshape.jcr.cache.document.WritableSessionCache.save(WritableSessionCache.java:613) at org.modeshape.jcr.JcrSession.save(JcrSession.java:1131)
Here is a snippet of an offending Modeshape configuration:
...
"storage" : {
"cacheName" : "FedoraRepository",
"cacheConfiguration" : "${fcrepo.infinispan.cache_configuration:config/testing/infinispan-basic.xml}",
"binaryStorage" : {
"type" : "cache",
"dataCacheName" : "dataCache",
"metadataCacheName" : "metadataCache"
}
},
"externalSources" : {
"fileSystem" : { "classname" : "org.modeshape.connector.filesystem.FileSystemConnector",
"directoryPath" : "target/test-classes/test-objects",
"readonly" : false,
"extraPropertiesStorage": "json",
"cacheTtlSeconds" : 5,
"projections" : [ "default:/files => /" ]
}
},
...
This configuration works fine if I remove the binary store configuration:
...
"storage" : {
"cacheName" : "FedoraRepository",
"cacheConfiguration" : "${fcrepo.infinispan.cache_configuration:config/testing/infinispan-basic.xml}"
},
"externalSources" : {
"fileSystem" : { "classname" : "org.modeshape.connector.filesystem.FileSystemConnector",
"directoryPath" : "target/test-classes/test-objects",
"readonly" : false,
"extraPropertiesStorage": "json",
"cacheTtlSeconds" : 5,
"projections" : [ "default:/files => /" ]
}
},
Or the external sources:
...
"storage" : {
"cacheName" : "FedoraRepository",
"cacheConfiguration" : "${fcrepo.infinispan.cache_configuration:config/testing/infinispan-basic.xml}",
"binaryStorage" : {
"type" : "cache",
"dataCacheName" : "dataCache",
"metadataCacheName" : "metadataCache"
}
}
I added some logging in the failing case and saw the FederatedDocumentStore attempts to find the "-ref" node in the connectors, fails, and returns null:
TRACE 14:56:02.338 (DocumentTranslator) decrementBinaryReferenceCount for binary (3B, SHA1=0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33)
TRACE 14:56:02.338 (DocumentTranslator) documentStore: org.modeshape.jcr.federation.FederatedDocumentStore@2263811f
TRACE 14:56:02.338 (DocumentTranslator) documentStore.get(0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33-ref)
TRACE 14:56:02.338 (FederatedDocumentStore) get(0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33-ref)
TRACE 14:56:02.338 (FederatedDocumentStore) looking in connectors
TRACE 14:56:02.338 (FederatedDocumentStore) giving up