Introduced a serializer interface and minimal kyro based implementation as a pre…
…cursor to moving netty messaging out to onos-utils
Showing
7 changed files
with
87 additions
and
25 deletions
| 1 | +package org.onlab.onos.store.messaging.impl; | ||
| 2 | + | ||
| 3 | +import org.onlab.util.KryoPool; | ||
| 4 | +import org.slf4j.Logger; | ||
| 5 | +import org.slf4j.LoggerFactory; | ||
| 6 | + | ||
| 7 | +import java.util.ArrayList; | ||
| 8 | +import java.util.HashMap; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * Kryo Serializer. | ||
| 12 | + */ | ||
| 13 | +public class KryoSerializer implements Serializer { | ||
| 14 | + | ||
| 15 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 16 | + | ||
| 17 | + private KryoPool serializerPool; | ||
| 18 | + | ||
| 19 | + public KryoSerializer() { | ||
| 20 | + setupKryoPool(); | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * Sets up the common serialzers pool. | ||
| 25 | + */ | ||
| 26 | + protected void setupKryoPool() { | ||
| 27 | + // FIXME Slice out types used in common to separate pool/namespace. | ||
| 28 | + serializerPool = KryoPool.newBuilder() | ||
| 29 | + .register(ArrayList.class, | ||
| 30 | + HashMap.class, | ||
| 31 | + ArrayList.class | ||
| 32 | + ) | ||
| 33 | + .build() | ||
| 34 | + .populate(1); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public Object decode(byte[] data) { | ||
| 40 | + return serializerPool.deserialize(data); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + @Override | ||
| 44 | + public byte[] encode(Object payload) { | ||
| 45 | + return serializerPool.serialize(payload); | ||
| 46 | + } | ||
| 47 | +} |
| ... | @@ -5,7 +5,6 @@ import java.util.List; | ... | @@ -5,7 +5,6 @@ import java.util.List; |
| 5 | 5 | ||
| 6 | import static com.google.common.base.Preconditions.checkState; | 6 | import static com.google.common.base.Preconditions.checkState; |
| 7 | 7 | ||
| 8 | -import org.onlab.onos.store.cluster.messaging.SerializationService; | ||
| 9 | import org.onlab.onos.store.messaging.Endpoint; | 8 | import org.onlab.onos.store.messaging.Endpoint; |
| 10 | 9 | ||
| 11 | import io.netty.buffer.ByteBuf; | 10 | import io.netty.buffer.ByteBuf; |
| ... | @@ -18,11 +17,11 @@ import io.netty.handler.codec.ByteToMessageDecoder; | ... | @@ -18,11 +17,11 @@ import io.netty.handler.codec.ByteToMessageDecoder; |
| 18 | public class MessageDecoder extends ByteToMessageDecoder { | 17 | public class MessageDecoder extends ByteToMessageDecoder { |
| 19 | 18 | ||
| 20 | private final NettyMessagingService messagingService; | 19 | private final NettyMessagingService messagingService; |
| 21 | - private final SerializationService serializationService; | 20 | + private final Serializer serializer; |
| 22 | 21 | ||
| 23 | - public MessageDecoder(NettyMessagingService messagingService, SerializationService serializationService) { | 22 | + public MessageDecoder(NettyMessagingService messagingService, Serializer serializer) { |
| 24 | this.messagingService = messagingService; | 23 | this.messagingService = messagingService; |
| 25 | - this.serializationService = serializationService; | 24 | + this.serializer = serializer; |
| 26 | } | 25 | } |
| 27 | 26 | ||
| 28 | @Override | 27 | @Override |
| ... | @@ -47,7 +46,7 @@ public class MessageDecoder extends ByteToMessageDecoder { | ... | @@ -47,7 +46,7 @@ public class MessageDecoder extends ByteToMessageDecoder { |
| 47 | Endpoint sender = new Endpoint(host, port); | 46 | Endpoint sender = new Endpoint(host, port); |
| 48 | 47 | ||
| 49 | // read message payload; first read size and then bytes. | 48 | // read message payload; first read size and then bytes. |
| 50 | - Object payload = serializationService.decode(in.readBytes(in.readInt()).array()); | 49 | + Object payload = serializer.decode(in.readBytes(in.readInt()).array()); |
| 51 | 50 | ||
| 52 | InternalMessage message = new InternalMessage.Builder(messagingService) | 51 | InternalMessage message = new InternalMessage.Builder(messagingService) |
| 53 | .withId(id) | 52 | .withId(id) | ... | ... |
| 1 | package org.onlab.onos.store.messaging.impl; | 1 | package org.onlab.onos.store.messaging.impl; |
| 2 | 2 | ||
| 3 | -import org.onlab.onos.store.cluster.messaging.SerializationService; | ||
| 4 | - | ||
| 5 | import io.netty.buffer.ByteBuf; | 3 | import io.netty.buffer.ByteBuf; |
| 6 | import io.netty.channel.ChannelHandlerContext; | 4 | import io.netty.channel.ChannelHandlerContext; |
| 7 | import io.netty.handler.codec.MessageToByteEncoder; | 5 | import io.netty.handler.codec.MessageToByteEncoder; |
| ... | @@ -14,10 +12,10 @@ public class MessageEncoder extends MessageToByteEncoder<InternalMessage> { | ... | @@ -14,10 +12,10 @@ public class MessageEncoder extends MessageToByteEncoder<InternalMessage> { |
| 14 | // onosiscool in ascii | 12 | // onosiscool in ascii |
| 15 | public static final byte[] PREAMBLE = "onosiscool".getBytes(); | 13 | public static final byte[] PREAMBLE = "onosiscool".getBytes(); |
| 16 | 14 | ||
| 17 | - private final SerializationService serializationService; | 15 | + private final Serializer serializer; |
| 18 | 16 | ||
| 19 | - public MessageEncoder(SerializationService serializationService) { | 17 | + public MessageEncoder(Serializer serializer) { |
| 20 | - this.serializationService = serializationService; | 18 | + this.serializer = serializer; |
| 21 | } | 19 | } |
| 22 | 20 | ||
| 23 | @Override | 21 | @Override |
| ... | @@ -46,12 +44,12 @@ public class MessageEncoder extends MessageToByteEncoder<InternalMessage> { | ... | @@ -46,12 +44,12 @@ public class MessageEncoder extends MessageToByteEncoder<InternalMessage> { |
| 46 | out.writeInt(message.sender().port()); | 44 | out.writeInt(message.sender().port()); |
| 47 | 45 | ||
| 48 | try { | 46 | try { |
| 49 | - serializationService.encode(message.payload()); | 47 | + serializer.encode(message.payload()); |
| 50 | } catch (Exception e) { | 48 | } catch (Exception e) { |
| 51 | e.printStackTrace(); | 49 | e.printStackTrace(); |
| 52 | } | 50 | } |
| 53 | 51 | ||
| 54 | - byte[] payload = serializationService.encode(message.payload()); | 52 | + byte[] payload = serializer.encode(message.payload()); |
| 55 | 53 | ||
| 56 | // write payload length. | 54 | // write payload length. |
| 57 | out.writeInt(payload.length); | 55 | out.writeInt(payload.length); | ... | ... |
| ... | @@ -31,7 +31,6 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -31,7 +31,6 @@ import org.apache.felix.scr.annotations.Deactivate; |
| 31 | import org.apache.felix.scr.annotations.Reference; | 31 | import org.apache.felix.scr.annotations.Reference; |
| 32 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 32 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 33 | import org.apache.felix.scr.annotations.Service; | 33 | import org.apache.felix.scr.annotations.Service; |
| 34 | -import org.onlab.onos.store.cluster.messaging.SerializationService; | ||
| 35 | import org.onlab.onos.store.messaging.Endpoint; | 34 | import org.onlab.onos.store.messaging.Endpoint; |
| 36 | import org.onlab.onos.store.messaging.MessageHandler; | 35 | import org.onlab.onos.store.messaging.MessageHandler; |
| 37 | import org.onlab.onos.store.messaging.MessagingService; | 36 | import org.onlab.onos.store.messaging.MessagingService; |
| ... | @@ -61,7 +60,7 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -61,7 +60,7 @@ public class NettyMessagingService implements MessagingService { |
| 61 | private final Endpoint localEp; | 60 | private final Endpoint localEp; |
| 62 | 61 | ||
| 63 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 62 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 64 | - protected SerializationService serializationService; | 63 | + protected Serializer serializer; |
| 65 | 64 | ||
| 66 | public NettyMessagingService() { | 65 | public NettyMessagingService() { |
| 67 | // TODO: Default port should be configurable. | 66 | // TODO: Default port should be configurable. |
| ... | @@ -213,8 +212,8 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -213,8 +212,8 @@ public class NettyMessagingService implements MessagingService { |
| 213 | @Override | 212 | @Override |
| 214 | protected void initChannel(SocketChannel channel) throws Exception { | 213 | protected void initChannel(SocketChannel channel) throws Exception { |
| 215 | channel.pipeline() | 214 | channel.pipeline() |
| 216 | - .addLast(new MessageEncoder(serializationService)) | 215 | + .addLast(new MessageEncoder(serializer)) |
| 217 | - .addLast(new MessageDecoder(NettyMessagingService.this, serializationService)) | 216 | + .addLast(new MessageDecoder(NettyMessagingService.this, serializer)) |
| 218 | .addLast(new NettyMessagingService.InboundMessageDispatcher()); | 217 | .addLast(new NettyMessagingService.InboundMessageDispatcher()); |
| 219 | } | 218 | } |
| 220 | } | 219 | } | ... | ... |
| 1 | +package org.onlab.onos.store.messaging.impl; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * Interface for encoding/decoding message payloads. | ||
| 5 | + */ | ||
| 6 | +public interface Serializer { | ||
| 7 | + | ||
| 8 | + /** | ||
| 9 | + * Decodes the specified byte array to a POJO. | ||
| 10 | + * | ||
| 11 | + * @param data byte array. | ||
| 12 | + * @return POJO | ||
| 13 | + */ | ||
| 14 | + Object decode(byte[] data); | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * Encodes the specified POJO into a byte array. | ||
| 18 | + * | ||
| 19 | + * @param data POJO to be encoded | ||
| 20 | + * @return byte array. | ||
| 21 | + */ | ||
| 22 | + byte[] encode(Object message); | ||
| 23 | + | ||
| 24 | +} |
| ... | @@ -2,7 +2,6 @@ package org.onlab.onos.store.messaging.impl; | ... | @@ -2,7 +2,6 @@ package org.onlab.onos.store.messaging.impl; |
| 2 | 2 | ||
| 3 | import java.util.concurrent.TimeUnit; | 3 | import java.util.concurrent.TimeUnit; |
| 4 | 4 | ||
| 5 | -import org.onlab.onos.store.cluster.impl.MessageSerializer; | ||
| 6 | import org.onlab.onos.store.messaging.Endpoint; | 5 | import org.onlab.onos.store.messaging.Endpoint; |
| 7 | import org.onlab.onos.store.messaging.Response; | 6 | import org.onlab.onos.store.messaging.Response; |
| 8 | 7 | ||
| ... | @@ -21,9 +20,8 @@ public final class SimpleClient { | ... | @@ -21,9 +20,8 @@ public final class SimpleClient { |
| 21 | public static class TestNettyMessagingService extends NettyMessagingService { | 20 | public static class TestNettyMessagingService extends NettyMessagingService { |
| 22 | public TestNettyMessagingService(int port) throws Exception { | 21 | public TestNettyMessagingService(int port) throws Exception { |
| 23 | super(port); | 22 | super(port); |
| 24 | - MessageSerializer mgr = new MessageSerializer(); | 23 | + Serializer serializer = new KryoSerializer(); |
| 25 | - mgr.activate(); | 24 | + this.serializer = serializer; |
| 26 | - this.serializationService = mgr; | ||
| 27 | } | 25 | } |
| 28 | } | 26 | } |
| 29 | } | 27 | } | ... | ... |
| 1 | package org.onlab.onos.store.messaging.impl; | 1 | package org.onlab.onos.store.messaging.impl; |
| 2 | 2 | ||
| 3 | -import org.onlab.onos.store.cluster.impl.MessageSerializer; | ||
| 4 | - | ||
| 5 | public final class SimpleServer { | 3 | public final class SimpleServer { |
| 6 | private SimpleServer() {} | 4 | private SimpleServer() {} |
| 7 | 5 | ||
| ... | @@ -14,9 +12,8 @@ public final class SimpleServer { | ... | @@ -14,9 +12,8 @@ public final class SimpleServer { |
| 14 | 12 | ||
| 15 | public static class TestNettyMessagingService extends NettyMessagingService { | 13 | public static class TestNettyMessagingService extends NettyMessagingService { |
| 16 | protected TestNettyMessagingService() { | 14 | protected TestNettyMessagingService() { |
| 17 | - MessageSerializer mgr = new MessageSerializer(); | 15 | + Serializer serializer = new KryoSerializer(); |
| 18 | - mgr.activate(); | 16 | + this.serializer = serializer; |
| 19 | - this.serializationService = mgr; | ||
| 20 | } | 17 | } |
| 21 | } | 18 | } |
| 22 | } | 19 | } | ... | ... |
-
Please register or login to post a comment