import java.util.concurrent.locks.ReentrantLock;
import org.simantics.db.ChangeSet;
+import org.simantics.db.Disposable;
import org.simantics.db.Operation;
import org.simantics.db.VirtualGraph;
import org.simantics.db.common.utils.Logger;
try {
final boolean undo = false;
if (!context.isOk(undo)) // this is a blocking operation
- throw new InternalException("Cancel failed. This should never happen. Contact application support.");
+ throw new InternalException("Cancel failed. This should never happen.");
// System.out.println("session cs: " + session.clientChanges);
// System.out.println("reverse cs: " + cs);
queryProvider.performDirtyUpdates(graph);
}
// This will send and accept the reverse change set.
transactionToken.cancelEnd(session.writeSupport, null, session.clusterStream);
+ } else {
+ queryProvider.performDirtyUpdates(graph);
+ queryProvider.performScheduledUpdates(graph);
}
}
session.writeSupport.clearMetadata();
if (vg != null && clusterStream.isDirty())
new Exception("Internal error: virtual transaction committed changes into core (" + request + ")").printStackTrace();
-// long start = System.nanoTime();
- if (null == vg) {
- clusterStream.reallyFlush();
- // This was fired just before in handleUpdatesAndMetadata
-// if (!writeOnly)
-// session.fireMetadataListeners(graph, cs);
- } else
- clusterStream.clear();
-
-// long duration = System.nanoTime() - start;
-// System.out.println("reallyFlush " + 1e-9*duration + "s. ");
+ // This is needed even when the write targets a virtual graph -
+ // deny can always remove a persistent statement.
+ clusterStream.reallyFlush();
session.clientChanges = new ClientChangesImpl(session);
this.close(); // Everything is lost anyway.
throw new IllegalStateException(e);
} finally {
+ Disposable.safeDispose(cs);
lock.unlock();
}
}