From 86596f4194e868efeeedc619fe2c93072996d969 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 2 Oct 2015 17:17:30 +0200 Subject: [PATCH 1/3] Remove use of com.google.common.hash.Hashing This commit removes all uses of com.google.common.hash.Hashing across the codebase. This is one of the few remaining steps in the eventual removal of Guava as a dependency. Relates elastic/elasticsearchelastic/elasticsearch#13224 Original commit: elastic/x-pack-elasticsearch@5b90c9a496c0b711f2ab54cf38abd2abe5ec92b8 --- .../renderer/cluster/ClusterInfoRenderer.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java index 33b842a8040..cb685741855 100644 --- a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java +++ b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java @@ -5,7 +5,7 @@ */ package org.elasticsearch.marvel.agent.renderer.cluster; -import com.google.common.hash.Hashing; +import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.admin.cluster.stats.ClusterStatsResponse; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -15,7 +15,9 @@ import org.elasticsearch.marvel.agent.collector.cluster.ClusterInfoMarvelDoc; import org.elasticsearch.marvel.agent.renderer.AbstractRenderer; import java.io.IOException; -import java.nio.charset.StandardCharsets; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.List; public class ClusterInfoRenderer extends AbstractRenderer { @@ -64,7 +66,17 @@ public class ClusterInfoRenderer extends AbstractRenderer public static String hash(String licenseStatus, String licenseUid, String licenseType, String licenseExpiryDate, String clusterUUID) { String toHash = licenseStatus + licenseUid + licenseType + licenseExpiryDate + clusterUUID; - return Hashing.sha256().hashString(toHash, StandardCharsets.UTF_8).toString(); + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] sha256Bytes = md.digest(toHash.getBytes("UTF-8")); + StringBuffer hash = new StringBuffer(); + for (int i = 0; i < sha256Bytes.length; i++) { + hash.append(Integer.toHexString(0xff & sha256Bytes[i])); + } + return hash.toString(); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { + throw new ElasticsearchException("Unexpected error computing SHA-256 hash", e); + } } static final class Fields { From ba86e3968c452aa12efbb618c176be50b02bd433 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 2 Oct 2015 16:16:18 -0400 Subject: [PATCH 2/3] Use a cloned instance of MessageDigest This commit adds a micro-optimization for obtaining a MessageDigest instance for calculating SHA-256 message digests. Benchmarking with JMH showed the micro-benchmarking of getting new instances versus cloning existing instances to be around twice as slow. Original commit: elastic/x-pack-elasticsearch@d558ed961f526720f9203f3ea23fe9183b0ec220 --- .../renderer/cluster/ClusterInfoRenderer.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java index cb685741855..d723f7b3093 100644 --- a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java +++ b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java @@ -22,6 +22,28 @@ import java.util.List; public class ClusterInfoRenderer extends AbstractRenderer { + static final class MessageDigestSHA256Provider { + private static final MessageDigest digest; + + static { + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + throw new ElasticsearchException("Unexpected exception creating MessageDigest instance", e); + } + } + + private static MessageDigest sha256() { + try { + MessageDigest sha = (MessageDigest) digest.clone(); + sha.reset(); + return sha; + } catch (CloneNotSupportedException e) { + throw new ElasticsearchException("Unexpected exception creating MessageDigest instance", e); + } + } + } + public ClusterInfoRenderer() { super(null, false); } @@ -67,15 +89,14 @@ public class ClusterInfoRenderer extends AbstractRenderer public static String hash(String licenseStatus, String licenseUid, String licenseType, String licenseExpiryDate, String clusterUUID) { String toHash = licenseStatus + licenseUid + licenseType + licenseExpiryDate + clusterUUID; try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] sha256Bytes = md.digest(toHash.getBytes("UTF-8")); + byte[] sha256Bytes = MessageDigestSHA256Provider.sha256().digest(toHash.getBytes("UTF-8")); StringBuffer hash = new StringBuffer(); for (int i = 0; i < sha256Bytes.length; i++) { hash.append(Integer.toHexString(0xff & sha256Bytes[i])); } return hash.toString(); - } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { - throw new ElasticsearchException("Unexpected error computing SHA-256 hash", e); + } catch (UnsupportedEncodingException e) { + throw new ElasticsearchException("Unexpected error calculating SHA-256 MessageDigest", e); } } From 6103d96e8334e382b2b1c13b32c17e948a23bc60 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Sun, 4 Oct 2015 16:25:15 -0400 Subject: [PATCH 3/3] Use abstraction from core Original commit: elastic/x-pack-elasticsearch@01b66264e0248277f0eb07194c0b4665833c4cb6 --- .../renderer/cluster/ClusterInfoRenderer.java | 36 ++----------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java index d723f7b3093..be559aea3a5 100644 --- a/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java +++ b/marvel/src/main/java/org/elasticsearch/marvel/agent/renderer/cluster/ClusterInfoRenderer.java @@ -7,6 +7,7 @@ package org.elasticsearch.marvel.agent.renderer.cluster; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.admin.cluster.stats.ClusterStatsResponse; +import org.elasticsearch.common.hash.MessageDigests; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilderString; @@ -16,34 +17,12 @@ import org.elasticsearch.marvel.agent.renderer.AbstractRenderer; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; public class ClusterInfoRenderer extends AbstractRenderer { - - static final class MessageDigestSHA256Provider { - private static final MessageDigest digest; - - static { - try { - digest = MessageDigest.getInstance("SHA-256"); - } catch (NoSuchAlgorithmException e) { - throw new ElasticsearchException("Unexpected exception creating MessageDigest instance", e); - } - } - - private static MessageDigest sha256() { - try { - MessageDigest sha = (MessageDigest) digest.clone(); - sha.reset(); - return sha; - } catch (CloneNotSupportedException e) { - throw new ElasticsearchException("Unexpected exception creating MessageDigest instance", e); - } - } - } - public ClusterInfoRenderer() { super(null, false); } @@ -88,16 +67,7 @@ public class ClusterInfoRenderer extends AbstractRenderer public static String hash(String licenseStatus, String licenseUid, String licenseType, String licenseExpiryDate, String clusterUUID) { String toHash = licenseStatus + licenseUid + licenseType + licenseExpiryDate + clusterUUID; - try { - byte[] sha256Bytes = MessageDigestSHA256Provider.sha256().digest(toHash.getBytes("UTF-8")); - StringBuffer hash = new StringBuffer(); - for (int i = 0; i < sha256Bytes.length; i++) { - hash.append(Integer.toHexString(0xff & sha256Bytes[i])); - } - return hash.toString(); - } catch (UnsupportedEncodingException e) { - throw new ElasticsearchException("Unexpected error calculating SHA-256 MessageDigest", e); - } + return MessageDigests.toHexString(MessageDigests.sha256().digest(toHash.getBytes(StandardCharsets.UTF_8))); } static final class Fields {