You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by Сорокин Андрей Викторович <An...@R-Style.com> on 2013/07/30 11:13:23 UTC

JackRabbit 2.6.2 concurrent session access issue

Hi all, we are in the process of evaluation Jack Rabbit for our project. The problem is that during multithreading test, that emulate concurrent access to JackRabbit, it periodically throws the next exception:

DEBUG Thread-9 org.apache.jackrabbit.core.session.SessionState - Attempt to perform item.getPath() while another thread is concurrently reading from session-system-2. Blocking until the other thread is finished using this session. Please review your code to avoid concurrent use of a session. java.lang.Exception: Stack trace of concurrent access to session-system-2

For your convenience i provide the source of the test case below.

Any comments are welcomed!

Best Regards

Andrey

-- The source code

import static java.lang.System.out;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.jcr.LoginException;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;

import org.apache.jackrabbit.core.TransientRepository;

public class MultiLoadTest implements Runnable {

                static private TransientRepository repository = new TransientRepository();
                private static final int NTHREDS = 100;

                public static void main(String[] args) {
                               for (int i = 0; i < NTHREDS; i++) {
                                               new Thread(new MultiLoadTest()).start();
                               }
                }

                public void run() {
                               Random generator = new Random();
                               Session session = null;
                               String thread = Thread.currentThread().getName();

                               while (true) {
                                               try {
                                                               // generate shape number
                                                               int shape = generator.nextInt(6);

                                                               DateFormat dateFormat = new SimpleDateFormat(
                                                                                              "yyyy/MM/dd HH:mm:ss");
                                                               Date date = new Date();

                                                               out.println(dateFormat.format(date) + " the shape number "
                                                                                              + shape + "  is processing " + thread);

                                                               session = new Util().login(repository);
                                                               // produce shapes and store in the repository
                                                               Shapes.produce(session.getRootNode(), shape, thread);
                                                               // make changes persistent
                                                               session.save();
                                                               // session logout
                                                               new Util().logout(session);

                                                               // make new session
                                                               session = new Util().login(repository);
                                                               // consume shapes
                                                               Shapes.consume(session.getRootNode(), shape, thread);
                                                               // session logout
                                                               new Util().logout(session);

                                                               // session login
                                                               session = new Util().login(repository);
                                                               // delete shapes
                                                               Shapes.delete(session.getRootNode(), shape, thread);
                                                               // make changes persistent
                                                               session.save();
                                                               new Util().logout(session);
                                               } catch (Exception e) {
                                                               e.printStackTrace();
                                               } finally {
                                                               if (session != null && session.isLive()) {
                                                                              new Util().logout(session);
                                                               }
                                               }

                               }

                }

                public static class Shapes {

                               public static synchronized void produce(Node root, int shape,
                                                               String thread) throws Exception {

                                               if (shape == 1) {
                                                               Node shape1 = root.addNode("shape1" + thread);
                                                               Node a = shape1.addNode("a" + thread);

                                                               Node c = a.addNode("c" + thread);
                                                               c.addNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.addNode("b" + thread);
                                                               b.addNode("f" + thread);
                                                               b.addNode("g" + thread);
                                               }

                                               if (shape > 1) {
                                                               Node shape2 = root.addNode("shape2" + thread);
                                                               Node a = shape2.addNode("a" + thread);

                                                               Node c = a.addNode("c" + thread);
                                                               c.addNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.addNode("b" + thread);
                                                               b.addNode("f" + thread);
                                                               b.addNode("g" + thread);

                                               }
                                               if (shape > 2) {
                                                               Node shape3 = root.addNode("shape3" + thread);
                                                               Node a = shape3.addNode("a" + thread);

                                                               Node c = a.addNode("c" + thread);
                                                               c.addNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.addNode("b" + thread);
                                                               b.addNode("f" + thread);
                                                               b.addNode("g" + thread);

                                               }
                                               if (shape > 3) {
                                                               Node shape4 = root.addNode("shape4" + thread);
                                                               Node a = shape4.addNode("a" + thread);

                                                               Node c = a.addNode("c" + thread);
                                                               c.addNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.addNode("b" + thread);
                                                               b.addNode("f" + thread);
                                                               b.addNode("g" + thread);

                                               }

                                               if (shape > 4) {
                                                               Node shape5 = root.addNode("shape5" + thread);
                                                               Node a = shape5.addNode("a" + thread);

                                                               Node c = a.addNode("c" + thread);
                                                               c.addNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.addNode("b" + thread);
                                                               b.addNode("f" + thread);
                                                               b.addNode("g" + thread);

                                               }

                               }

                               public static synchronized void consume(Node root, int shape,
                                                               String thread) throws Exception {
                                               if (shape == 1) {
                                                               Node shape1 = root.getNode("shape1" + thread);
                                                               Node a = shape1.getNode("a" + thread);

                                                               Node c = a.getNode("c" + thread);
                                                               c.getNode("d" + thread);
                                                               c.getNode("e" + thread);

                                                               Node b = a.getNode("b" + thread);
                                                               b.getNode("f" + thread);
                                                               b.getNode("g" + thread);
                                               }

                                               if (shape > 1) {
                                                               Node shape2 = root.getNode("shape2" + thread);
                                                               Node a = shape2.getNode("a" + thread);

                                                               Node c = a.getNode("c" + thread);
                                                               c.getNode("d" + thread);
                                                               c.getNode("e" + thread);

                                                               Node b = a.getNode("b" + thread);
                                                               b.getNode("f" + thread);
                                                               b.getNode("g" + thread);

                                               }
                                               if (shape > 2) {
                                                               Node shape3 = root.getNode("shape3" + thread);
                                                               Node a = shape3.getNode("a" + thread);

                                                               Node c = a.getNode("c" + thread);
                                                               c.getNode("d" + thread);
                                                               c.addNode("e" + thread);

                                                               Node b = a.getNode("b" + thread);
                                                               b.getNode("f" + thread);
                                                               b.getNode("g" + thread);

                                               }
                                               if (shape > 3) {
                                                               Node shape4 = root.getNode("shape4" + thread);
                                                               Node a = shape4.getNode("a" + thread);

                                                               Node c = a.getNode("c" + thread);
                                                               c.getNode("d" + thread);
                                                               c.getNode("e" + thread);

                                                               Node b = a.getNode("b" + thread);
                                                               b.getNode("f" + thread);
                                                               b.getNode("g" + thread);

                                               }

                                               if (shape > 4) {
                                                               Node shape5 = root.getNode("shape5" + thread);
                                                               Node a = shape5.getNode("a" + thread);

                                                               Node c = a.getNode("c" + thread);
                                                               c.getNode("d" + thread);
                                                               c.getNode("e" + thread);

                                                               Node b = a.getNode("b" + thread);
                                                               b.getNode("f" + thread);
                                                               b.getNode("g" + thread);

                                               }
                               }

                               public static synchronized void delete(Node root, int shape,
                                                               String thread) throws Exception {

                                               if (shape == 1) {
                                                               root.getNode("shape1" + thread).remove();
                                               }

                                               if (shape > 1) {
                                                               root.getNode("shape2" + thread).remove();
                                               }
                                               if (shape > 2) {
                                                               root.getNode("shape3" + thread).remove();
                                               }
                                               if (shape > 3) {
                                                               root.getNode("shape4" + thread).remove();
                                               }

                                               if (shape > 4) {
                                                               root.getNode("shape5" + thread).remove();
                                               }

                               }
                }

                public class Util {

                               public Session login(Repository repository) {
                                               Session session = null;
                                               try {
                                                               session = repository.login(new SimpleCredentials("admin",
                                                                                              "admin".toCharArray()));
                                               } catch (LoginException e) {
                                                               e.printStackTrace();
                                               } catch (RepositoryException e) {
                                                               e.printStackTrace();
                                               }
                                               return session;

                               }

                               public void logout(Session session) {
                                               session.logout();
                               }

                }

}