From 66def6940c5f7f288745f8f0975fd85c682829db Mon Sep 17 00:00:00 2001 From: Daan Kerkhofs Date: Mon, 26 Apr 2021 10:09:06 +0200 Subject: [PATCH 1/3] gh-85 Fix type of SolrShardingMetricsContainer#rawData --- .../binder/solr/sharding/SolrShardingMetricsContainer.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java b/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java index bb27f856..c53d5599 100644 --- a/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java +++ b/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java @@ -1,7 +1,5 @@ package eu.xenit.alfred.telemetry.binder.solr.sharding; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -18,7 +16,7 @@ public class SolrShardingMetricsContainer { private ShardRegistry shardRegistry; - private Map>> rawData; + private Map>> rawData; private long lastRefresh; private long ttl; // how long before the raw data will be refreshed From b21b55f4457691672bf81e0018bc110b9588787f Mon Sep 17 00:00:00 2001 From: Daan Kerkhofs Date: Mon, 26 Apr 2021 13:56:05 +0200 Subject: [PATCH 2/3] gh-85 Invoke ShardRegistry#getFlocs() using reflection --- .../SolrShardingMetricsContainer.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java b/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java index c53d5599..ce5fbadb 100644 --- a/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java +++ b/alfred-telemetry-platform/src/main/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainer.java @@ -1,5 +1,6 @@ package eu.xenit.alfred.telemetry.binder.solr.sharding; +import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -16,7 +17,7 @@ public class SolrShardingMetricsContainer { private ShardRegistry shardRegistry; - private Map>> rawData; + private Map>> rawData; private long lastRefresh; private long ttl; // how long before the raw data will be refreshed @@ -33,7 +34,7 @@ public SolrShardingMetricsContainer(ShardRegistry shardRegistry, long ttl) { public void refresh() { long now = System.currentTimeMillis(); if (rawData == null || now - lastRefresh > ttl) { - rawData = shardRegistry.getFlocs(); + rawData = getFlocsWithReflection(); } } @@ -62,4 +63,19 @@ public Optional getReplicaState(ShardInstance shardInstance) { .map(shardState -> ReplicaState.valueOf(shardState.getPropertyBag().get(ShardRegistryImpl.INSTANCE_STATE))); } + /** + * The return type of {@link ShardRegistry#getFlocs()} changed from 'HashMap>>' to 'Map>>'. We invoke the method with reflection to catch + * this change. + */ + private Map>> getFlocsWithReflection() { + try { + // noinspection unchecked + return (Map>>) + shardRegistry.getClass().getMethod("getFlocs").invoke(shardRegistry); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new IllegalStateException("Failed to invoke ShardRegistry#getFlocs() using reflection", e); + } + } + } From a531688bc683d8a1e2cdfa531a5e5200abfe3276 Mon Sep 17 00:00:00 2001 From: Daan Kerkhofs Date: Mon, 26 Apr 2021 14:26:37 +0200 Subject: [PATCH 3/3] Include SolrShardingMetricsContainerTest --- .../SolrShardingMetricsContainerTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 alfred-telemetry-platform/src/test/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainerTest.java diff --git a/alfred-telemetry-platform/src/test/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainerTest.java b/alfred-telemetry-platform/src/test/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainerTest.java new file mode 100644 index 00000000..4e209bfb --- /dev/null +++ b/alfred-telemetry-platform/src/test/java/eu/xenit/alfred/telemetry/binder/solr/sharding/SolrShardingMetricsContainerTest.java @@ -0,0 +1,43 @@ +package eu.xenit.alfred.telemetry.binder.solr.sharding; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.HashSet; +import org.alfresco.repo.index.shard.Floc; +import org.alfresco.repo.index.shard.Shard; +import org.alfresco.repo.index.shard.ShardRegistry; +import org.alfresco.repo.index.shard.ShardState; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class SolrShardingMetricsContainerTest { + + @Mock + private ShardRegistry shardRegistry; + + private SolrShardingMetricsContainer container; + + @BeforeEach + void setup() { + container = new SolrShardingMetricsContainer(shardRegistry); + } + + @Test + void refresh() { + Floc floc = new Floc(); + HashMap>> flocs = new HashMap<>(); + flocs.put(floc, new HashMap<>()); + when(shardRegistry.getFlocs()).thenReturn(flocs); + + container.refresh(); + assertThat(container.getFlocs(), contains(floc)); + } + +} \ No newline at end of file