X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Futils%2FImmutableUnsignedLongSet.java;h=39348716f3e696f972b823547cdb1df031834a05;hb=7526de25301597d670657400b541b10455311fbe;hp=e6c900b0f85834e6f6a8f5c40eeed374b78805a6;hpb=e9efe27538adb5ae575f77fda90f147d46341801;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ImmutableUnsignedLongSet.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ImmutableUnsignedLongSet.java index e6c900b0f8..39348716f3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ImmutableUnsignedLongSet.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ImmutableUnsignedLongSet.java @@ -8,9 +8,12 @@ package org.opendaylight.controller.cluster.datastore.utils; import com.google.common.annotations.Beta; +import com.google.common.collect.ImmutableSortedSet; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import java.util.ArrayList; +import java.util.NavigableSet; import java.util.TreeSet; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.Immutable; @@ -18,14 +21,24 @@ import org.opendaylight.yangtools.concepts.WritableObject; @Beta public final class ImmutableUnsignedLongSet extends UnsignedLongSet implements Immutable, WritableObject { - private static final @NonNull ImmutableUnsignedLongSet EMPTY = new ImmutableUnsignedLongSet(new TreeSet<>()); + // Do not all + private static final int ARRAY_MAX_ELEMENTS = 4096; - private ImmutableUnsignedLongSet(final TreeSet ranges) { + private static final @NonNull ImmutableUnsignedLongSet EMPTY = + new ImmutableUnsignedLongSet(ImmutableSortedSet.of()); + + private ImmutableUnsignedLongSet(final NavigableSet ranges) { super(ranges); } - static @NonNull ImmutableUnsignedLongSet of(final TreeSet ranges) { - return ranges.isEmpty() ? EMPTY : new ImmutableUnsignedLongSet(ranges); + static @NonNull ImmutableUnsignedLongSet copyOf(final MutableUnsignedLongSet mutable) { + if (mutable.isEmpty()) { + return of(); + } + if (mutable.rangeSize() <= ARRAY_MAX_ELEMENTS) { + return new ImmutableUnsignedLongSet(ImmutableSortedSet.copyOfSorted(mutable.trustedRanges())); + } + return new ImmutableUnsignedLongSet(new TreeSet<>(mutable.trustedRanges())); } public static @NonNull ImmutableUnsignedLongSet of() { @@ -46,22 +59,32 @@ public final class ImmutableUnsignedLongSet extends UnsignedLongSet implements I return EMPTY; } - final var ranges = new TreeSet(); - for (int i = 0; i < size; ++i) { - ranges.add(Entry.readUnsigned(in)); + final NavigableSet ranges; + if (size <= ARRAY_MAX_ELEMENTS) { + final var entries = new ArrayList(size); + for (int i = 0; i < size; ++i) { + entries.add(Entry.readUnsigned(in)); + } + ranges = ImmutableSortedSet.copyOf(entries); + } else { + ranges = new TreeSet<>(); + for (int i = 0; i < size; ++i) { + ranges.add(Entry.readUnsigned(in)); + } } return new ImmutableUnsignedLongSet(ranges); } @Override public void writeTo(final DataOutput out) throws IOException { - out.writeInt(size()); + out.writeInt(rangeSize()); writeRanges(out); } public void writeRangesTo(final @NonNull DataOutput out, final int size) throws IOException { - if (size != size()) { - throw new IOException("Mismatched size: expected " + size() + ", got " + size); + final int rangeSize = rangeSize(); + if (size != rangeSize) { + throw new IOException("Mismatched size: expected " + rangeSize + ", got " + size); } writeRanges(out); }