From 6a9904fd4343281e216f4c02a38d927c95363fac Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 10 Dec 2021 17:54:11 +0000 Subject: [PATCH 1/7] Bump log4j-api version to 2.15.0 The main log4j version cannot be increased yet due to some incompatibilities with the Qortal code. --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e430218..ed2ff6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 2.29.1 9.4.29.v20200521 2.12.1 + 2.15.0 UTF-8 1.7.12 2.0.9 @@ -518,7 +519,7 @@ org.apache.logging.log4j log4j-api - ${log4j.version} + ${log4j-api.version} From a215714b6be21d9ee4c4bf72f9cb0330892a429a Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 11 Dec 2021 19:09:25 +0000 Subject: [PATCH 2/7] Set log4j2.formatMsgNoLookups to true --- src/main/java/org/qortal/controller/Controller.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index f2d91804..805e86c5 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -103,6 +103,7 @@ public class Controller extends Thread { static { // This must go before any calls to LogManager/Logger + System.setProperty("log4j2.formatMsgNoLookups", "true"); System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); } From 33088df07d748a4b60d929c1900328e265cedfa1 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 11 Dec 2021 19:40:44 +0000 Subject: [PATCH 3/7] Revert "Bump log4j-api version to 2.15.0" This reverts commit 6a9904fd4343281e216f4c02a38d927c95363fac. --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ed2ff6b8..6e430218 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,6 @@ 2.29.1 9.4.29.v20200521 2.12.1 - 2.15.0 UTF-8 1.7.12 2.0.9 @@ -519,7 +518,7 @@ org.apache.logging.log4j log4j-api - ${log4j-api.version} + ${log4j.version} From 3b96747871c3a27306a0c4fb0bffa2d52af67e39 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 11 Dec 2021 21:50:54 +0000 Subject: [PATCH 4/7] Bump version to 2.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e430218..e6121688 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 2.1.1 + 2.1.2 jar true From e7fd803d190b20927a6bb88d63c5eecc565edfd3 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 11 Dec 2021 22:16:43 +0000 Subject: [PATCH 5/7] Updated AdvancedInstaller project for v2.1.2 --- WindowsInstaller/Qortal.aip | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WindowsInstaller/Qortal.aip b/WindowsInstaller/Qortal.aip index 1f869dcd..d9b958e1 100755 --- a/WindowsInstaller/Qortal.aip +++ b/WindowsInstaller/Qortal.aip @@ -17,10 +17,10 @@ - + - + @@ -212,7 +212,7 @@ - + From 3a7da9f13bfd0279474806c0f2e2ab46dc13c1a6 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 15 Dec 2021 16:33:08 +0000 Subject: [PATCH 6/7] Don't return online accounts signatures from GET /blocks/byheight/{height} unless requested using the includesignatures=true query string parameter. This should fix issue where it would take up to 30 seconds to return for a recent block, and would consume masses of CPU due to having to base58 encode the online accounts signatures. Base58 is very slow and made this API endpoint almost unusable for recent blocks, due to them having untrimmed online accounts signatures. --- .../java/org/qortal/api/resource/BlocksResource.java | 9 ++++++++- src/main/java/org/qortal/data/block/BlockData.java | 4 ++++ src/test/java/org/qortal/test/api/BlockApiTests.java | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/BlocksResource.java b/src/main/java/org/qortal/api/resource/BlocksResource.java index b8163c7d..1ba5ab3c 100644 --- a/src/main/java/org/qortal/api/resource/BlocksResource.java +++ b/src/main/java/org/qortal/api/resource/BlocksResource.java @@ -423,17 +423,24 @@ public class BlocksResource { @ApiErrors({ ApiError.BLOCK_UNKNOWN, ApiError.REPOSITORY_ISSUE }) - public BlockData getByHeight(@PathParam("height") int height) { + public BlockData getByHeight(@PathParam("height") int height, + @QueryParam("includesignatures") Boolean includeSignatures) { try (final Repository repository = RepositoryManager.getRepository()) { // Firstly check the database BlockData blockData = repository.getBlockRepository().fromHeight(height); if (blockData != null) { + if (includeSignatures == null || includeSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } // Not found, so try the archive blockData = repository.getBlockArchiveRepository().fromHeight(height); if (blockData != null) { + if (includeSignatures == null || includeSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } diff --git a/src/main/java/org/qortal/data/block/BlockData.java b/src/main/java/org/qortal/data/block/BlockData.java index 3567d0f8..481d3691 100644 --- a/src/main/java/org/qortal/data/block/BlockData.java +++ b/src/main/java/org/qortal/data/block/BlockData.java @@ -204,6 +204,10 @@ public class BlockData implements Serializable { return this.onlineAccountsSignatures; } + public void setOnlineAccountsSignatures(byte[] onlineAccountsSignatures) { + this.onlineAccountsSignatures = onlineAccountsSignatures; + } + // JAXB special @XmlElement(name = "minterAddress") diff --git a/src/test/java/org/qortal/test/api/BlockApiTests.java b/src/test/java/org/qortal/test/api/BlockApiTests.java index 5b8721af..79d87a1d 100644 --- a/src/test/java/org/qortal/test/api/BlockApiTests.java +++ b/src/test/java/org/qortal/test/api/BlockApiTests.java @@ -72,7 +72,7 @@ public class BlockApiTests extends ApiCommon { @Test public void testGetBlockByHeight() { - assertNotNull(this.blocksResource.getByHeight(1)); + assertNotNull(this.blocksResource.getByHeight(1, true)); } @Test From 391c3fe4c9da8cc28e2dd97fbfd78119bf416c04 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 15 Dec 2021 16:37:59 +0000 Subject: [PATCH 7/7] Added same functionality to GET /blocks/signature/{signature} Also renamed query string parameter to "includeOnlineSignatures" to make it clearer. --- .../org/qortal/api/resource/BlocksResource.java | 15 +++++++++++---- .../java/org/qortal/test/api/BlockApiTests.java | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/BlocksResource.java b/src/main/java/org/qortal/api/resource/BlocksResource.java index 1ba5ab3c..bcd531d4 100644 --- a/src/main/java/org/qortal/api/resource/BlocksResource.java +++ b/src/main/java/org/qortal/api/resource/BlocksResource.java @@ -75,7 +75,8 @@ public class BlocksResource { @ApiErrors({ ApiError.INVALID_SIGNATURE, ApiError.BLOCK_UNKNOWN, ApiError.REPOSITORY_ISSUE }) - public BlockData getBlock(@PathParam("signature") String signature58) { + public BlockData getBlock(@PathParam("signature") String signature58, + @QueryParam("includeOnlineSignatures") Boolean includeOnlineSignatures) { // Decode signature byte[] signature; try { @@ -88,12 +89,18 @@ public class BlocksResource { // Check the database first BlockData blockData = repository.getBlockRepository().fromSignature(signature); if (blockData != null) { + if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } // Not found, so try the block archive blockData = repository.getBlockArchiveRepository().fromSignature(signature); if (blockData != null) { + if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + blockData.setOnlineAccountsSignatures(null); + } return blockData; } @@ -424,12 +431,12 @@ public class BlocksResource { ApiError.BLOCK_UNKNOWN, ApiError.REPOSITORY_ISSUE }) public BlockData getByHeight(@PathParam("height") int height, - @QueryParam("includesignatures") Boolean includeSignatures) { + @QueryParam("includeOnlineSignatures") Boolean includeOnlineSignatures) { try (final Repository repository = RepositoryManager.getRepository()) { // Firstly check the database BlockData blockData = repository.getBlockRepository().fromHeight(height); if (blockData != null) { - if (includeSignatures == null || includeSignatures == false) { + if (includeOnlineSignatures == null || includeOnlineSignatures == false) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -438,7 +445,7 @@ public class BlocksResource { // Not found, so try the archive blockData = repository.getBlockArchiveRepository().fromHeight(height); if (blockData != null) { - if (includeSignatures == null || includeSignatures == false) { + if (includeOnlineSignatures == null || includeOnlineSignatures == false) { blockData.setOnlineAccountsSignatures(null); } return blockData; diff --git a/src/test/java/org/qortal/test/api/BlockApiTests.java b/src/test/java/org/qortal/test/api/BlockApiTests.java index 79d87a1d..6415880a 100644 --- a/src/test/java/org/qortal/test/api/BlockApiTests.java +++ b/src/test/java/org/qortal/test/api/BlockApiTests.java @@ -40,7 +40,7 @@ public class BlockApiTests extends ApiCommon { byte[] signatureBytes = GenesisBlock.getInstance(repository).getSignature(); String signature = Base58.encode(signatureBytes); - assertNotNull(this.blocksResource.getBlock(signature)); + assertNotNull(this.blocksResource.getBlock(signature, true)); } }