blob: 679e7f938e033ee7c4d6fe440683d60307e4d374 [file] [log] [blame]
Jonathan Hart23701d12014-04-03 10:45:48 -07001package net.onrc.onos.core.util.serializers;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07002
TeruUd1c5b652014-03-24 13:58:46 -07003import java.net.Inet4Address;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -08004import java.net.InetAddress;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07005import java.util.ArrayList;
TeruU7feef8a2014-04-03 00:15:49 -07006import java.util.Date;
TeruUf9111652014-05-14 23:10:35 -07007import java.util.HashMap;
TeruUd1c5b652014-03-24 13:58:46 -07008import java.util.HashSet;
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -07009import java.util.LinkedList;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070010import java.util.concurrent.ConcurrentHashMap;
TeruU7feef8a2014-04-03 00:15:49 -070011
Pavlin Radoslavov695f8952014-07-23 16:57:01 -070012import net.floodlightcontroller.core.IFloodlightProviderService.Role;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070013import net.floodlightcontroller.util.MACAddress;
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -070014import net.onrc.onos.api.batchoperation.BatchOperationEntry;
TeruU3c049c42014-04-15 10:13:25 -070015import net.onrc.onos.apps.proxyarp.ArpCacheNotification;
Jonathan Hart0961fe82014-04-03 09:56:25 -070016import net.onrc.onos.apps.proxyarp.ArpReplyNotification;
Jonathan Hart03102132014-07-01 23:22:04 -070017import net.onrc.onos.core.hostmanager.Host;
Jonathan Hartaa380972014-04-03 10:24:46 -070018import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
19import net.onrc.onos.core.intent.ErrorIntent;
20import net.onrc.onos.core.intent.Intent;
21import net.onrc.onos.core.intent.IntentOperation;
22import net.onrc.onos.core.intent.IntentOperationList;
Yuta HIGUCHI1fc395e2014-05-13 14:06:28 -070023import net.onrc.onos.core.intent.Path;
Jonathan Hartaa380972014-04-03 10:24:46 -070024import net.onrc.onos.core.intent.PathIntent;
25import net.onrc.onos.core.intent.ShortestPathIntent;
26import net.onrc.onos.core.intent.runtime.IntentStateList;
Jonathan Hart313fdf02014-04-10 14:09:46 -070027import net.onrc.onos.core.packetservice.BroadcastPacketOutNotification;
Jonathan Harte6e63732014-04-16 14:29:49 -070028import net.onrc.onos.core.packetservice.PacketOutNotification;
Jonathan Hart313fdf02014-04-10 14:09:46 -070029import net.onrc.onos.core.packetservice.SinglePacketOutNotification;
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -070030import net.onrc.onos.core.topology.AdminStatus;
31import net.onrc.onos.core.topology.ConfigState;
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -070032import net.onrc.onos.core.topology.HostEvent;
Jonathan Hart472062d2014-04-03 10:56:48 -070033import net.onrc.onos.core.topology.LinkEvent;
Pavlin Radoslavov695f8952014-07-23 16:57:01 -070034import net.onrc.onos.core.topology.MastershipEvent;
Jonathan Hart472062d2014-04-03 10:56:48 -070035import net.onrc.onos.core.topology.PortEvent;
36import net.onrc.onos.core.topology.SwitchEvent;
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -070037import net.onrc.onos.core.topology.TopologyBatchOperation;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070038import net.onrc.onos.core.topology.TopologyElement;
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -070039import net.onrc.onos.core.topology.TopologyEvent;
Jonathan Hart23701d12014-04-03 10:45:48 -070040import net.onrc.onos.core.util.CallerId;
41import net.onrc.onos.core.util.DataPath;
Jonathan Hart23701d12014-04-03 10:45:48 -070042import net.onrc.onos.core.util.Dpid;
43import net.onrc.onos.core.util.FlowEntry;
44import net.onrc.onos.core.util.FlowEntryAction;
45import net.onrc.onos.core.util.FlowEntryActions;
46import net.onrc.onos.core.util.FlowEntryErrorState;
47import net.onrc.onos.core.util.FlowEntryId;
48import net.onrc.onos.core.util.FlowEntryMatch;
49import net.onrc.onos.core.util.FlowEntrySwitchState;
50import net.onrc.onos.core.util.FlowEntryUserState;
51import net.onrc.onos.core.util.FlowId;
52import net.onrc.onos.core.util.FlowPath;
53import net.onrc.onos.core.util.FlowPathFlags;
54import net.onrc.onos.core.util.FlowPathType;
55import net.onrc.onos.core.util.FlowPathUserState;
56import net.onrc.onos.core.util.IPv4;
57import net.onrc.onos.core.util.IPv4Net;
58import net.onrc.onos.core.util.IPv6;
59import net.onrc.onos.core.util.IPv6Net;
Yuta HIGUCHI02ccb8c2014-07-10 11:29:45 -070060import net.onrc.onos.core.util.LinkTuple;
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -070061import net.onrc.onos.core.util.OnosInstanceId;
Yuta HIGUCHIfb564502014-06-16 21:29:00 -070062import net.onrc.onos.core.util.PortNumber;
Jonathan Hart23701d12014-04-03 10:45:48 -070063import net.onrc.onos.core.util.Switch;
Yuta HIGUCHI5c8cbeb2014-06-27 11:13:48 -070064import net.onrc.onos.core.util.SwitchPort;
Jonathan Hart23701d12014-04-03 10:45:48 -070065
Yuta HIGUCHI2d5ac522014-01-22 10:21:41 -080066import com.esotericsoftware.kryo.Kryo;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -070067
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070068/**
69 * Class factory for allocating Kryo instances for
70 * serialization/deserialization of classes.
71 */
72public class KryoFactory {
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -070073 private static final int DEFAULT_PREALLOCATIONS = 100;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070074 private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
75
76 /**
77 * Default constructor.
Ray Milkey269ffb92014-04-03 14:43:30 -070078 * <p/>
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -070079 * Preallocates {@code DEFAULT_PREALLOCATIONS} Kryo instances.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070080 */
81 public KryoFactory() {
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -070082 this(DEFAULT_PREALLOCATIONS);
83 }
84
85 /**
Ray Milkeyb41100a2014-04-10 10:42:15 -070086 * Constructor to explicitly specify number of Kryo instances to pool.
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -070087 *
88 * @param initialCapacity number of Kryo instance to preallocate
89 */
90 public KryoFactory(final int initialCapacity) {
91 // Preallocate
92 kryoList.ensureCapacity(initialCapacity);
93 for (int i = 0; i < initialCapacity; i++) {
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -070094 Kryo kryo = newKryoObject();
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -070095 kryoList.add(kryo);
96 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070097 }
98
99 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700100 * Gets a new Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700101 *
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700102 * @return the Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700103 */
104 public Kryo newKryo() {
Ray Milkey269ffb92014-04-03 14:43:30 -0700105 return newDeleteKryo(null);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700106 }
107
108 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700109 * Deletes an existing Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700110 *
111 * @param deleteKryo the object to delete.
112 */
113 public void deleteKryo(Kryo deleteKryo) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700114 newDeleteKryo(deleteKryo);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700115 }
116
117 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700118 * Creates or deletes a Kryo object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700119 *
120 * @param deleteKryo if null, then allocate and return a new object,
Ray Milkey269ffb92014-04-03 14:43:30 -0700121 * otherwise delete the provided object.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700122 * @return a new Kryo object if needed, otherwise null.
123 */
Ray Milkeyec838942014-04-09 11:28:43 -0700124 private synchronized Kryo newDeleteKryo(Kryo deleteKryo) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700125 if (deleteKryo != null) {
126 // Delete an entry by moving it back to the buffer
127 kryoList.add(deleteKryo);
128 return null;
129 } else {
130 Kryo kryo = null;
131 if (kryoList.isEmpty()) {
132 // Preallocate
133 for (int i = 0; i < 100; i++) {
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700134 kryo = newKryoObject();
Ray Milkey269ffb92014-04-03 14:43:30 -0700135 kryoList.add(kryo);
136 }
137 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700138
Ray Milkey269ffb92014-04-03 14:43:30 -0700139 kryo = kryoList.remove(kryoList.size() - 1);
140 return kryo;
141 }
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700142 }
143
144 /**
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700145 * Creates and initializes a new Kryo object.
146 *<p>
147 * NOTE: This operation can be slow and should be used only if the
148 * application needs a single Kryo instance (e.g., during startup).
149 * For faster allocation, the application should use #newKryo()
150 * and #deleteKryo() factory methods.
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700151 *
152 * @return the created Kryo object.
153 */
Pavlin Radoslavov9c7b14c2014-07-03 17:24:27 -0700154 public static Kryo newKryoObject() {
Ray Milkey269ffb92014-04-03 14:43:30 -0700155 Kryo kryo = new Kryo();
156 kryo.setRegistrationRequired(true);
157 //
158 // WARNING: Order of register() calls affects serialized bytes.
159 // - Do no insert new entry in the middle, always add to the end.
160 // - Do not simply remove existing entry
161 //
Yuta HIGUCHI0af53d22014-03-31 14:01:35 -0700162
Ray Milkey269ffb92014-04-03 14:43:30 -0700163 // kryo.setReferences(false);
164 //
165 kryo.register(ArrayList.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700166
Ray Milkey269ffb92014-04-03 14:43:30 -0700167 // FlowPath and related classes
168 kryo.register(CallerId.class);
169 kryo.register(DataPath.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700170 kryo.register(Dpid.class);
171 kryo.register(FlowEntryAction.class);
172 kryo.register(FlowEntryAction.ActionEnqueue.class);
173 kryo.register(FlowEntryAction.ActionOutput.class);
174 kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
175 kryo.register(FlowEntryAction.ActionSetIpToS.class);
176 kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
177 kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
178 kryo.register(FlowEntryAction.ActionSetVlanId.class);
179 kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
180 kryo.register(FlowEntryAction.ActionStripVlan.class);
181 kryo.register(FlowEntryAction.ActionValues.class);
182 kryo.register(FlowEntryActions.class);
183 kryo.register(FlowEntryErrorState.class);
184 kryo.register(FlowEntryId.class);
185 kryo.register(FlowEntry.class);
186 kryo.register(FlowEntryMatch.class);
187 kryo.register(FlowEntryMatch.Field.class);
188 kryo.register(FlowEntrySwitchState.class);
189 kryo.register(FlowEntryUserState.class);
190 kryo.register(FlowId.class);
191 kryo.register(FlowPath.class);
192 kryo.register(FlowPathFlags.class);
193 kryo.register(FlowPathType.class);
194 kryo.register(FlowPathUserState.class);
195 kryo.register(IPv4.class);
196 kryo.register(IPv4Net.class);
197 kryo.register(IPv6.class);
198 kryo.register(IPv6Net.class);
199 kryo.register(byte[].class);
200 kryo.register(MACAddress.class);
Yuta HIGUCHIfb564502014-06-16 21:29:00 -0700201 kryo.register(PortNumber.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700202 kryo.register(Switch.class);
Yuta HIGUCHI5c8cbeb2014-06-27 11:13:48 -0700203 kryo.register(SwitchPort.class);
Yuta HIGUCHI02ccb8c2014-07-10 11:29:45 -0700204 kryo.register(LinkTuple.class);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700205
Ray Milkey269ffb92014-04-03 14:43:30 -0700206 // New data model-related classes
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700207 kryo.register(AdminStatus.class);
208 kryo.register(ConcurrentHashMap.class);
209 kryo.register(ConfigState.class);
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700210 kryo.register(HostEvent.class);
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -0700211 kryo.register(LinkedList.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700212 kryo.register(LinkEvent.class);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700213 kryo.register(MastershipEvent.class);
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700214 kryo.register(OnosInstanceId.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700215 kryo.register(PortEvent.class);
Pavlin Radoslavov695f8952014-07-23 16:57:01 -0700216 kryo.register(Role.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700217 kryo.register(SwitchEvent.class);
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -0700218 kryo.register(TopologyBatchOperation.class);
219 kryo.register(TopologyBatchOperation.Operator.class);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700220 kryo.register(TopologyElement.class);
Pavlin Radoslavov53b208a2014-07-28 13:16:11 -0700221 kryo.register(TopologyEvent.class);
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -0800222
Ray Milkey269ffb92014-04-03 14:43:30 -0700223 // Intent-related classes
224 kryo.register(Path.class);
225 kryo.register(Intent.class);
226 kryo.register(Intent.IntentState.class);
227 kryo.register(PathIntent.class);
228 kryo.register(ShortestPathIntent.class);
229 kryo.register(ConstrainedShortestPathIntent.class);
230 kryo.register(ErrorIntent.class);
231 kryo.register(ErrorIntent.ErrorType.class);
232 kryo.register(IntentOperation.class);
233 kryo.register(IntentOperation.Operator.class);
234 kryo.register(IntentOperationList.class);
235 kryo.register(IntentStateList.class);
TeruUf9111652014-05-14 23:10:35 -0700236 kryo.register(HashMap.class);
Toshio Koideeb90d912014-02-18 21:30:22 -0800237
Pavlin Radoslavovdd08e8c2014-08-14 11:02:57 -0700238 // New intent-related classes
239 kryo.register(BatchOperationEntry.class);
240
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700241 // Host-related classes
Ray Milkey269ffb92014-04-03 14:43:30 -0700242 kryo.register(HashSet.class);
Jonathan Hart03102132014-07-01 23:22:04 -0700243 kryo.register(Host.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700244 kryo.register(Date.class);
TeruU7feef8a2014-04-03 00:15:49 -0700245
Ray Milkey269ffb92014-04-03 14:43:30 -0700246 // ProxyArp-related classes
Jonathan Harte6e63732014-04-16 14:29:49 -0700247 kryo.register(PacketOutNotification.class);
Ray Milkey269ffb92014-04-03 14:43:30 -0700248 kryo.register(BroadcastPacketOutNotification.class);
249 kryo.register(SinglePacketOutNotification.class);
250 kryo.register(ArpReplyNotification.class);
TeruU3c049c42014-04-15 10:13:25 -0700251 kryo.register(ArpCacheNotification.class);
Yuta HIGUCHIc25861a2014-06-17 23:17:09 -0700252 // TODO check if InetAddress related is still used
253 // TODO check if InetAddress can be correctly serialized
254 kryo.register(InetAddress.class);
255 kryo.register(Inet4Address.class);
TeruUd1c5b652014-03-24 13:58:46 -0700256
Ray Milkey269ffb92014-04-03 14:43:30 -0700257 return kryo;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700258 }
259}