Make ByteSizeUnit implements Writeable (#20557)
This commit makes ByteSizeUnit implement Writeable.
This commit is contained in:
parent
0573e03aa1
commit
ab2e067ef5
|
@ -19,16 +19,20 @@
|
||||||
|
|
||||||
package org.elasticsearch.common.unit;
|
package org.elasticsearch.common.unit;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
import org.elasticsearch.common.io.stream.Writeable;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A <tt>SizeUnit</tt> represents size at a given unit of
|
* A <tt>SizeUnit</tt> represents size at a given unit of
|
||||||
* granularity and provides utility methods to convert across units.
|
* granularity and provides utility methods to convert across units.
|
||||||
* A <tt>SizeUnit</tt> does not maintain size information, but only
|
* A <tt>SizeUnit</tt> does not maintain size information, but only
|
||||||
* helps organize and use size representations that may be maintained
|
* helps organize and use size representations that may be maintained
|
||||||
* separately across various contexts.
|
* separately across various contexts.
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public enum ByteSizeUnit {
|
public enum ByteSizeUnit implements Writeable {
|
||||||
BYTES {
|
BYTES {
|
||||||
@Override
|
@Override
|
||||||
public long toBytes(long size) {
|
public long toBytes(long size) {
|
||||||
|
@ -225,6 +229,13 @@ public enum ByteSizeUnit {
|
||||||
|
|
||||||
static final long MAX = Long.MAX_VALUE;
|
static final long MAX = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
public static ByteSizeUnit fromId(int id) {
|
||||||
|
if (id < 0 || id >= values().length) {
|
||||||
|
throw new IllegalArgumentException("No byte size unit found for id [" + id + "]");
|
||||||
|
}
|
||||||
|
return values()[id];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scale d by m, checking for overflow.
|
* Scale d by m, checking for overflow.
|
||||||
* This has a short name to make above code more readable.
|
* This has a short name to make above code more readable.
|
||||||
|
@ -235,7 +246,6 @@ public enum ByteSizeUnit {
|
||||||
return d * m;
|
return d * m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract long toBytes(long size);
|
public abstract long toBytes(long size);
|
||||||
|
|
||||||
public abstract long toKB(long size);
|
public abstract long toKB(long size);
|
||||||
|
@ -247,4 +257,16 @@ public enum ByteSizeUnit {
|
||||||
public abstract long toTB(long size);
|
public abstract long toTB(long size);
|
||||||
|
|
||||||
public abstract long toPB(long size);
|
public abstract long toPB(long size);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeVInt(this.ordinal());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a {@link ByteSizeUnit} from a given {@link StreamInput}
|
||||||
|
*/
|
||||||
|
public static ByteSizeUnit readFrom(StreamInput in) throws IOException {
|
||||||
|
return ByteSizeUnit.fromId(in.readVInt());
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -32,11 +32,11 @@ import java.util.Objects;
|
||||||
public class ByteSizeValue implements Writeable {
|
public class ByteSizeValue implements Writeable {
|
||||||
|
|
||||||
private final long size;
|
private final long size;
|
||||||
private final ByteSizeUnit sizeUnit;
|
private final ByteSizeUnit unit;
|
||||||
|
|
||||||
public ByteSizeValue(StreamInput in) throws IOException {
|
public ByteSizeValue(StreamInput in) throws IOException {
|
||||||
size = in.readVLong();
|
size = in.readVLong();
|
||||||
sizeUnit = ByteSizeUnit.BYTES;
|
unit = ByteSizeUnit.BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -48,9 +48,9 @@ public class ByteSizeValue implements Writeable {
|
||||||
this(bytes, ByteSizeUnit.BYTES);
|
this(bytes, ByteSizeUnit.BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ByteSizeValue(long size, ByteSizeUnit sizeUnit) {
|
public ByteSizeValue(long size, ByteSizeUnit unit) {
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.sizeUnit = sizeUnit;
|
this.unit = unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int bytesAsInt() {
|
public int bytesAsInt() {
|
||||||
|
@ -62,27 +62,27 @@ public class ByteSizeValue implements Writeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getBytes() {
|
public long getBytes() {
|
||||||
return sizeUnit.toBytes(size);
|
return unit.toBytes(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getKb() {
|
public long getKb() {
|
||||||
return sizeUnit.toKB(size);
|
return unit.toKB(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getMb() {
|
public long getMb() {
|
||||||
return sizeUnit.toMB(size);
|
return unit.toMB(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getGb() {
|
public long getGb() {
|
||||||
return sizeUnit.toGB(size);
|
return unit.toGB(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTb() {
|
public long getTb() {
|
||||||
return sizeUnit.toTB(size);
|
return unit.toTB(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPb() {
|
public long getPb() {
|
||||||
return sizeUnit.toPB(size);
|
return unit.toPB(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getKbFrac() {
|
public double getKbFrac() {
|
||||||
|
@ -199,7 +199,7 @@ public class ByteSizeValue implements Writeable {
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = Long.hashCode(size);
|
int result = Long.hashCode(size);
|
||||||
result = 31 * result + (sizeUnit != null ? sizeUnit.hashCode() : 0);
|
result = 31 * result + (unit != null ? unit.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,20 +19,23 @@
|
||||||
|
|
||||||
package org.elasticsearch.common.unit;
|
package org.elasticsearch.common.unit;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.io.stream.BytesStreamOutput;
|
||||||
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.BYTES;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.BYTES;
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.GB;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.GB;
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.KB;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.KB;
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.MB;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.MB;
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.PB;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.PB;
|
||||||
import static org.elasticsearch.common.unit.ByteSizeUnit.TB;
|
import static org.elasticsearch.common.unit.ByteSizeUnit.TB;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ByteSizeUnitTests extends ESTestCase {
|
public class ByteSizeUnitTests extends ESTestCase {
|
||||||
|
|
||||||
public void testBytes() {
|
public void testBytes() {
|
||||||
assertThat(BYTES.toBytes(1), equalTo(1L));
|
assertThat(BYTES.toBytes(1), equalTo(1L));
|
||||||
assertThat(BYTES.toKB(1024), equalTo(1L));
|
assertThat(BYTES.toKB(1024), equalTo(1L));
|
||||||
|
@ -77,4 +80,23 @@ public class ByteSizeUnitTests extends ESTestCase {
|
||||||
assertThat(PB.toTB(1), equalTo(1024L));
|
assertThat(PB.toTB(1), equalTo(1024L));
|
||||||
assertThat(PB.toPB(1), equalTo(1L));
|
assertThat(PB.toPB(1), equalTo(1L));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testSerialization() throws IOException {
|
||||||
|
for (ByteSizeUnit unit : ByteSizeUnit.values()) {
|
||||||
|
try (BytesStreamOutput out = new BytesStreamOutput()) {
|
||||||
|
unit.writeTo(out);
|
||||||
|
|
||||||
|
try (StreamInput in = out.bytes().streamInput()) {
|
||||||
|
ByteSizeUnit deserialized = ByteSizeUnit.readFrom(in);
|
||||||
|
assertEquals(unit, deserialized);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFromUnknownId() throws IOException {
|
||||||
|
final byte randomId = (byte) randomIntBetween(ByteSizeUnit.values().length + 1, 100);
|
||||||
|
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> ByteSizeUnit.fromId(randomId));
|
||||||
|
assertThat(e.getMessage(), containsString("No byte size unit found for id [" + String.valueOf(randomId) + "]"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue