X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.procore%2Fsrc%2Ffi%2Fvtt%2Fsimantics%2Fprocore%2Finternal%2FSessionRequestManager.java;h=2902274b94202c9c79610f006f5acbf91365338b;hp=0ec6387ae941b0e9cb9c6358282c3b3849ff9d0d;hb=9f0fd59be54719b1fe9322d8fd37e4950857308c;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07 diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionRequestManager.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionRequestManager.java index 0ec6387ae..2902274b9 100644 --- a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionRequestManager.java +++ b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionRequestManager.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.util.Collection; import java.util.LinkedList; +import org.simantics.db.Disposable; import org.simantics.db.Resource; -import org.simantics.db.common.utils.Logger; import org.simantics.db.exception.CancelTransactionException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.impl.graph.WriteGraphImpl; @@ -15,9 +15,13 @@ import org.simantics.db.impl.query.QueryProcessor.SessionRead; import org.simantics.db.impl.query.QueryProcessor.SessionTask; import org.simantics.db.request.WriteTraits; import org.simantics.utils.datastructures.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SessionRequestManager { + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRequestManager.class); + private static boolean DEBUG = false; enum State { @@ -114,7 +118,7 @@ public class SessionRequestManager { public synchronized void startRead(int thread, final SessionRead task) { - session.queryProvider2.scheduleAlways(thread, new SessionTask(task.object, task.thread, task.syncCaller) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -122,7 +126,7 @@ public class SessionRequestManager { transactionState.startReadTransaction(thread); task.run(thread); } catch (Throwable t) { - Logger.defaultLogError(new DatabaseException("Read transaction could not be started", t)); + LOGGER.error("Read transaction could not be started", t); if(task.throwable != null) task.throwable.set(t); state = State.ERROR; @@ -138,7 +142,7 @@ public class SessionRequestManager { public synchronized void startReadUpdate(int thread) { - session.queryProvider2.scheduleAlways(thread, new SessionTask(null, thread) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -148,7 +152,7 @@ public class SessionRequestManager { try { transactionState.stopReadTransaction(); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("Read transaction could not be stopped", e); } } @@ -157,19 +161,9 @@ public class SessionRequestManager { } -// public synchronized void stopRead(int thread) { -// -// try { -// transactionState.stopReadTransaction(); -// } catch (DatabaseException e) { -// e.printStackTrace(); -// } -// -// } - public synchronized void startWrite(int thread, final SessionTask task) { - session.queryProvider2.scheduleAlways(thread, new SessionTask((WriteTraits)task.object, task.thread) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -177,8 +171,7 @@ public class SessionRequestManager { try { transactionState.startWriteTransaction(thread); } catch (Throwable t) { - DatabaseException e = new DatabaseException("Write transaction could not be started", t); - Logger.defaultLogError(e); + LOGGER.error("Write transaction could not be started", t); return; } task.run(thread); @@ -191,7 +184,7 @@ public class SessionRequestManager { public synchronized void startWriteUpdate(int thread) { - session.queryProvider2.scheduleAlways(thread, new SessionTask(null, thread) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -213,6 +206,7 @@ public class SessionRequestManager { } else { throw new UnsupportedOperationException("delayedWriteState may only exist when request fails."); } + Disposable.safeDispose(session.clientChanges); session.clientChanges = new ClientChangesImpl(session); delayedState.finish(); return; @@ -222,13 +216,16 @@ public class SessionRequestManager { if(!session.state.isAlive()) return; WriteState writeState = session.writeState; + + assert(writeState != null); + WriteGraphImpl graph = writeState.getGraph(); if(writeState.isExcepted()) { - + if(!(writeState.exception instanceof CancelTransactionException)) - writeState.exception.printStackTrace(); - + LOGGER.error("Write request failed", writeState.exception); + transactionState.cancelWriteTransaction(graph); } else { @@ -242,6 +239,7 @@ public class SessionRequestManager { } + Disposable.safeDispose(session.clientChanges); session.clientChanges = new ClientChangesImpl(session); WriteState state = session.writeState; @@ -254,20 +252,6 @@ public class SessionRequestManager { } -// public synchronized void stopWrite(int thread) { -// -// session.clientChanges = new ClientChangesImpl(session); -// -// WriteState state = session.writeState; -// -// System.err.println("D"); -// state.finish(); -// System.err.println("E"); -// -// session.writeState = null; -// -// } - public synchronized void ceased(int thread) { if(State.WRITE == state) { @@ -287,7 +271,7 @@ public class SessionRequestManager { if (!reads.isEmpty()) { final SessionRead read = reads.poll(); - session.queryProvider2.scheduleAlways(thread, new SessionTask(read.object, read.thread, read.syncCaller) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -315,7 +299,9 @@ public class SessionRequestManager { } else { - throw new IllegalStateException("State in ceased should be WRITE or READ or INIT (was " + state + ")"); + // Spurious wakeup + + //throw new IllegalStateException("State in ceased should be WRITE or READ or INIT (was " + state + ")"); } @@ -326,7 +312,7 @@ public class SessionRequestManager { assert(State.INIT != state); if(State.READ == state) { - session.queryProvider2.schedule(Integer.MIN_VALUE, new SessionTask(task.object, task.thread, task.syncCaller) { + session.queryProvider2.schedule(new SessionTask(true) { @Override public void run(int thread) { @@ -368,6 +354,8 @@ public class SessionRequestManager { boolean inUpdate = state == State.WRITE_UPDATE; + //System.err.println("schedule write " + task); + assert(State.INIT != state); //task.combine = combine != null ? combine : inUpdate; if(State.IDLE == state) { @@ -398,7 +386,7 @@ public class SessionRequestManager { try { value.second.binaryFile.close(); } catch (IOException e) { - Logger.defaultLogError("I/O exception while closing random access value file " + value.second.binaryFile.file() + " for resource " + value.first , e); + LOGGER.error("I/O exception while closing random access value file " + value.second.binaryFile.file() + " for resource " + value.first , e); } } }