Reputation: 5259
When trying to create new nodes in an already existing database, I am getting the following exception:
org.neo4j.kernal.StoreLockException
.
The code snippit below is the actual line that results in the exception. Below that I have attached some more detail and the full stack trace.
If I create a new folder and use that as the DB_PATH
, then my code works fine on the first run. On the second run, it will fail with the same exception. It appears something is preventing the lock from being obtained.
I tried to set permissions to Read/Write on every file in the DB_PATH
. No luck. Is there a setting in one of the config files that must be disabled with regard to locks?
Code Throwing Exception
graphDB = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
More Detail (Line 6)
private static GraphDatabaseService graphDB = null;
public static final String DB_PATH = "/Users/NtroduceMe/Downloads/neo4j-community-2.0.0-M03/data/ntroduceme";
private static Index<Node> userNodeIndex;
private static Index<Node> rememberMeNodeIndex;
static {
graphDB = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
registerShutdownHook(graphDB);
userNodeIndex = graphDB.index().forNodes("profile_id");
rememberMeNodeIndex = graphDB.index().forNodes("profile_id");
}
Stack Trace
Jun 19, 2013 12:12:50 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [ProfileController] in context with path [] threw exception [Servlet execution threw an exception] with root cause
org.neo4j.kernel.StoreLockException: Could not create lock file
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:85)
at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:40)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:498)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:296)
at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:100)
at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:92)
at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:197)
at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:69)
at com.NtroduceMe.Utilities.GraphDBManager.<clinit>(GraphDBManager.java:22)
at com.NtroduceMe.UserProfile.Profiles.createProfile(Profiles.java:141)
at com.NtroduceMe.UserProfile.ProfileController.doPost(ProfileController.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Helper Class I use to Store the Database Instance
public class GraphDBManager {
public static final String DB_PATH = "/Users/NtroduceMe/Downloads/neo4j-community-2.0.0-M03/data/ntroduceme";
private static final GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
private static Index<Node> userNodeIndex;
private static Index<Node> rememberMeNodeIndex;
static {
registerShutdownHook(graphDB);
userNodeIndex = graphDB.index().forNodes("profile_id");
rememberMeNodeIndex = graphDB.index().forNodes("profile_id");
}
public static GraphDatabaseService getGraphDB(){
return graphDB;
}
public static Index<Node> getUserNodeIndex(){
return userNodeIndex;
}
public static Index<Node> getRemberMeNodeIndex(){
return rememberMeNodeIndex;
}
private static void registerShutdownHook(final GraphDatabaseService graphDb )
{
// Registers a shutdown hook for the Neo4j instance so that it
// shuts down nicely when the VM exits (even if you "Ctrl-C" the
// running application).
Runtime.getRuntime().addShutdownHook( new Thread()
{
@Override
public void run()
{
graphDb.shutdown();
}
} );
}
}
Upvotes: 6
Views: 3461
Reputation: 2621
In the Neo4j manual :
The EmbeddedGraphDatabase instance can be shared among multiple threads. Note however that you can’t create multiple instances pointing to the same database.
And I had this error simply because I ran Neo4j Server before deploying the application. As soon as I run the Neo4j server, an empty "lock" file is created and placed in the database directory.
So I suppose it is because an instance was already created, and I tried to create a new instance by my Java Application, which is impossible.
Upvotes: 1
Reputation: 11
I'm not sure whether you still search for a solution or not but while working on a project I stumbled upon the same problem. It happens if the database is not closed correctly after the program terminates or if you have registered a shutdownhook it occurs after the process is somehow forcibly terminated (by some..... very.... considerate... college for example) so the hook never gets called. That means you will have to release the lock during the next startup of the program. So here my code for doing this, hope it still helps someone somehow.
StoreLocker lock = new StoreLocker(new DefaultFileSystemAbstraction());
lock.checkLock(new File(DB_Location));
try {
lock.release();
graph = new GraphDatabaseFactory().newEmbeddedDatabase(DB_Location);
} catch (IOException e1) {
e1.printStackTrace();
}
Of course you should only call this if something during DB opening went wrong! And that should be clear but i'll say it either way just to be sure. The same error occurs if there are two or more instances of your program, using this way of releasing the lock in this case will trigger further problems!
Upvotes: 1
Reputation: 3054
I don't know what happened, but could you simply check if there's a "store_lock" file in your graphdb directory and if not, just create it (with "touch" command) or something? That should solve it.
Upvotes: 1
Reputation: 1053
I just wonder why you shutdown the DB before creating the nodes ?
You can't create nodes using a closed DB, so it can be like that:
graphDB = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
userNodeIndex = graphDB.index().forNodes("profile_id");
rememberMeNodeIndex = graphDB.index().forNodes("profile_id");
Transaction tx = graphDb.beginTx();
try
{
Node node = graphDb.createNode();
node.setProperty( USER_ID, "userID");
nodeIndex.add( node, USER_ID, "userID" );
}
and after you fininsh creating all nodes, you can call:
registerShutdownHook(graphDB);
Upvotes: 1
Reputation: 33185
You aren't properly shutting down your database when the program is ending, so it's leaving the lock file there.
You might consider setting up a shutdown hook as described here: http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-setup.html#tutorials-java-embedded-setup-startstop
Upvotes: 1