From 127c1275a2db9d6b828bc56bb2496477f59c473b Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Fri, 25 Sep 2020 17:28:55 +0300 Subject: [PATCH] #9705 Lock data read during row refresh Former-commit-id: 68c8898b50d6320ff3706bb093a062a5d205abbe --- .../resultset/ResultSetPersister.java | 4 +++ .../controls/resultset/ResultSetViewer.java | 36 ++++++++++++------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java index 6784bf73a8..2c06bfef6f 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java @@ -1022,6 +1022,9 @@ class ResultSetPersister { @Override protected IStatus run(DBRProgressMonitor monitor) { + if (!viewer.acquireDataReadLock()) { + return Status.CANCEL_STATUS; + } monitor.beginTask("Refresh updated rows", 1); try { final Object[][] refreshValues = new Object[rows.size()][]; @@ -1090,6 +1093,7 @@ class ResultSetPersister { } } finally { monitor.done(); + viewer.releaseDataReadLock(); } return Status.OK_STATUS; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 868f417e9e..88d3530186 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -3695,6 +3695,26 @@ public class ResultSetViewer extends Viewer } } + void releaseDataReadLock() { + synchronized (dataPumpJobQueue) { + if (!dataPumpRunning.get()) { + log.debug("Internal error: data read status is empty"); + } + dataPumpRunning.set(false); + } + } + + boolean acquireDataReadLock() { + synchronized (dataPumpJobQueue) { + if (dataPumpRunning.get()) { + log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")"); + return false; + } + dataPumpRunning.set(true); + } + return true; + } + public void clearData() { this.model.releaseAllData(); @@ -4413,12 +4433,8 @@ public class ResultSetViewer extends Viewer @Override protected IStatus run(DBRProgressMonitor monitor) { - synchronized (dataPumpJobQueue) { - if (dataPumpRunning.get()) { - log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")"); - return Status.CANCEL_STATUS; - } - dataPumpRunning.set(true); + if (!acquireDataReadLock()) { + return Status.CANCEL_STATUS; } beforeDataRead(); try { @@ -4426,12 +4442,7 @@ public class ResultSetViewer extends Viewer afterDataRead(); return status; } finally { - synchronized (dataPumpJobQueue) { - if (!dataPumpRunning.get()) { - log.debug("Internal error: data read status is empty"); - } - dataPumpRunning.set(false); - } + releaseDataReadLock(); } } @@ -4559,4 +4570,5 @@ public class ResultSetViewer extends Viewer }); } } + } -- GitLab