Segments API: Add version & compound for each segment

closes #2823
This commit is contained in:
Shay Banon 2013-03-28 15:34:38 +01:00
parent 473473e867
commit 1fc37e5954
7 changed files with 89 additions and 76 deletions

View File

@ -122,14 +122,20 @@ public class IndicesSegmentResponse extends BroadcastOperationResponse implement
builder.startObject(Fields.SEGMENTS);
for (Segment segment : shardSegments) {
builder.startObject(segment.name());
builder.field(Fields.GENERATION, segment.generation());
builder.field(Fields.NUM_DOCS, segment.numDocs());
builder.field(Fields.DELETED_DOCS, segment.deletedDocs());
builder.field(Fields.SIZE, segment.size().toString());
builder.field(Fields.SIZE_IN_BYTES, segment.sizeInBytes());
builder.field(Fields.COMMITTED, segment.committed());
builder.field(Fields.SEARCH, segment.search());
builder.startObject(segment.getName());
builder.field(Fields.GENERATION, segment.getGeneration());
builder.field(Fields.NUM_DOCS, segment.getNumDocs());
builder.field(Fields.DELETED_DOCS, segment.getDeletedDocs());
builder.field(Fields.SIZE, segment.getSize().toString());
builder.field(Fields.SIZE_IN_BYTES, segment.getSizeInBytes());
builder.field(Fields.COMMITTED, segment.isCommitted());
builder.field(Fields.SEARCH, segment.isSearch());
if (segment.getVersion() != null) {
builder.field(Fields.VERSION, segment.getVersion());
}
if (segment.isCompound() != null) {
builder.field(Fields.COMPOUND, segment.isCompound());
}
builder.endObject();
}
builder.endObject();
@ -166,5 +172,7 @@ public class IndicesSegmentResponse extends BroadcastOperationResponse implement
static final XContentBuilderString SIZE_IN_BYTES = new XContentBuilderString("size_in_bytes");
static final XContentBuilderString COMMITTED = new XContentBuilderString("committed");
static final XContentBuilderString SEARCH = new XContentBuilderString("search");
static final XContentBuilderString VERSION = new XContentBuilderString("version");
static final XContentBuilderString COMPOUND = new XContentBuilderString("compound");
}
}

View File

@ -64,7 +64,7 @@ public class ShardSegments extends BroadcastShardOperationResponse implements It
public int getNumberOfCommitted() {
int count = 0;
for (Segment segment : segments) {
if (segment.committed()) {
if (segment.isCommitted()) {
count++;
}
}
@ -74,7 +74,7 @@ public class ShardSegments extends BroadcastShardOperationResponse implements It
public int getNumberOfSearch() {
int count = 0;
for (Segment segment : segments) {
if (segment.search()) {
if (segment.isSearch()) {
count++;
}
}

View File

@ -252,6 +252,17 @@ public abstract class StreamInput extends InputStream {
return readByte() != 0;
}
@Nullable
public final Boolean readOptionalBoolean() throws IOException {
byte val = readByte();
if (val == 2) {
return null;
}
if (val == 1) {
return true;
}
return false;
}
/**
* Resets the stream.

View File

@ -236,6 +236,7 @@ public abstract class StreamOutput extends OutputStream {
private static byte ZERO = 0;
private static byte ONE = 1;
private static byte TWO = 2;
/**
* Writes a boolean.
@ -244,6 +245,14 @@ public abstract class StreamOutput extends OutputStream {
writeByte(b ? ONE : ZERO);
}
public void writeOptionalBoolean(@Nullable Boolean b) throws IOException {
if (b == null) {
writeByte(TWO);
} else {
writeByte(b ? ONE : ZERO);
}
}
/**
* Forces any buffered output to be written.
*/

View File

@ -19,6 +19,7 @@
package org.elasticsearch.index.engine;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Streamable;
@ -35,6 +36,8 @@ public class Segment implements Streamable {
public long sizeInBytes = -1;
public int docCount = -1;
public int delDocCount = -1;
public String version = null;
public Boolean compound = null;
Segment() {
}
@ -44,68 +47,45 @@ public class Segment implements Streamable {
this.generation = Long.parseLong(name.substring(1), Character.MAX_RADIX);
}
public String name() {
return this.name;
}
public String getName() {
return name();
}
public long generation() {
return this.generation;
return this.name;
}
public long getGeneration() {
return this.generation;
}
public boolean committed() {
return this.committed;
}
public boolean isCommitted() {
return this.committed;
}
public boolean search() {
return this.search;
}
public boolean isSearch() {
return this.search;
}
public int numDocs() {
return this.docCount;
}
public int getNumDocs() {
return this.docCount;
}
public int deletedDocs() {
return this.delDocCount;
}
public int getDeletedDocs() {
return this.delDocCount;
}
public ByteSizeValue size() {
public ByteSizeValue getSize() {
return new ByteSizeValue(sizeInBytes);
}
public ByteSizeValue getSize() {
return size();
}
public long sizeInBytes() {
return sizeInBytes;
}
public long getSizeInBytes() {
return sizeInBytes();
return this.sizeInBytes;
}
public String getVersion() {
return version;
}
@Nullable
public Boolean isCompound() {
return compound;
}
@Override
@ -140,6 +120,8 @@ public class Segment implements Streamable {
docCount = in.readInt();
delDocCount = in.readInt();
sizeInBytes = in.readLong();
version = in.readOptionalString();
compound = in.readOptionalBoolean();
}
@Override
@ -150,5 +132,7 @@ public class Segment implements Streamable {
out.writeInt(docCount);
out.writeInt(delDocCount);
out.writeLong(sizeInBytes);
out.writeOptionalString(version);
out.writeOptionalBoolean(compound);
}
}

View File

@ -21,13 +21,11 @@ package org.elasticsearch.index.engine.robin;
import com.google.common.collect.Lists;
import org.apache.lucene.index.*;
import org.apache.lucene.index.SegmentInfos.FindSegmentsFile;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.store.AlreadyClosedException;
import org.apache.lucene.store.Directory;
import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.ElasticSearchIllegalStateException;
import org.elasticsearch.cluster.routing.operation.hash.djb.DjbHashFunction;
@ -65,7 +63,6 @@ import org.elasticsearch.indices.warmer.IndicesWarmer;
import org.elasticsearch.indices.warmer.InternalIndicesWarmer;
import org.elasticsearch.threadpool.ThreadPool;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentMap;
@ -1176,6 +1173,8 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
segment.search = true;
segment.docCount = reader.reader().numDocs();
segment.delDocCount = reader.reader().numDeletedDocs();
segment.version = info.info.getVersion();
segment.compound = info.info.getUseCompoundFile();
try {
segment.sizeInBytes = info.sizeInBytes();
} catch (IOException e) {
@ -1198,6 +1197,8 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
segment.committed = true;
segment.docCount = info.info.getDocCount();
segment.delDocCount = info.getDelCount();
segment.version = info.info.getVersion();
segment.compound = info.info.getUseCompoundFile();
try {
segment.sizeInBytes = info.sizeInBytes();
} catch (IOException e) {
@ -1214,7 +1215,7 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
Arrays.sort(segmentsArr, new Comparator<Segment>() {
@Override
public int compare(Segment o1, Segment o2) {
return (int) (o1.generation() - o2.generation());
return (int) (o1.getGeneration() - o2.getGeneration());
}
});
@ -1341,7 +1342,7 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
}
return indexWriter;
}
public static final String INDEX_TERM_INDEX_INTERVAL = "index.term_index_interval";
public static final String INDEX_TERM_INDEX_DIVISOR = "index.term_index_divisor";
public static final String INDEX_INDEX_CONCURRENCY = "index.index_concurrency";

View File

@ -185,19 +185,19 @@ public abstract class AbstractSimpleEngineTests {
segments = engine.segments();
assertThat(segments.size(), equalTo(1));
assertThat(segments.get(0).committed(), equalTo(false));
assertThat(segments.get(0).search(), equalTo(true));
assertThat(segments.get(0).numDocs(), equalTo(2));
assertThat(segments.get(0).deletedDocs(), equalTo(0));
assertThat(segments.get(0).isCommitted(), equalTo(false));
assertThat(segments.get(0).isSearch(), equalTo(true));
assertThat(segments.get(0).getNumDocs(), equalTo(2));
assertThat(segments.get(0).getDeletedDocs(), equalTo(0));
engine.flush(new Engine.Flush());
segments = engine.segments();
assertThat(segments.size(), equalTo(1));
assertThat(segments.get(0).committed(), equalTo(true));
assertThat(segments.get(0).search(), equalTo(true));
assertThat(segments.get(0).numDocs(), equalTo(2));
assertThat(segments.get(0).deletedDocs(), equalTo(0));
assertThat(segments.get(0).isCommitted(), equalTo(true));
assertThat(segments.get(0).isSearch(), equalTo(true));
assertThat(segments.get(0).getNumDocs(), equalTo(2));
assertThat(segments.get(0).getDeletedDocs(), equalTo(0));
ParsedDocument doc3 = testParsedDocument("3", "3", "test", null, -1, -1, testDocumentWithTextField(), Lucene.STANDARD_ANALYZER, B_3, false);
@ -206,32 +206,32 @@ public abstract class AbstractSimpleEngineTests {
segments = engine.segments();
assertThat(segments.size(), equalTo(2));
assertThat(segments.get(0).generation() < segments.get(1).generation(), equalTo(true));
assertThat(segments.get(0).committed(), equalTo(true));
assertThat(segments.get(0).search(), equalTo(true));
assertThat(segments.get(0).numDocs(), equalTo(2));
assertThat(segments.get(0).deletedDocs(), equalTo(0));
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
assertThat(segments.get(0).isCommitted(), equalTo(true));
assertThat(segments.get(0).isSearch(), equalTo(true));
assertThat(segments.get(0).getNumDocs(), equalTo(2));
assertThat(segments.get(0).getDeletedDocs(), equalTo(0));
assertThat(segments.get(1).committed(), equalTo(false));
assertThat(segments.get(1).search(), equalTo(true));
assertThat(segments.get(1).numDocs(), equalTo(1));
assertThat(segments.get(1).deletedDocs(), equalTo(0));
assertThat(segments.get(1).isCommitted(), equalTo(false));
assertThat(segments.get(1).isSearch(), equalTo(true));
assertThat(segments.get(1).getNumDocs(), equalTo(1));
assertThat(segments.get(1).getDeletedDocs(), equalTo(0));
engine.delete(new Engine.Delete("test", "1", newUid("1")));
engine.refresh(new Engine.Refresh(true));
segments = engine.segments();
assertThat(segments.size(), equalTo(2));
assertThat(segments.get(0).generation() < segments.get(1).generation(), equalTo(true));
assertThat(segments.get(0).committed(), equalTo(true));
assertThat(segments.get(0).search(), equalTo(true));
assertThat(segments.get(0).numDocs(), equalTo(1));
assertThat(segments.get(0).deletedDocs(), equalTo(1));
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
assertThat(segments.get(0).isCommitted(), equalTo(true));
assertThat(segments.get(0).isSearch(), equalTo(true));
assertThat(segments.get(0).getNumDocs(), equalTo(1));
assertThat(segments.get(0).getDeletedDocs(), equalTo(1));
assertThat(segments.get(1).committed(), equalTo(false));
assertThat(segments.get(1).search(), equalTo(true));
assertThat(segments.get(1).numDocs(), equalTo(1));
assertThat(segments.get(1).deletedDocs(), equalTo(0));
assertThat(segments.get(1).isCommitted(), equalTo(false));
assertThat(segments.get(1).isSearch(), equalTo(true));
assertThat(segments.get(1).getNumDocs(), equalTo(1));
assertThat(segments.get(1).getDeletedDocs(), equalTo(0));
}
@Test