diff --git a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/EnableException.java b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/EnableException.java index 13ae83fd6..879bdc81d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/EnableException.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/EnableException.java @@ -21,7 +21,7 @@ package com.djrapitops.plan.exceptions; * * @author Rsl1122 */ -public class EnableException extends Exception { +public class EnableException extends IllegalStateException { public EnableException(String message, Throwable cause) { super(message, cause); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/FatalDBException.java b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/FatalDBException.java index 01c7214ac..650426a10 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/FatalDBException.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/FatalDBException.java @@ -16,9 +16,15 @@ */ package com.djrapitops.plan.exceptions.database; +import com.djrapitops.plan.utilities.logging.ErrorContext; + public class FatalDBException extends DBOpException { public FatalDBException(String message) { super(message); } + + public FatalDBException(String message, DBOpException cause) { + super(message + cause.getMessage(), cause.getCause(), cause.getContext().orElse(ErrorContext.builder().build())); + } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/DBAccessLock.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/DBAccessLock.java index f00f6eda8..805f896b0 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/DBAccessLock.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/DBAccessLock.java @@ -16,7 +16,7 @@ */ package com.djrapitops.plan.storage.database; -import com.djrapitops.plan.exceptions.database.DBOpException; +import com.djrapitops.plan.exceptions.EnableException; import com.djrapitops.plan.storage.database.transactions.Transaction; import com.djrapitops.plan.storage.database.transactions.init.OperationCriticalTransaction; @@ -58,7 +58,7 @@ public class DBAccessLock { synchronized (lockObject) { lockObject.wait(); if (database.getState() == Database.State.CLOSED) { - throw new DBOpException("Database failed to open, Query has failed. (This exception is necessary to not keep query threads waiting)"); + throw new EnableException("Database failed to open, Query has failed. (This exception is necessary to not keep query threads waiting)"); } } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java index 1f2ad3f2c..715b03d5a 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java @@ -42,10 +42,7 @@ import org.apache.commons.lang3.concurrent.BasicThreadFactory; import java.sql.Connection; import java.sql.SQLException; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.util.*; import java.util.concurrent.*; import java.util.function.BiFunction; import java.util.function.Supplier; @@ -259,13 +256,20 @@ public abstract class SQLDB extends AbstractDatabase { if (throwable == null) { return CompletableFuture.completedFuture(null); } - if (throwable instanceof FatalDBException) { + if (throwable.getCause() instanceof FatalDBException) { + logger.error("Database failed to open, " + transaction.getClass().getName() + " failed to be executed."); + FatalDBException actual = (FatalDBException) throwable.getCause(); + Optional whatToDo = actual.getContext().flatMap(ErrorContext::getWhatToDo); + whatToDo.ifPresent(message -> logger.error("What to do: " + message)); + if (!whatToDo.isPresent()) logger.error("Error msg: " + actual.getMessage()); setState(State.CLOSED); } ThrowableUtils.appendEntryPointToCause(throwable, origin); - errorLogger.log(L.ERROR, throwable, ErrorContext.builder() - .related("Transaction: " + transaction.getClass()).build()); + errorLogger.log(getState() == State.CLOSED ? L.CRITICAL : L.ERROR, throwable, ErrorContext.builder() + .related("Transaction: " + transaction.getClass()) + .related("DB State: " + getState()) + .build()); return CompletableFuture.completedFuture(null); }; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/init/OperationCriticalTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/init/OperationCriticalTransaction.java index 0b7732587..a2324aef0 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/init/OperationCriticalTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/transactions/init/OperationCriticalTransaction.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.storage.database.transactions.init; +import com.djrapitops.plan.exceptions.database.DBOpException; import com.djrapitops.plan.exceptions.database.FatalDBException; import com.djrapitops.plan.storage.database.SQLDB; import com.djrapitops.plan.storage.database.transactions.Transaction; @@ -31,9 +32,13 @@ public abstract class OperationCriticalTransaction extends Transaction { @Override public void executeTransaction(SQLDB db) { - super.executeTransaction(db); - if (!success) { - throw new FatalDBException(getClass().getSimpleName() + " failed to execute and database can not be opened."); + try { + super.executeTransaction(db); + if (!success) { + throw new FatalDBException(getClass().getName() + " failed to execute and database could not be opened."); + } + } catch (DBOpException e) { + throw new FatalDBException(getClass().getName() + " failed to execute and database could not be opened: ", e); } } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorContext.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorContext.java index 3652179fa..f47992546 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorContext.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorContext.java @@ -51,6 +51,7 @@ public class ErrorContext { public void merge(ErrorContext context) { this.related.addAll(context.related); + if (this.whatToDo == null && context.whatToDo != null) this.whatToDo = context.whatToDo; } public static class Builder {