Committed by
Yuta HIGUCHI
Check if there's conflict in serializer registration Id.
- remove duplicate detected - Add little head space, just in case Kryo start registering some more built-ins. Change-Id: I8b1318d0e11ce1c0680aaef29cc88c96af78ae6f
Showing
2 changed files
with
40 additions
and
9 deletions
| ... | @@ -347,7 +347,6 @@ public final class KryoNamespaces { | ... | @@ -347,7 +347,6 @@ public final class KryoNamespaces { |
| 347 | DefaultFlowEntry.class, | 347 | DefaultFlowEntry.class, |
| 348 | StoredFlowEntry.class, | 348 | StoredFlowEntry.class, |
| 349 | DefaultFlowRule.class, | 349 | DefaultFlowRule.class, |
| 350 | - DefaultFlowEntry.class, | ||
| 351 | DefaultPacketRequest.class, | 350 | DefaultPacketRequest.class, |
| 352 | PacketPriority.class, | 351 | PacketPriority.class, |
| 353 | FlowEntry.FlowEntryState.class, | 352 | FlowEntry.FlowEntryState.class, |
| ... | @@ -466,7 +465,6 @@ public final class KryoNamespaces { | ... | @@ -466,7 +465,6 @@ public final class KryoNamespaces { |
| 466 | PartialFailureConstraint.class, | 465 | PartialFailureConstraint.class, |
| 467 | IntentOperation.class, | 466 | IntentOperation.class, |
| 468 | FlowRuleExtPayLoad.class, | 467 | FlowRuleExtPayLoad.class, |
| 469 | - Frequency.class, | ||
| 470 | DefaultAnnotations.class, | 468 | DefaultAnnotations.class, |
| 471 | PortStatistics.class, | 469 | PortStatistics.class, |
| 472 | DefaultPortStatistics.class, | 470 | DefaultPortStatistics.class, | ... | ... |
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | package org.onlab.util; | 16 | package org.onlab.util; |
| 17 | 17 | ||
| 18 | import com.esotericsoftware.kryo.Kryo; | 18 | import com.esotericsoftware.kryo.Kryo; |
| 19 | +import com.esotericsoftware.kryo.Registration; | ||
| 19 | import com.esotericsoftware.kryo.Serializer; | 20 | import com.esotericsoftware.kryo.Serializer; |
| 20 | import com.esotericsoftware.kryo.io.ByteBufferInput; | 21 | import com.esotericsoftware.kryo.io.ByteBufferInput; |
| 21 | import com.esotericsoftware.kryo.io.ByteBufferOutput; | 22 | import com.esotericsoftware.kryo.io.ByteBufferOutput; |
| ... | @@ -59,7 +60,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -59,7 +60,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
| 59 | /** | 60 | /** |
| 60 | * Smallest ID free to use for user defined registrations. | 61 | * Smallest ID free to use for user defined registrations. |
| 61 | */ | 62 | */ |
| 62 | - public static final int INITIAL_ID = 11; | 63 | + public static final int INITIAL_ID = 16; |
| 63 | 64 | ||
| 64 | private static final Logger log = getLogger(KryoNamespace.class); | 65 | private static final Logger log = getLogger(KryoNamespace.class); |
| 65 | 66 | ||
| ... | @@ -379,6 +380,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -379,6 +380,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
| 379 | */ | 380 | */ |
| 380 | @Override | 381 | @Override |
| 381 | public Kryo create() { | 382 | public Kryo create() { |
| 383 | + log.trace("Creating Kryo instance for {}", this); | ||
| 382 | Kryo kryo = new Kryo(); | 384 | Kryo kryo = new Kryo(); |
| 383 | kryo.setRegistrationRequired(registrationRequired); | 385 | kryo.setRegistrationRequired(registrationRequired); |
| 384 | 386 | ||
| ... | @@ -392,17 +394,48 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -392,17 +394,48 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
| 392 | id = kryo.getNextRegistrationId(); | 394 | id = kryo.getNextRegistrationId(); |
| 393 | } | 395 | } |
| 394 | for (Pair<Class<?>, Serializer<?>> entry : block.types()) { | 396 | for (Pair<Class<?>, Serializer<?>> entry : block.types()) { |
| 395 | - final Serializer<?> serializer = entry.getRight(); | 397 | + register(kryo, entry.getLeft(), entry.getRight(), id++); |
| 396 | - if (serializer == null) { | ||
| 397 | - kryo.register(entry.getLeft(), id++); | ||
| 398 | - } else { | ||
| 399 | - kryo.register(entry.getLeft(), serializer, id++); | ||
| 400 | - } | ||
| 401 | } | 398 | } |
| 402 | } | 399 | } |
| 403 | return kryo; | 400 | return kryo; |
| 404 | } | 401 | } |
| 405 | 402 | ||
| 403 | + /** | ||
| 404 | + * Register {@code type} and {@code serializer} to {@code kryo} instance. | ||
| 405 | + * | ||
| 406 | + * @param kryo Kryo instance | ||
| 407 | + * @param type type to register | ||
| 408 | + * @param serializer Specific serializer to register or null to use default. | ||
| 409 | + * @param id type registration id to use | ||
| 410 | + */ | ||
| 411 | + private static void register(Kryo kryo, Class<?> type, Serializer<?> serializer, int id) { | ||
| 412 | + Registration existing = kryo.getRegistration(id); | ||
| 413 | + if (existing != null) { | ||
| 414 | + if (existing.getType() != type) { | ||
| 415 | + log.error("Failed to register {} as {}, {} was already registered.", | ||
| 416 | + type, id, existing.getType()); | ||
| 417 | + | ||
| 418 | + throw new IllegalStateException(String.format( | ||
| 419 | + "Failed to register %s as %s, %s was already registered.", | ||
| 420 | + type, id, existing.getType())); | ||
| 421 | + } | ||
| 422 | + // falling through to register call for now. | ||
| 423 | + // Consider skipping, if there's reasonable | ||
| 424 | + // way to compare serializer equivalence. | ||
| 425 | + } | ||
| 426 | + Registration r; | ||
| 427 | + if (serializer == null) { | ||
| 428 | + r = kryo.register(type, id); | ||
| 429 | + } else { | ||
| 430 | + r = kryo.register(type, serializer, id); | ||
| 431 | + } | ||
| 432 | + if (r.getId() != id) { | ||
| 433 | + log.warn("{} already registed as {}. Skipping {}.", | ||
| 434 | + r.getType(), r.getId(), id); | ||
| 435 | + } | ||
| 436 | + log.trace("{} registered as {}", r.getType(), r.getId()); | ||
| 437 | + } | ||
| 438 | + | ||
| 406 | @Override | 439 | @Override |
| 407 | public Kryo borrow() { | 440 | public Kryo borrow() { |
| 408 | return pool.borrow(); | 441 | return pool.borrow(); | ... | ... |
-
Please register or login to post a comment