From 255338111b92aa9f4e585955ee83dcbc20ed0f21 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Thu, 8 Oct 2015 09:24:22 +0200 Subject: [PATCH] test and fix TranslogStats - you wouldn't believe how hard it is to sum up two values --- .../index/translog/TranslogStats.java | 33 +++++++------ .../index/engine/ShadowEngineTests.java | 9 ++++ .../index/translog/TranslogTests.java | 48 +++++++++++++++---- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/translog/TranslogStats.java b/core/src/main/java/org/elasticsearch/index/translog/TranslogStats.java index e727a400c05..a4431b520cd 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/TranslogStats.java +++ b/core/src/main/java/org/elasticsearch/index/translog/TranslogStats.java @@ -18,11 +18,10 @@ */ package org.elasticsearch.index.translog; +import org.elasticsearch.action.support.ToXContentToBytes; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Streamable; -import org.elasticsearch.common.unit.ByteSizeValue; -import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilderString; @@ -31,17 +30,23 @@ import java.io.IOException; /** * */ -public class TranslogStats implements ToXContent, Streamable { +public class TranslogStats extends ToXContentToBytes implements Streamable { private long translogSizeInBytes; - private int estimatedNumberOfOperations; + private int numberOfOperations; public TranslogStats() { } - public TranslogStats(int estimatedNumberOfOperations, long translogSizeInBytes) { + public TranslogStats(int numberOfOperations, long translogSizeInBytes) { + if (numberOfOperations < 0) { + throw new IllegalArgumentException("numberOfOperations must be >= 0"); + } + if (translogSizeInBytes < 0) { + throw new IllegalArgumentException("translogSizeInBytes must be >= 0"); + } assert translogSizeInBytes >= 0 : "translogSizeInBytes must be >= 0, got [" + translogSizeInBytes + "]"; - this.estimatedNumberOfOperations = estimatedNumberOfOperations; + this.numberOfOperations = numberOfOperations; this.translogSizeInBytes = translogSizeInBytes; } @@ -50,22 +55,22 @@ public class TranslogStats implements ToXContent, Streamable { return; } - this.estimatedNumberOfOperations += translogStats.estimatedNumberOfOperations; - this.translogSizeInBytes = +translogStats.translogSizeInBytes; + this.numberOfOperations += translogStats.numberOfOperations; + this.translogSizeInBytes += translogStats.translogSizeInBytes; } - public ByteSizeValue translogSizeInBytes() { - return new ByteSizeValue(translogSizeInBytes); + public long getTranslogSizeInBytes() { + return translogSizeInBytes; } public long estimatedNumberOfOperations() { - return estimatedNumberOfOperations; + return numberOfOperations; } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(Fields.TRANSLOG); - builder.field(Fields.OPERATIONS, estimatedNumberOfOperations); + builder.field(Fields.OPERATIONS, numberOfOperations); builder.byteSizeField(Fields.SIZE_IN_BYTES, Fields.SIZE, translogSizeInBytes); builder.endObject(); return builder; @@ -80,13 +85,13 @@ public class TranslogStats implements ToXContent, Streamable { @Override public void readFrom(StreamInput in) throws IOException { - estimatedNumberOfOperations = in.readVInt(); + numberOfOperations = in.readVInt(); translogSizeInBytes = in.readVLong(); } @Override public void writeTo(StreamOutput out) throws IOException { - out.writeVInt(estimatedNumberOfOperations); + out.writeVInt(numberOfOperations); out.writeVLong(translogSizeInBytes); } } diff --git a/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java b/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java index 4c132f34417..2c6ee40b86e 100644 --- a/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java +++ b/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java @@ -965,4 +965,13 @@ public class ShadowEngineTests extends ESTestCase { // (shadow engine is already shut down in the try-with-resources) IOUtils.close(srStore, pEngine, pStore); } + + public void testNoTranslog() { + try { + replicaEngine.getTranslog(); + fail("shadow engine has no translog"); + } catch (UnsupportedOperationException ex) { + // all good + } + } } diff --git a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java index e345e208c7d..5a25f65b7b7 100644 --- a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java +++ b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java @@ -34,6 +34,7 @@ import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.util.concurrent.AbstractRunnable; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; @@ -276,32 +277,63 @@ public class TranslogTests extends ESTestCase { final long firstOperationPosition = translog.getFirstOperationPosition(); TranslogStats stats = stats(); assertThat(stats.estimatedNumberOfOperations(), equalTo(0l)); - long lastSize = stats.translogSizeInBytes().bytes(); + long lastSize = stats.getTranslogSizeInBytes(); assertThat((int) firstOperationPosition, greaterThan(CodecUtil.headerLength(TranslogWriter.TRANSLOG_CODEC))); assertThat(lastSize, equalTo(firstOperationPosition)); - + TranslogStats total = new TranslogStats(); translog.add(new Translog.Index("test", "1", new byte[]{1})); stats = stats(); + total.add(stats); assertThat(stats.estimatedNumberOfOperations(), equalTo(1l)); - assertThat(stats.translogSizeInBytes().bytes(), greaterThan(lastSize)); - lastSize = stats.translogSizeInBytes().bytes(); + assertThat(stats.getTranslogSizeInBytes(), greaterThan(lastSize)); + lastSize = stats.getTranslogSizeInBytes(); translog.add(new Translog.Delete(newUid("2"))); stats = stats(); + total.add(stats); assertThat(stats.estimatedNumberOfOperations(), equalTo(2l)); - assertThat(stats.translogSizeInBytes().bytes(), greaterThan(lastSize)); - lastSize = stats.translogSizeInBytes().bytes(); + assertThat(stats.getTranslogSizeInBytes(), greaterThan(lastSize)); + lastSize = stats.getTranslogSizeInBytes(); translog.add(new Translog.Delete(newUid("3"))); translog.prepareCommit(); stats = stats(); + total.add(stats); assertThat(stats.estimatedNumberOfOperations(), equalTo(3l)); - assertThat(stats.translogSizeInBytes().bytes(), greaterThan(lastSize)); + assertThat(stats.getTranslogSizeInBytes(), greaterThan(lastSize)); translog.commit(); stats = stats(); + total.add(stats); assertThat(stats.estimatedNumberOfOperations(), equalTo(0l)); - assertThat(stats.translogSizeInBytes().bytes(), equalTo(firstOperationPosition)); + assertThat(stats.getTranslogSizeInBytes(), equalTo(firstOperationPosition)); + assertEquals(6, total.estimatedNumberOfOperations()); + assertEquals(431, total.getTranslogSizeInBytes()); + + BytesStreamOutput out = new BytesStreamOutput(); + total.writeTo(out); + TranslogStats copy = new TranslogStats(); + copy.readFrom(StreamInput.wrap(out.bytes())); + + assertEquals(6, copy.estimatedNumberOfOperations()); + assertEquals(431, copy.getTranslogSizeInBytes()); + assertEquals("\"translog\"{\n" + + " \"operations\" : 6,\n" + + " \"size_in_bytes\" : 431\n" + + "}", copy.toString().trim()); + + try { + new TranslogStats(1, -1); + fail("must be positive"); + } catch (IllegalArgumentException ex) { + //all well + } + try { + new TranslogStats(-1, 1); + fail("must be positive"); + } catch (IllegalArgumentException ex) { + //all well + } } @Test