From 1219faf9f17ef77e1db4385665f5225fb6d7e819 Mon Sep 17 00:00:00 2001 From: Calle Wilund Date: Tue, 1 Sep 2020 15:33:04 +0200 Subject: [PATCH] scylla-jmx: Fix TableMetricObjectName serialization Fixes #133 TableMetricObjectName is not serializable as such, since it depends on a lexicon object etc. Use writeReplace to put a regular ObjectName in the stream instead. --- .../apache/cassandra/metrics/TableMetrics.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/cassandra/metrics/TableMetrics.java b/src/main/java/org/apache/cassandra/metrics/TableMetrics.java index 00af96c..9b83d2b 100644 --- a/src/main/java/org/apache/cassandra/metrics/TableMetrics.java +++ b/src/main/java/org/apache/cassandra/metrics/TableMetrics.java @@ -19,6 +19,8 @@ package org.apache.cassandra.metrics; import static com.scylladb.jmx.api.APIClient.getReader; +import java.io.InvalidObjectException; +import java.io.ObjectStreamException; import java.util.Hashtable; import java.util.function.BiFunction; import java.util.function.Function; @@ -295,7 +297,6 @@ public class TableMetrics implements Metrics { registry.createDummyTableGauge(Double.class, "PercentRepaired"); } - @SuppressWarnings("serial") static class TableMetricObjectName extends javax.management.ObjectName { private final TableMetricStringNameFactory factory; private final String metricName; @@ -400,6 +401,18 @@ public class TableMetrics implements Metrics { public boolean isPropertyValuePattern() { return false; } + + /** + * This type is not really serializable. + * Replace it with vanilla objectname. + */ + private Object writeReplace() throws ObjectStreamException { + try { + return new ObjectName(getDomain(), getKeyPropertyList()); + } catch (MalformedObjectNameException e) { + throw new InvalidObjectException(toString()); + } + } } static interface TableMetricStringNameFactory {