From ab54919956194010a451e25b9229e63d77ef51d8 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sun, 24 Jul 2022 13:09:52 -0500 Subject: [PATCH] Add more orderly storage shutdown --- .../src/main/java/org/dynmap/DynmapCore.java | 4 +- .../java/org/dynmap/storage/MapStorage.java | 13 +++++ .../storage/aws_s3/AWSS3MapStorage.java | 57 +++++++++++++------ .../dynmap/storage/mysql/MySQLMapStorage.java | 57 ++++++++++++++++++- .../postgresql/PostgreSQLMapStorage.java | 51 ++++++++++++++++- .../storage/sqllte/SQLiteMapStorage.java | 48 +++++++++++++++- 6 files changed, 210 insertions(+), 20 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java index fba99b8f..e15e1293 100644 --- a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java +++ b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java @@ -1113,7 +1113,9 @@ public class DynmapCore implements DynmapCommonAPI { mapManager.stopRendering(); mapManager = null; } - + if (defaultStorage != null) { + defaultStorage.shutdownStorage(); + } playerfacemgr = null; /* Clean up registered listeners */ listenerManager.cleanup(); diff --git a/DynmapCore/src/main/java/org/dynmap/storage/MapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/MapStorage.java index 21f7f310..fde504ed 100644 --- a/DynmapCore/src/main/java/org/dynmap/storage/MapStorage.java +++ b/DynmapCore/src/main/java/org/dynmap/storage/MapStorage.java @@ -26,13 +26,18 @@ public abstract class MapStorage { private static HashMap filelocks = new HashMap(); private static final Integer WRITELOCK = (-1); protected File baseStandaloneDir; + protected boolean isShutdown; protected long serverID; protected MapStorage() { this.serverID = 0; + this.isShutdown = false; } + public void shutdownStorage() { + this.isShutdown = true; + } // Proper modulo - versus the bogus Java behavior of negative modulo for negative numerators protected static final int modulo(int x, int y) { return ((x % y) + y) % y; @@ -475,6 +480,7 @@ public abstract class MapStorage { } public void logSQLException(String opmsg, SQLException x) { + if (isShutdown) return; Log.severe("SQLException: " + opmsg); Log.severe(" ErrorCode: " + x.getErrorCode() + ", SQLState=" + x.getSQLState()); Log.severe(" Message: " + x.getMessage()); @@ -485,4 +491,11 @@ public abstract class MapStorage { cause = cause.getCause(); } } + + public static class StorageShutdownException extends Exception { + private static final long serialVersionUID = 8961471920726795043L; + + public StorageShutdownException() {} + } + } diff --git a/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java index 6c8aeb2e..d3a9d6f0 100644 --- a/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java +++ b/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java @@ -66,8 +66,9 @@ public class AWSS3MapStorage extends MapStorage { @Override public boolean exists() { boolean exists = false; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(baseKey).maxKeys(1).build(); ListObjectsV2Response rslt = s3.listObjectsV2(req); if ((rslt != null) && (rslt.getKeyCount() > 0)) @@ -76,6 +77,8 @@ public class AWSS3MapStorage extends MapStorage { if (!x.getCode().equals("SignatureDoesNotMatch")) { // S3 behavior when no object match.... Log.severe("AWS Exception", x); } + } catch (StorageShutdownException x) { + } finally { releaseConnection(s3); } @@ -89,8 +92,9 @@ public class AWSS3MapStorage extends MapStorage { @Override public TileRead read() { - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); GetObjectRequest req = GetObjectRequest.builder().bucketName(bucketname).key(baseKey).build(); ResponseBytes obj = s3.getObjectAsBytes(req); if (obj != null) { @@ -114,6 +118,7 @@ public class AWSS3MapStorage extends MapStorage { return null; // Nominal case if it doesn't exist } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -123,8 +128,9 @@ public class AWSS3MapStorage extends MapStorage { @Override public boolean write(long hash, BufferOutputStream encImage, long timestamp) { boolean done = false; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); if (encImage == null) { // Delete? DeleteObjectRequest req = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build(); s3.deleteObject(req); @@ -137,6 +143,7 @@ public class AWSS3MapStorage extends MapStorage { done = true; } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -249,12 +256,13 @@ public class AWSS3MapStorage extends MapStorage { } // Now creste the access client for the S3 service Log.info("Using AWS S3 storage: web site at S3 bucket " + bucketname + " in region " + region); - S3Client s3 = getConnection(); - if (s3 == null) { - Log.severe("Error creating S3 access client"); - return false; - } + S3Client s3 = null; try { + s3 = getConnection(); + if (s3 == null) { + Log.severe("Error creating S3 access client"); + return false; + } // Make sure bucket exists (do list) ListObjectsV2Request listreq = ListObjectsV2Request.builder() .bucketName(bucketname) @@ -270,6 +278,8 @@ public class AWSS3MapStorage extends MapStorage { } catch (S3Exception s3x) { Log.severe("AWS Exception", s3x); return false; + } catch (StorageShutdownException x) { + return false; } finally { releaseConnection(s3); } @@ -334,8 +344,9 @@ public class AWSS3MapStorage extends MapStorage { String basekey = prefix + "tiles/" + world.getName() + "/" + map.getPrefix() + var.variantSuffix + "/"; ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(basekey).maxKeys(1000).build(); boolean done = false; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); while (!done) { ListObjectsV2Response result = s3.listObjectsV2(req); List objects = result.getContents(); @@ -395,6 +406,7 @@ public class AWSS3MapStorage extends MapStorage { Log.severe("AWS Exception", x); Log.severe("req=" + req); } + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -442,8 +454,9 @@ public class AWSS3MapStorage extends MapStorage { private void processPurgeMapTiles(DynmapWorld world, MapType map, ImageVariant var) { String basekey = prefix + "tiles/" + world.getName() + "/" + map.getPrefix() + var.variantSuffix + "/"; ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(basekey).delimiter("").maxKeys(1000).encodingType("url").requestPayer("requester").build(); - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); boolean done = false; while (!done) { ListObjectsV2Response result = s3.listObjectsV2(req); @@ -466,6 +479,7 @@ public class AWSS3MapStorage extends MapStorage { Log.severe("AWS Exception", x); Log.severe("req=" + req); } + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -494,8 +508,9 @@ public class AWSS3MapStorage extends MapStorage { BufferOutputStream encImage) { boolean done = false; String baseKey = prefix + "tiles/faces/" + facetype.id + "/" + playername + ".png"; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); if (encImage == null) { // Delete? DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build(); s3.deleteObject(delreq); @@ -507,6 +522,7 @@ public class AWSS3MapStorage extends MapStorage { done = true; } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -523,8 +539,9 @@ public class AWSS3MapStorage extends MapStorage { public boolean hasPlayerFaceImage(String playername, FaceType facetype) { String baseKey = prefix + "tiles/faces/" + facetype.id + "/" + playername + ".png"; boolean exists = false; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(baseKey).maxKeys(1).build(); ListObjectsV2Response rslt = s3.listObjectsV2(req); if ((rslt != null) && (rslt.getKeyCount() > 0)) @@ -533,6 +550,7 @@ public class AWSS3MapStorage extends MapStorage { if (!x.getCode().equals("SignatureDoesNotMatch")) { // S3 behavior when no object match.... Log.severe("AWS Exception", x); } + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -543,8 +561,9 @@ public class AWSS3MapStorage extends MapStorage { public boolean setMarkerImage(String markerid, BufferOutputStream encImage) { boolean done = false; String baseKey = prefix + "tiles/_markers_/" + markerid + ".png"; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); if (encImage == null) { // Delete? DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build(); s3.deleteObject(delreq); @@ -556,6 +575,7 @@ public class AWSS3MapStorage extends MapStorage { done = true; } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -571,8 +591,9 @@ public class AWSS3MapStorage extends MapStorage { public boolean setMarkerFile(String world, String content) { boolean done = false; String baseKey = prefix + "tiles/_markers_/marker_" + world + ".json"; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); if (content == null) { // Delete? DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build(); s3.deleteObject(delreq); @@ -584,6 +605,7 @@ public class AWSS3MapStorage extends MapStorage { done = true; } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } @@ -668,8 +690,9 @@ public class AWSS3MapStorage extends MapStorage { boolean done = false; String baseKey = prefix + fileid; - S3Client s3 = getConnection(); + S3Client s3 = null; try { + s3 = getConnection(); byte[] cacheval = standalone_cache.get(fileid); if (content == null) { // Delete? @@ -716,14 +739,16 @@ public class AWSS3MapStorage extends MapStorage { done = true; } catch (S3Exception x) { Log.severe("AWS Exception", x); + } catch (StorageShutdownException x) { } finally { releaseConnection(s3); } return done; } - private S3Client getConnection() throws S3Exception { + private S3Client getConnection() throws S3Exception, StorageShutdownException { S3Client c = null; + if (isShutdown) throw new StorageShutdownException(); synchronized (cpool) { while (c == null) { for (int i = 0; i < cpool.length; i++) { // See if available connection diff --git a/DynmapCore/src/main/java/org/dynmap/storage/mysql/MySQLMapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/mysql/MySQLMapStorage.java index fd980bf1..7e4a743e 100644 --- a/DynmapCore/src/main/java/org/dynmap/storage/mysql/MySQLMapStorage.java +++ b/DynmapCore/src/main/java/org/dynmap/storage/mysql/MySQLMapStorage.java @@ -85,6 +85,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -110,6 +112,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile matches hash error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -140,6 +144,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -196,6 +202,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -382,6 +390,8 @@ public class MySQLMapStorage extends MapStorage { stmt.close(); } catch (SQLException x) { err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (c != null) { releaseConnection(c, err); } } @@ -421,6 +431,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error loading map table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); c = null; @@ -460,6 +472,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error updating Maps table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -492,6 +506,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error creating tables", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -509,6 +526,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error updating tables to version=2", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -527,6 +547,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error updating tables to version=3", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -545,6 +568,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error updating tables to version=4", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -579,6 +605,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error updating tables to version=5", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -595,6 +624,9 @@ public class MySQLMapStorage extends MapStorage { logSQLException("Error updating tables to version=5", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -607,8 +639,9 @@ public class MySQLMapStorage extends MapStorage { return true; } - private Connection getConnection() throws SQLException { + private Connection getConnection() throws SQLException, StorageShutdownException { Connection c = null; + if (isShutdown) { throw new StorageShutdownException(); } synchronized (cpool) { while (c == null) { for (int i = 0; i < cpool.length; i++) { // See if available connection @@ -778,6 +811,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile enum error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -816,6 +851,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile purge error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -855,6 +892,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -882,6 +921,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face reqd error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -907,6 +948,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -954,6 +997,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -981,6 +1026,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -1027,6 +1074,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -1054,6 +1103,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -1110,6 +1161,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Standalone file read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -1160,6 +1213,8 @@ public class MySQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Standalone file write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } diff --git a/DynmapCore/src/main/java/org/dynmap/storage/postgresql/PostgreSQLMapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/postgresql/PostgreSQLMapStorage.java index 533bd1e9..bf8e107e 100644 --- a/DynmapCore/src/main/java/org/dynmap/storage/postgresql/PostgreSQLMapStorage.java +++ b/DynmapCore/src/main/java/org/dynmap/storage/postgresql/PostgreSQLMapStorage.java @@ -87,6 +87,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -112,6 +114,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile matches hash error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -141,6 +145,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -197,6 +203,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -366,6 +374,8 @@ public class PostgreSQLMapStorage extends MapStorage { stmt.close(); } catch (SQLException x) { err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (c != null) { releaseConnection(c, err); } } @@ -403,6 +413,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error loading map table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); c = null; @@ -442,6 +454,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error updating Maps table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -474,6 +488,9 @@ public class PostgreSQLMapStorage extends MapStorage { logSQLException("Error creating tables", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -491,6 +508,9 @@ public class PostgreSQLMapStorage extends MapStorage { logSQLException("Error upgrading tables to version=2", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -509,6 +529,9 @@ public class PostgreSQLMapStorage extends MapStorage { logSQLException("Error upgrading tables to version=3", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -525,6 +548,9 @@ public class PostgreSQLMapStorage extends MapStorage { logSQLException("Error upgrading tables to version=4", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -537,8 +563,9 @@ public class PostgreSQLMapStorage extends MapStorage { return true; } - private Connection getConnection() throws SQLException { + private Connection getConnection() throws SQLException, StorageShutdownException { Connection c = null; + if (isShutdown) throw new StorageShutdownException(); synchronized (cpool) { while (c == null) { for (int i = 0; i < cpool.length; i++) { // See if available connection @@ -690,6 +717,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile enum error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -744,6 +773,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile purge error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -783,6 +814,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -810,6 +843,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -835,6 +870,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -882,6 +919,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -909,6 +948,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -955,6 +996,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -982,6 +1025,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -1038,6 +1083,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Standalone file read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -1088,6 +1135,8 @@ public class PostgreSQLMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Standalone file write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } diff --git a/DynmapCore/src/main/java/org/dynmap/storage/sqllte/SQLiteMapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/sqllte/SQLiteMapStorage.java index 744881c8..b6c82f8b 100644 --- a/DynmapCore/src/main/java/org/dynmap/storage/sqllte/SQLiteMapStorage.java +++ b/DynmapCore/src/main/java/org/dynmap/storage/sqllte/SQLiteMapStorage.java @@ -70,6 +70,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -96,6 +98,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile matches hash error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -132,6 +136,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -191,6 +197,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -269,6 +277,7 @@ public class SQLiteMapStorage extends MapStorage { @Override public boolean init(DynmapCore core) { if (!super.init(core)) { + isShutdown = true; return false; } File dbfile = core.getFile(core.configuration.getString("storage/dbfile", "dynmap.db")); @@ -281,6 +290,7 @@ public class SQLiteMapStorage extends MapStorage { return initializeTables(); } catch (ClassNotFoundException cnfx) { Log.severe("SQLite-JDBC classes not found - sqlite data source not usable"); + isShutdown = true; return false; } } @@ -301,6 +311,8 @@ public class SQLiteMapStorage extends MapStorage { stmt.close(); } catch (SQLException x) { err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (c != null) { releaseConnection(c, err); } } @@ -339,6 +351,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error loading map table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); c = null; @@ -378,6 +392,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Error updating Maps table", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -410,6 +426,9 @@ public class SQLiteMapStorage extends MapStorage { logSQLException("Error creating tables", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -428,6 +447,9 @@ public class SQLiteMapStorage extends MapStorage { logSQLException("Error updating tables to version=2", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -445,6 +467,9 @@ public class SQLiteMapStorage extends MapStorage { logSQLException("Error updating tables to version=3", x); err = true; return false; + } catch (StorageShutdownException x) { + err = true; + return false; } finally { releaseConnection(c, err); c = null; @@ -457,8 +482,11 @@ public class SQLiteMapStorage extends MapStorage { return true; } - private Connection getConnection() throws SQLException { + private Connection getConnection() throws SQLException, StorageShutdownException { Connection c = null; + if (isShutdown) { + throw new StorageShutdownException(); + } synchronized (cpool) { while (c == null) { for (int i = 0; i < cpool.length; i++) { // See if available connection @@ -633,6 +661,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile enum error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -670,6 +700,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Tile purge error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -712,6 +744,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -746,6 +780,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -772,6 +808,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Face exists error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -823,6 +861,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -857,6 +897,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); } @@ -904,6 +946,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file write error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { if (rs != null) { try { rs.close(); } catch (SQLException sx) {} } if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} } @@ -932,6 +976,8 @@ public class SQLiteMapStorage extends MapStorage { } catch (SQLException x) { logSQLException("Marker file read error", x); err = true; + } catch (StorageShutdownException x) { + err = true; } finally { releaseConnection(c, err); }