From 52b0c244a8597fae8d2ac67099b82a20a563c1c0 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Mon, 28 Jun 2021 19:24:53 +0100 Subject: [PATCH] Extend CHECKPOINT_LOCK to HSQLDBSaver.execute() This is used when saving new data to the db, so also needs to be blocked if we are checkpointing or deciding whether to checkpoint. --- .../qortal/repository/hsqldb/HSQLDBRepository.java | 2 +- .../org/qortal/repository/hsqldb/HSQLDBSaver.java | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java index 4e9349c1..4d8e5043 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java @@ -55,7 +55,7 @@ public class HSQLDBRepository implements Repository { private static final Logger LOGGER = LogManager.getLogger(HSQLDBRepository.class); - private static final Object CHECKPOINT_LOCK = new Object(); + public static final Object CHECKPOINT_LOCK = new Object(); // "serialization failure" private static final Integer DEADLOCK_ERROR_CODE = Integer.valueOf(-4861); diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java index c1b6ee9b..acf24c54 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java @@ -61,13 +61,15 @@ public class HSQLDBSaver { public boolean execute(HSQLDBRepository repository) throws SQLException { String sql = this.formatInsertWithPlaceholders(); - try { - PreparedStatement preparedStatement = repository.prepareStatement(sql); - this.bindValues(preparedStatement); + synchronized (HSQLDBRepository.CHECKPOINT_LOCK) { + try { + PreparedStatement preparedStatement = repository.prepareStatement(sql); + this.bindValues(preparedStatement); - return preparedStatement.execute(); - } catch (SQLException e) { - throw repository.examineException(e); + return preparedStatement.execute(); + } catch (SQLException e) { + throw repository.examineException(e); + } } }