Skip to content

Commit 4948d69

Browse files
HCD-109 Deserialise dse 6.8 PeerInfo files
InetAddressAndPort fields were previously InetAddress, and serialised as either byte[] addresses or text hostnames. Adds two unit tests, simple serdes of InetAddress to InetAddressAndPort, and parsing of DSE-6 files (kept in `test/data/legacy-metadata/dse-6.8/nodes`).
1 parent f27dc68 commit 4948d69

File tree

5 files changed

+94
-10
lines changed

5 files changed

+94
-10
lines changed

src/java/org/apache/cassandra/nodes/PeerInfo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import java.util.Objects;
2121

2222
import com.fasterxml.jackson.annotation.JsonCreator;
23+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
2324
import com.fasterxml.jackson.annotation.JsonProperty;
2425
import org.apache.cassandra.locator.InetAddressAndPort;
2526
import org.apache.cassandra.utils.Throwables;
2627

28+
@JsonIgnoreProperties(ignoreUnknown = true)
2729
public final class PeerInfo extends NodeInfo
2830
{
2931
private final InetAddressAndPort peer;

src/java/org/apache/cassandra/nodes/SerHelper.java

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,29 @@
2424
import java.util.UUID;
2525

2626
import com.fasterxml.jackson.core.JsonGenerator;
27+
import com.fasterxml.jackson.core.JsonParseException;
2728
import com.fasterxml.jackson.core.JsonParser;
2829
import com.fasterxml.jackson.databind.DeserializationContext;
2930
import com.fasterxml.jackson.databind.JsonDeserializer;
3031
import com.fasterxml.jackson.databind.JsonSerializer;
3132
import com.fasterxml.jackson.databind.Module;
3233
import com.fasterxml.jackson.databind.SerializerProvider;
3334
import com.fasterxml.jackson.databind.module.SimpleModule;
35+
import com.google.common.annotations.VisibleForTesting;
36+
import org.slf4j.Logger;
37+
import org.slf4j.LoggerFactory;
38+
3439
import org.apache.cassandra.config.DatabaseDescriptor;
3540
import org.apache.cassandra.db.commitlog.CommitLogPosition;
3641
import org.apache.cassandra.dht.Token;
37-
import org.apache.cassandra.io.util.DataInputBuffer;
38-
import org.apache.cassandra.io.util.DataOutputBuffer;
3942
import org.apache.cassandra.locator.InetAddressAndPort;
4043
import org.apache.cassandra.utils.ByteBufferUtil;
4144
import org.apache.cassandra.utils.CassandraVersion;
4245

4346
final class SerHelper
4447
{
48+
private static final Logger logger = LoggerFactory.getLogger(SerHelper.class);
49+
4550
static Module createMsgpackModule()
4651
{
4752
SimpleModule module = new SimpleModule();
@@ -110,18 +115,34 @@ public void serialize(InetAddressAndPort t, JsonGenerator jsonGenerator, Seriali
110115
}
111116
}
112117

113-
private static final class InetAddressAndPortDeserializer extends JsonDeserializer<InetAddressAndPort>
118+
@VisibleForTesting
119+
static final class InetAddressAndPortDeserializer extends JsonDeserializer<InetAddressAndPort>
114120
{
115121
@Override
116122
public InetAddressAndPort deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException
117123
{
118-
jsonParser.isExpectedStartArrayToken();
119-
jsonParser.nextToken();
120-
InetAddress address = InetAddress.getByAddress(jsonParser.getBinaryValue());
121-
jsonParser.nextToken();
122-
int port = jsonParser.getIntValue();
123-
jsonParser.nextToken();
124-
return InetAddressAndPort.getByAddressOverrideDefaults(address, port);
124+
if (jsonParser.isExpectedStartArrayToken())
125+
{
126+
jsonParser.nextToken();
127+
InetAddress address = InetAddress.getByAddress(jsonParser.getBinaryValue());
128+
jsonParser.nextToken();
129+
int port = jsonParser.getIntValue();
130+
jsonParser.nextToken();
131+
return InetAddressAndPort.getByAddressOverrideDefaults(address, port);
132+
}
133+
try
134+
{
135+
logger.trace("deserializing legacy InetAddress for field {}",
136+
jsonParser.getParsingContext().hasCurrentName() ? jsonParser.getParsingContext().getCurrentName() : "unknown");
137+
138+
return InetAddressAndPort.getByAddress(jsonParser.getBinaryValue());
139+
}
140+
catch (JsonParseException e)
141+
{
142+
// legacy serialisation of InetAddress can also be text hostname, as well as byte[] address (above)
143+
jsonParser.nextToken();
144+
return InetAddressAndPort.getByName(jsonParser.getText());
145+
}
125146
}
126147
}
127148

3.14 KB
Binary file not shown.
5.79 KB
Binary file not shown.

test/unit/org/apache/cassandra/nodes/NodesTest.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,22 @@
1818

1919
package org.apache.cassandra.nodes;
2020

21+
import java.io.ByteArrayOutputStream;
2122
import java.io.File;
2223
import java.io.IOException;
24+
import java.net.InetAddress;
2325
import java.net.UnknownHostException;
26+
import java.nio.file.Paths;
2427
import java.util.Arrays;
2528
import java.util.Collection;
2629
import java.util.HashMap;
2730
import java.util.Map;
2831
import java.util.UUID;
2932

33+
import com.fasterxml.jackson.core.JsonGenerator;
34+
import com.fasterxml.jackson.core.JsonParser;
35+
import com.fasterxml.jackson.databind.JsonSerializer;
36+
import com.fasterxml.jackson.databind.SerializerProvider;
3037
import org.apache.commons.lang3.RandomStringUtils;
3138
import org.junit.After;
3239
import org.junit.Before;
@@ -260,6 +267,50 @@ public void testLocalInfoUnknownFieldsAreIgnoredDuringDeserialization() throws I
260267
assertEquals(clusterName, loadedLocalInfo.getClusterName());
261268
}
262269

270+
@Test
271+
public void testDse6InetAddresPeerInfoDeserialisation() throws IOException
272+
{
273+
InetAddressAndPort peer = InetAddressAndPort.getByName("127.0.0.2");
274+
InetAddressSerializer ser = new InetAddressSerializer();
275+
SerHelper.InetAddressAndPortDeserializer des = new SerHelper.InetAddressAndPortDeserializer();
276+
277+
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
278+
JsonGenerator jsonGenerator = new ObjectMapper().getFactory().createGenerator(outputStream);
279+
ser.serialize(peer.address, jsonGenerator, null);
280+
jsonGenerator.flush();
281+
282+
JsonParser jsonParser = new ObjectMapper().getFactory().createParser(outputStream.toByteArray());
283+
InetAddressAndPort inap = des.deserialize(jsonParser, null);
284+
assertEquals(peer, inap);
285+
}
286+
287+
@Test
288+
public void testDse6Compat() throws UnknownHostException
289+
{
290+
Nodes.Instance.unsafeSetup(Paths.get("test/data/legacy-metadata/dse-6.8/nodes"));
291+
292+
LocalInfo local = Nodes.local().get();
293+
assertEquals("local", local.getKey());
294+
assertEquals(BootstrapState.COMPLETED, local.getBootstrapState());
295+
assertEquals("3.4.5", local.getCqlVersion().toString());
296+
assertEquals("66", local.getNativeProtocolVersion());
297+
assertEquals("org.apache.cassandra.dht.Murmur3Partitioner", local.getPartitioner());
298+
assertEquals("Cassandra", local.getDataCenter());
299+
assertEquals("rack1", local.getRack());
300+
assertEquals(256, local.getTokens().size());
301+
302+
Nodes.Peers peers = Nodes.peers();
303+
assertEquals(2, peers.stream().count());
304+
PeerInfo peer = peers.get(InetAddressAndPort.getByNameOverrideDefaults("127.0.0.2", 7000));
305+
assertEquals("4.0.0.6855", peer.getReleaseVersion().toString());
306+
assertEquals("Cassandra", peer.getDataCenter());
307+
assertEquals("rack1", peer.getRack());
308+
peer = peers.get(InetAddressAndPort.getByNameOverrideDefaults("127.0.0.3", 7000));
309+
assertEquals("4.0.0.6855", peer.getReleaseVersion().toString());
310+
assertEquals("Cassandra", peer.getDataCenter());
311+
assertEquals("rack1", peer.getRack());
312+
}
313+
263314
static void fakePeer(PeerInfo p)
264315
{
265316
int nodeId = p.getPeer().address.getAddress()[3];
@@ -354,4 +405,14 @@ public void setUnsupportedField(String unsupportedField)
354405
this.unsupportedField = unsupportedField;
355406
}
356407
}
408+
409+
private static final class InetAddressSerializer extends JsonSerializer<InetAddress>
410+
{
411+
@Override
412+
public void serialize(InetAddress t, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException
413+
{
414+
// same as https://github.com/riptano/bdp/blob/6.8.54/dse-db/src/java/com/datastax/bdp/db/nodes/SerHelper.java#L200
415+
jsonGenerator.writeString(t.getHostAddress());
416+
}
417+
}
357418
}

0 commit comments

Comments
 (0)