Committed by
Gerrit Code Review
KryoNamespace improvements
- Ignore duplicate Namespace registration - Add friendly name for helping logging - ONOS-4528 Change-Id: Id78f2a0f6e9715a7880875039825e294a68592a9
Showing
2 changed files
with
67 additions
and
11 deletions
... | @@ -277,7 +277,7 @@ public final class KryoNamespaces { | ... | @@ -277,7 +277,7 @@ public final class KryoNamespaces { |
277 | .register(char[].class) | 277 | .register(char[].class) |
278 | .register(String[].class) | 278 | .register(String[].class) |
279 | .register(boolean[].class) | 279 | .register(boolean[].class) |
280 | - .build(); | 280 | + .build("BASIC"); |
281 | 281 | ||
282 | /** | 282 | /** |
283 | * KryoNamespace which can serialize ON.lab misc classes. | 283 | * KryoNamespace which can serialize ON.lab misc classes. |
... | @@ -297,7 +297,7 @@ public final class KryoNamespaces { | ... | @@ -297,7 +297,7 @@ public final class KryoNamespaces { |
297 | .register(Bandwidth.class) | 297 | .register(Bandwidth.class) |
298 | .register(Bandwidth.bps(1L).getClass()) | 298 | .register(Bandwidth.bps(1L).getClass()) |
299 | .register(Bandwidth.bps(1.0).getClass()) | 299 | .register(Bandwidth.bps(1.0).getClass()) |
300 | - .build(); | 300 | + .build("MISC"); |
301 | 301 | ||
302 | /** | 302 | /** |
303 | * Kryo registration Id for user custom registration. | 303 | * Kryo registration Id for user custom registration. |
... | @@ -542,7 +542,7 @@ public final class KryoNamespaces { | ... | @@ -542,7 +542,7 @@ public final class KryoNamespaces { |
542 | .register(VlanCodec.class) | 542 | .register(VlanCodec.class) |
543 | .register(MplsCodec.class) | 543 | .register(MplsCodec.class) |
544 | .register(NoOpCodec.class) | 544 | .register(NoOpCodec.class) |
545 | - .build(); | 545 | + .build("API"); |
546 | 546 | ||
547 | 547 | ||
548 | // not to be instantiated | 548 | // not to be instantiated | ... | ... |
... | @@ -35,7 +35,9 @@ import java.io.OutputStream; | ... | @@ -35,7 +35,9 @@ import java.io.OutputStream; |
35 | import java.nio.ByteBuffer; | 35 | import java.nio.ByteBuffer; |
36 | import java.util.ArrayList; | 36 | import java.util.ArrayList; |
37 | import java.util.List; | 37 | import java.util.List; |
38 | +import java.util.Objects; | ||
38 | 39 | ||
40 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
39 | import static org.slf4j.LoggerFactory.getLogger; | 41 | import static org.slf4j.LoggerFactory.getLogger; |
40 | 42 | ||
41 | /** | 43 | /** |
... | @@ -62,9 +64,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -62,9 +64,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
62 | */ | 64 | */ |
63 | public static final int INITIAL_ID = 16; | 65 | public static final int INITIAL_ID = 16; |
64 | 66 | ||
67 | + private static final String NO_NAME = "(no name)"; | ||
68 | + | ||
65 | private static final Logger log = getLogger(KryoNamespace.class); | 69 | private static final Logger log = getLogger(KryoNamespace.class); |
66 | 70 | ||
67 | 71 | ||
72 | + | ||
68 | private final KryoPool pool = new KryoPool.Builder(this) | 73 | private final KryoPool pool = new KryoPool.Builder(this) |
69 | .softReferences() | 74 | .softReferences() |
70 | .build(); | 75 | .build(); |
... | @@ -72,6 +77,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -72,6 +77,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
72 | private final ImmutableList<RegistrationBlock> registeredBlocks; | 77 | private final ImmutableList<RegistrationBlock> registeredBlocks; |
73 | 78 | ||
74 | private final boolean registrationRequired; | 79 | private final boolean registrationRequired; |
80 | + private final String friendlyName; | ||
75 | 81 | ||
76 | 82 | ||
77 | /** | 83 | /** |
... | @@ -91,10 +97,20 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -91,10 +97,20 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
91 | * @return KryoNamespace | 97 | * @return KryoNamespace |
92 | */ | 98 | */ |
93 | public KryoNamespace build() { | 99 | public KryoNamespace build() { |
100 | + return build(NO_NAME); | ||
101 | + } | ||
102 | + | ||
103 | + /** | ||
104 | + * Builds a {@link KryoNamespace} instance. | ||
105 | + * | ||
106 | + * @param friendlyName friendly name for the namespace | ||
107 | + * @return KryoNamespace | ||
108 | + */ | ||
109 | + public KryoNamespace build(String friendlyName) { | ||
94 | if (!types.isEmpty()) { | 110 | if (!types.isEmpty()) { |
95 | blocks.add(new RegistrationBlock(this.blockHeadId, types)); | 111 | blocks.add(new RegistrationBlock(this.blockHeadId, types)); |
96 | } | 112 | } |
97 | - return new KryoNamespace(blocks, registrationRequired).populate(1); | 113 | + return new KryoNamespace(blocks, registrationRequired, friendlyName).populate(1); |
98 | } | 114 | } |
99 | 115 | ||
100 | /** | 116 | /** |
... | @@ -109,7 +125,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -109,7 +125,7 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
109 | if (!types.isEmpty()) { | 125 | if (!types.isEmpty()) { |
110 | if (id != FLOATING_ID && id < blockHeadId + types.size()) { | 126 | if (id != FLOATING_ID && id < blockHeadId + types.size()) { |
111 | 127 | ||
112 | - log.warn("requested nextId {} could potentially overlap" + | 128 | + log.warn("requested nextId {} could potentially overlap " + |
113 | "with existing registrations {}+{} ", | 129 | "with existing registrations {}+{} ", |
114 | id, blockHeadId, types.size()); | 130 | id, blockHeadId, types.size()); |
115 | } | 131 | } |
... | @@ -170,6 +186,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -170,6 +186,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
170 | * @return this | 186 | * @return this |
171 | */ | 187 | */ |
172 | public Builder register(final KryoNamespace ns) { | 188 | public Builder register(final KryoNamespace ns) { |
189 | + | ||
190 | + if (blocks.containsAll(ns.registeredBlocks)) { | ||
191 | + // Everything was already registered. | ||
192 | + log.debug("Ignoring {}, already registered.", ns); | ||
193 | + return this; | ||
194 | + } | ||
173 | for (RegistrationBlock block : ns.registeredBlocks) { | 195 | for (RegistrationBlock block : ns.registeredBlocks) { |
174 | this.register(block); | 196 | this.register(block); |
175 | } | 197 | } |
... | @@ -204,10 +226,14 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -204,10 +226,14 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
204 | * | 226 | * |
205 | * @param registeredTypes types to register | 227 | * @param registeredTypes types to register |
206 | * @param registrationRequired | 228 | * @param registrationRequired |
229 | + * @param friendlyName friendly name for the namespace | ||
207 | */ | 230 | */ |
208 | - private KryoNamespace(final List<RegistrationBlock> registeredTypes, boolean registrationRequired) { | 231 | + private KryoNamespace(final List<RegistrationBlock> registeredTypes, |
232 | + boolean registrationRequired, | ||
233 | + String friendlyName) { | ||
209 | this.registeredBlocks = ImmutableList.copyOf(registeredTypes); | 234 | this.registeredBlocks = ImmutableList.copyOf(registeredTypes); |
210 | this.registrationRequired = registrationRequired; | 235 | this.registrationRequired = registrationRequired; |
236 | + this.friendlyName = checkNotNull(friendlyName); | ||
211 | } | 237 | } |
212 | 238 | ||
213 | /** | 239 | /** |
... | @@ -373,6 +399,10 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -373,6 +399,10 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
373 | } | 399 | } |
374 | } | 400 | } |
375 | 401 | ||
402 | + private String friendlyName() { | ||
403 | + return friendlyName; | ||
404 | + } | ||
405 | + | ||
376 | /** | 406 | /** |
377 | * Creates a Kryo instance. | 407 | * Creates a Kryo instance. |
378 | * | 408 | * |
... | @@ -408,12 +438,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -408,12 +438,12 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
408 | * @param serializer Specific serializer to register or null to use default. | 438 | * @param serializer Specific serializer to register or null to use default. |
409 | * @param id type registration id to use | 439 | * @param id type registration id to use |
410 | */ | 440 | */ |
411 | - private static void register(Kryo kryo, Class<?> type, Serializer<?> serializer, int id) { | 441 | + private void register(Kryo kryo, Class<?> type, Serializer<?> serializer, int id) { |
412 | Registration existing = kryo.getRegistration(id); | 442 | Registration existing = kryo.getRegistration(id); |
413 | if (existing != null) { | 443 | if (existing != null) { |
414 | if (existing.getType() != type) { | 444 | if (existing.getType() != type) { |
415 | - log.error("Failed to register {} as {}, {} was already registered.", | 445 | + log.error("{}: Failed to register {} as {}, {} was already registered.", |
416 | - type, id, existing.getType()); | 446 | + friendlyName(), type, id, existing.getType()); |
417 | 447 | ||
418 | throw new IllegalStateException(String.format( | 448 | throw new IllegalStateException(String.format( |
419 | "Failed to register %s as %s, %s was already registered.", | 449 | "Failed to register %s as %s, %s was already registered.", |
... | @@ -430,8 +460,8 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -430,8 +460,8 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
430 | r = kryo.register(type, serializer, id); | 460 | r = kryo.register(type, serializer, id); |
431 | } | 461 | } |
432 | if (r.getId() != id) { | 462 | if (r.getId() != id) { |
433 | - log.debug("{} already registed as {}. Skipping {}.", | 463 | + log.warn("{}: {} already registed as {}. Skipping {}.", |
434 | - r.getType(), r.getId(), id); | 464 | + friendlyName(), r.getType(), r.getId(), id); |
435 | } | 465 | } |
436 | log.trace("{} registered as {}", r.getType(), r.getId()); | 466 | log.trace("{} registered as {}", r.getType(), r.getId()); |
437 | } | 467 | } |
... | @@ -453,6 +483,13 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -453,6 +483,13 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
453 | 483 | ||
454 | @Override | 484 | @Override |
455 | public String toString() { | 485 | public String toString() { |
486 | + if (friendlyName != NO_NAME) { | ||
487 | + return MoreObjects.toStringHelper(getClass()) | ||
488 | + .omitNullValues() | ||
489 | + .add("friendlyName", friendlyName) | ||
490 | + // omit lengthy detail, when there's a name | ||
491 | + .toString(); | ||
492 | + } | ||
456 | return MoreObjects.toStringHelper(getClass()) | 493 | return MoreObjects.toStringHelper(getClass()) |
457 | .add("registeredBlocks", registeredBlocks) | 494 | .add("registeredBlocks", registeredBlocks) |
458 | .toString(); | 495 | .toString(); |
... | @@ -482,5 +519,24 @@ public final class KryoNamespace implements KryoFactory, KryoPool { | ... | @@ -482,5 +519,24 @@ public final class KryoNamespace implements KryoFactory, KryoPool { |
482 | .add("types", types) | 519 | .add("types", types) |
483 | .toString(); | 520 | .toString(); |
484 | } | 521 | } |
522 | + | ||
523 | + @Override | ||
524 | + public int hashCode() { | ||
525 | + return types.hashCode(); | ||
526 | + } | ||
527 | + | ||
528 | + // Only the registered types are used for equality. | ||
529 | + @Override | ||
530 | + public boolean equals(Object obj) { | ||
531 | + if (this == obj) { | ||
532 | + return true; | ||
533 | + } | ||
534 | + | ||
535 | + if (obj instanceof RegistrationBlock) { | ||
536 | + RegistrationBlock that = (RegistrationBlock) obj; | ||
537 | + return Objects.equals(this.types, that.types); | ||
538 | + } | ||
539 | + return false; | ||
540 | + } | ||
485 | } | 541 | } |
486 | } | 542 | } | ... | ... |
-
Please register or login to post a comment