We met a big problem recently. Sometimes when user commit a heavy write operation(about create/remove 30000 relationship),the neo4j instance hang and could not accept request anymore, can't even login from the command line.We have to restart the instance.
After monitoring the linux system,we found out the tcp connnections increased dramatically from 150 to 500. We dumped the stack of neo4j process and found out about 200 threads in BLOCKED status(stack_397682.txt (742.6 KB)).
So our question are:
1.Seems write operation will lead in a write lock and block other read operations?After checking chapter "Transaction management", I think read operation will not be affected by the write operation so long as not adding a read lock explicitly(we use transaction provided by Spring Data Neo4j and didn't add any lock explicitly)
2.From the stack log, we can see some operations acquired read lock("getRWLockForAcquiring"), so how could I find out these operations which involve read lock in?
3.From the stack log, we can see a thread held the lock by (locked <0x0000000580bc4a80>) "CommunityLockClient.terminateAllWaiters" and so many other threads were waiting the lock for "CommunityLockClient.terminateAllWaiters" too,so why "terminateAllWaiters" held the lock so long and didn't release it?