Skip to content

Commit 303752d

Browse files
committed
first phase at optimizing merging large mappings
bulk them the same level ones when traversing and introduce them
1 parent 6e597ff commit 303752d

File tree

6 files changed

+70
-60
lines changed

6 files changed

+70
-60
lines changed

src/main/java/org/elasticsearch/index/mapper/DocumentMapper.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -304,26 +304,21 @@ public DocumentMapper(String index, @Nullable Settings indexSettings, DocumentMa
304304
rootMapper(RoutingFieldMapper.class).markAsRequired();
305305
}
306306

307-
final List<FieldMapper> tempFieldMappers = newArrayList();
307+
FieldMapperListener.Aggregator fieldMappersAgg = new FieldMapperListener.Aggregator();
308308
for (RootMapper rootMapper : rootMappersOrdered) {
309309
if (rootMapper.includeInObject()) {
310310
rootObjectMapper.putMapper(rootMapper);
311311
} else {
312312
if (rootMapper instanceof FieldMapper) {
313-
tempFieldMappers.add((FieldMapper) rootMapper);
313+
fieldMappersAgg.fieldMappers.add((FieldMapper) rootMapper);
314314
}
315315
}
316316
}
317317

318318
// now traverse and get all the statically defined ones
319-
rootObjectMapper.traverse(new FieldMapperListener() {
320-
@Override
321-
public void fieldMapper(FieldMapper fieldMapper) {
322-
tempFieldMappers.add(fieldMapper);
323-
}
324-
});
319+
rootObjectMapper.traverse(fieldMappersAgg);
325320

326-
this.fieldMappers = new DocumentFieldMappers(this, tempFieldMappers);
321+
this.fieldMappers = new DocumentFieldMappers(this, fieldMappersAgg.fieldMappers);
327322

328323
final Map<String, ObjectMapper> objectMappers = Maps.newHashMap();
329324
rootObjectMapper.traverse(new ObjectMapperListener() {
@@ -541,12 +536,16 @@ public ParsedDocument parse(SourceToParse source, @Nullable ParseListener listen
541536
return doc;
542537
}
543538

544-
public void addFieldMapper(FieldMapper fieldMapper) {
539+
public void addFieldMappers(Collection<FieldMapper> fieldMappers) {
540+
addFieldMappers(fieldMappers.toArray(new FieldMapper[fieldMappers.size()]));
541+
}
542+
543+
public void addFieldMappers(FieldMapper... fieldMappers) {
545544
synchronized (mutex) {
546-
fieldMappers = fieldMappers.concat(this, fieldMapper);
545+
this.fieldMappers = this.fieldMappers.concat(this, fieldMappers);
547546
}
548547
for (FieldMapperListener listener : fieldMapperListeners) {
549-
listener.fieldMapper(fieldMapper);
548+
listener.fieldMappers(fieldMappers);
550549
}
551550
}
552551

@@ -566,15 +565,23 @@ public void traverse(FieldMapperListener listener) {
566565
rootObjectMapper.traverse(listener);
567566
}
568567

569-
public void addObjectMapper(ObjectMapper objectMapper) {
568+
public void addObjectMappers(Collection<ObjectMapper> objectMappers) {
569+
addObjectMappers(objectMappers.toArray(new ObjectMapper[objectMappers.size()]));
570+
}
571+
572+
public void addObjectMappers(ObjectMapper... objectMappers) {
570573
synchronized (mutex) {
571-
objectMappers = MapBuilder.newMapBuilder(objectMappers).put(objectMapper.fullPath(), objectMapper).immutableMap();
572-
if (objectMapper.nested().isNested()) {
573-
hasNestedObjects = true;
574+
MapBuilder<String, ObjectMapper> builder = MapBuilder.newMapBuilder(this.objectMappers);
575+
for (ObjectMapper objectMapper : objectMappers) {
576+
builder.put(objectMapper.fullPath(), objectMapper);
577+
if (objectMapper.nested().isNested()) {
578+
hasNestedObjects = true;
579+
}
574580
}
581+
this.objectMappers = builder.immutableMap();
575582
}
576583
for (ObjectMapperListener objectMapperListener : objectMapperListeners) {
577-
objectMapperListener.objectMapper(objectMapper);
584+
objectMapperListener.objectMappers(objectMappers);
578585
}
579586
}
580587

src/main/java/org/elasticsearch/index/mapper/FieldMapperListener.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@
2525
/**
2626
*
2727
*/
28-
public interface FieldMapperListener {
29-
30-
public static class Aggregator implements FieldMapperListener {
28+
public abstract class FieldMapperListener {
3129

30+
public static class Aggregator extends FieldMapperListener {
3231
public final List<FieldMapper> fieldMappers = new ArrayList<FieldMapper>();
3332

3433
@Override
@@ -37,5 +36,11 @@ public void fieldMapper(FieldMapper fieldMapper) {
3736
}
3837
}
3938

40-
void fieldMapper(FieldMapper fieldMapper);
39+
public abstract void fieldMapper(FieldMapper fieldMapper);
40+
41+
public void fieldMappers(FieldMapper... fieldMappers) {
42+
for (FieldMapper mapper : fieldMappers) {
43+
fieldMapper(mapper);
44+
}
45+
}
4146
}

src/main/java/org/elasticsearch/index/mapper/MapperService.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -938,17 +938,27 @@ protected TokenStreamComponents wrapComponents(String fieldName, TokenStreamComp
938938
}
939939
}
940940

941-
class InternalFieldMapperListener implements FieldMapperListener {
941+
class InternalFieldMapperListener extends FieldMapperListener {
942942
@Override
943943
public void fieldMapper(FieldMapper fieldMapper) {
944944
addFieldMappers(new FieldMapper[]{fieldMapper});
945945
}
946+
947+
@Override
948+
public void fieldMappers(FieldMapper... fieldMappers) {
949+
addFieldMappers(fieldMappers);
950+
}
946951
}
947952

948-
class InternalObjectMapperListener implements ObjectMapperListener {
953+
class InternalObjectMapperListener extends ObjectMapperListener {
949954
@Override
950955
public void objectMapper(ObjectMapper objectMapper) {
951956
addObjectMappers(new ObjectMapper[]{objectMapper});
952957
}
958+
959+
@Override
960+
public void objectMappers(ObjectMapper... objectMappers) {
961+
addObjectMappers(objectMappers);
962+
}
953963
}
954964
}

src/main/java/org/elasticsearch/index/mapper/ObjectMapperListener.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@
2727
/**
2828
*
2929
*/
30-
public interface ObjectMapperListener {
31-
32-
public static class Aggregator implements ObjectMapperListener {
30+
public abstract class ObjectMapperListener {
3331

32+
public static class Aggregator extends ObjectMapperListener {
3433
public final List<ObjectMapper> objectMappers = new ArrayList<ObjectMapper>();
3534

3635
@Override
@@ -39,5 +38,11 @@ public void objectMapper(ObjectMapper objectMapper) {
3938
}
4039
}
4140

42-
void objectMapper(ObjectMapper objectMapper);
41+
public abstract void objectMapper(ObjectMapper objectMapper);
42+
43+
public void objectMappers(ObjectMapper... objectMappers) {
44+
for (ObjectMapper objectMapper : objectMappers) {
45+
objectMapper(objectMapper);
46+
}
47+
}
4348
}

src/main/java/org/elasticsearch/index/mapper/multifield/MultiFieldMapper.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,7 @@ public void merge(Mapper mergeWith, MergeContext mergeContext) throws MergeMappi
266266
}
267267
}
268268
// call it outside of the mutex
269-
for (FieldMapper fieldMapper : mappersToAddToDocMapper) {
270-
mergeContext.docMapper().addFieldMapper(fieldMapper);
271-
}
269+
mergeContext.docMapper().addFieldMappers(mappersToAddToDocMapper);
272270
}
273271

274272
@Override

src/main/java/org/elasticsearch/index/mapper/object/ObjectMapper.java

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -539,19 +539,13 @@ private void serializeObject(final ParseContext context, String currentFieldName
539539
if (newMapper) {
540540
// we need to traverse in case we have a dynamic template and need to add field mappers
541541
// introduced by it
542-
objectMapper.traverse(new FieldMapperListener() {
543-
@Override
544-
public void fieldMapper(FieldMapper fieldMapper) {
545-
context.docMapper().addFieldMapper(fieldMapper);
546-
}
547-
});
548-
objectMapper.traverse(new ObjectMapperListener() {
549-
@Override
550-
public void objectMapper(ObjectMapper objectMapper) {
551-
context.docMapper().addObjectMapper(objectMapper);
552-
}
553-
});
542+
FieldMapperListener.Aggregator fieldMappersAgg = new FieldMapperListener.Aggregator();
543+
objectMapper.traverse(fieldMappersAgg);
544+
context.docMapper().addFieldMappers(fieldMappersAgg.fieldMappers);
554545

546+
ObjectMapperListener.Aggregator objectMappersAgg = new ObjectMapperListener.Aggregator();
547+
objectMapper.traverse(objectMappersAgg);
548+
context.docMapper().addObjectMappers(objectMappersAgg.objectMappers);
555549
}
556550
// now, parse it
557551
objectMapper.parse(context);
@@ -775,12 +769,9 @@ private void serializeValue(final ParseContext context, String currentFieldName,
775769
}
776770
}
777771
if (newMapper) {
778-
mapper.traverse(new FieldMapperListener() {
779-
@Override
780-
public void fieldMapper(FieldMapper fieldMapper) {
781-
context.docMapper().addFieldMapper(fieldMapper);
782-
}
783-
});
772+
FieldMapperListener.Aggregator fieldMappersAgg = new FieldMapperListener.Aggregator();
773+
mapper.traverse(fieldMappersAgg);
774+
context.docMapper().addFieldMappers(fieldMappersAgg.fieldMappers);
784775
}
785776
mapper.parse(context);
786777
}
@@ -823,20 +814,14 @@ public void merge(final Mapper mergeWith, final MergeContext mergeContext) throw
823814
}
824815
}
825816
// call this outside of the mutex
817+
FieldMapperListener.Aggregator fieldMappersAgg = new FieldMapperListener.Aggregator();
818+
ObjectMapperListener.Aggregator objectMappersAgg = new ObjectMapperListener.Aggregator();
826819
for (Mapper mapper : mappersToTraverse) {
827-
mapper.traverse(new FieldMapperListener() {
828-
@Override
829-
public void fieldMapper(FieldMapper fieldMapper) {
830-
mergeContext.docMapper().addFieldMapper(fieldMapper);
831-
}
832-
});
833-
mapper.traverse(new ObjectMapperListener() {
834-
@Override
835-
public void objectMapper(ObjectMapper objectMapper) {
836-
mergeContext.docMapper().addObjectMapper(objectMapper);
837-
}
838-
});
820+
mapper.traverse(fieldMappersAgg);
821+
mapper.traverse(objectMappersAgg);
839822
}
823+
mergeContext.docMapper().addFieldMappers(fieldMappersAgg.fieldMappers);
824+
mergeContext.docMapper().addObjectMappers(objectMappersAgg.objectMappers);
840825
}
841826

842827
protected void doMerge(ObjectMapper mergeWith, MergeContext mergeContext) {

0 commit comments

Comments
 (0)