23
23
import com .carrotsearch .hppc .cursors .IntObjectCursor ;
24
24
import com .carrotsearch .hppc .cursors .ObjectCursor ;
25
25
import com .carrotsearch .hppc .cursors .ObjectObjectCursor ;
26
+ import org .elasticsearch .Assertions ;
26
27
import org .elasticsearch .Version ;
27
28
import org .elasticsearch .action .admin .indices .rollover .RolloverInfo ;
28
29
import org .elasticsearch .action .support .ActiveShardCount ;
@@ -291,6 +292,7 @@ public Iterator<Setting<Integer>> settings() {
291
292
292
293
public static final String KEY_IN_SYNC_ALLOCATIONS = "in_sync_allocations" ;
293
294
static final String KEY_VERSION = "version" ;
295
+ static final String KEY_MAPPING_VERSION = "mapping_version" ;
294
296
static final String KEY_ROUTING_NUM_SHARDS = "routing_num_shards" ;
295
297
static final String KEY_SETTINGS = "settings" ;
296
298
static final String KEY_STATE = "state" ;
@@ -309,6 +311,9 @@ public Iterator<Setting<Integer>> settings() {
309
311
310
312
private final Index index ;
311
313
private final long version ;
314
+
315
+ private final long mappingVersion ;
316
+
312
317
private final long [] primaryTerms ;
313
318
314
319
private final State state ;
@@ -336,7 +341,7 @@ public Iterator<Setting<Integer>> settings() {
336
341
private final ActiveShardCount waitForActiveShards ;
337
342
private final ImmutableOpenMap <String , RolloverInfo > rolloverInfos ;
338
343
339
- private IndexMetaData (Index index , long version , long [] primaryTerms , State state , int numberOfShards , int numberOfReplicas , Settings settings ,
344
+ private IndexMetaData (Index index , long version , long mappingVersion , long [] primaryTerms , State state , int numberOfShards , int numberOfReplicas , Settings settings ,
340
345
ImmutableOpenMap <String , MappingMetaData > mappings , ImmutableOpenMap <String , AliasMetaData > aliases ,
341
346
ImmutableOpenMap <String , Custom > customs , ImmutableOpenIntMap <Set <String >> inSyncAllocationIds ,
342
347
DiscoveryNodeFilters requireFilters , DiscoveryNodeFilters initialRecoveryFilters , DiscoveryNodeFilters includeFilters , DiscoveryNodeFilters excludeFilters ,
@@ -345,6 +350,8 @@ private IndexMetaData(Index index, long version, long[] primaryTerms, State stat
345
350
346
351
this .index = index ;
347
352
this .version = version ;
353
+ assert mappingVersion >= 0 : mappingVersion ;
354
+ this .mappingVersion = mappingVersion ;
348
355
this .primaryTerms = primaryTerms ;
349
356
assert primaryTerms .length == numberOfShards ;
350
357
this .state = state ;
@@ -394,6 +401,9 @@ public long getVersion() {
394
401
return this .version ;
395
402
}
396
403
404
+ public long getMappingVersion () {
405
+ return mappingVersion ;
406
+ }
397
407
398
408
/**
399
409
* The term of the current selected primary. This is a non-negative number incremented when
@@ -644,6 +654,7 @@ private static class IndexMetaDataDiff implements Diff<IndexMetaData> {
644
654
private final String index ;
645
655
private final int routingNumShards ;
646
656
private final long version ;
657
+ private final long mappingVersion ;
647
658
private final long [] primaryTerms ;
648
659
private final State state ;
649
660
private final Settings settings ;
@@ -656,6 +667,7 @@ private static class IndexMetaDataDiff implements Diff<IndexMetaData> {
656
667
IndexMetaDataDiff (IndexMetaData before , IndexMetaData after ) {
657
668
index = after .index .getName ();
658
669
version = after .version ;
670
+ mappingVersion = after .mappingVersion ;
659
671
routingNumShards = after .routingNumShards ;
660
672
state = after .state ;
661
673
settings = after .settings ;
@@ -672,6 +684,11 @@ private static class IndexMetaDataDiff implements Diff<IndexMetaData> {
672
684
index = in .readString ();
673
685
routingNumShards = in .readInt ();
674
686
version = in .readLong ();
687
+ if (in .getVersion ().onOrAfter (Version .V_6_5_0 )) {
688
+ mappingVersion = in .readVLong ();
689
+ } else {
690
+ mappingVersion = 1 ;
691
+ }
675
692
state = State .fromId (in .readByte ());
676
693
settings = Settings .readSettingsFromStream (in );
677
694
primaryTerms = in .readVLongArray ();
@@ -708,6 +725,9 @@ public void writeTo(StreamOutput out) throws IOException {
708
725
out .writeString (index );
709
726
out .writeInt (routingNumShards );
710
727
out .writeLong (version );
728
+ if (out .getVersion ().onOrAfter (Version .V_6_5_0 )) {
729
+ out .writeVLong (mappingVersion );
730
+ }
711
731
out .writeByte (state .id );
712
732
Settings .writeSettingsToStream (settings , out );
713
733
out .writeVLongArray (primaryTerms );
@@ -724,6 +744,7 @@ public void writeTo(StreamOutput out) throws IOException {
724
744
public IndexMetaData apply (IndexMetaData part ) {
725
745
Builder builder = builder (index );
726
746
builder .version (version );
747
+ builder .mappingVersion (mappingVersion );
727
748
builder .setRoutingNumShards (routingNumShards );
728
749
builder .state (state );
729
750
builder .settings (settings );
@@ -740,6 +761,11 @@ public IndexMetaData apply(IndexMetaData part) {
740
761
public static IndexMetaData readFrom (StreamInput in ) throws IOException {
741
762
Builder builder = new Builder (in .readString ());
742
763
builder .version (in .readLong ());
764
+ if (in .getVersion ().onOrAfter (Version .V_6_5_0 )) {
765
+ builder .mappingVersion (in .readVLong ());
766
+ } else {
767
+ builder .mappingVersion (1 );
768
+ }
743
769
builder .setRoutingNumShards (in .readInt ());
744
770
builder .state (State .fromId (in .readByte ()));
745
771
builder .settings (readSettingsFromStream (in ));
@@ -779,6 +805,9 @@ public static IndexMetaData readFrom(StreamInput in) throws IOException {
779
805
public void writeTo (StreamOutput out ) throws IOException {
780
806
out .writeString (index .getName ()); // uuid will come as part of settings
781
807
out .writeLong (version );
808
+ if (out .getVersion ().onOrAfter (Version .V_6_5_0 )) {
809
+ out .writeVLong (mappingVersion );
810
+ }
782
811
out .writeInt (routingNumShards );
783
812
out .writeByte (state .id ());
784
813
writeSettingsToStream (settings , out );
@@ -822,6 +851,7 @@ public static class Builder {
822
851
private String index ;
823
852
private State state = State .OPEN ;
824
853
private long version = 1 ;
854
+ private long mappingVersion = 1 ;
825
855
private long [] primaryTerms = null ;
826
856
private Settings settings = Settings .Builder .EMPTY_SETTINGS ;
827
857
private final ImmutableOpenMap .Builder <String , MappingMetaData > mappings ;
@@ -844,6 +874,7 @@ public Builder(IndexMetaData indexMetaData) {
844
874
this .index = indexMetaData .getIndex ().getName ();
845
875
this .state = indexMetaData .state ;
846
876
this .version = indexMetaData .version ;
877
+ this .mappingVersion = indexMetaData .mappingVersion ;
847
878
this .settings = indexMetaData .getSettings ();
848
879
this .primaryTerms = indexMetaData .primaryTerms .clone ();
849
880
this .mappings = ImmutableOpenMap .builder (indexMetaData .mappings );
@@ -1010,6 +1041,15 @@ public Builder version(long version) {
1010
1041
return this ;
1011
1042
}
1012
1043
1044
+ public long mappingVersion () {
1045
+ return mappingVersion ;
1046
+ }
1047
+
1048
+ public Builder mappingVersion (final long mappingVersion ) {
1049
+ this .mappingVersion = mappingVersion ;
1050
+ return this ;
1051
+ }
1052
+
1013
1053
/**
1014
1054
* returns the primary term for the given shard.
1015
1055
* See {@link IndexMetaData#primaryTerm(int)} for more information.
@@ -1137,7 +1177,7 @@ public IndexMetaData build() {
1137
1177
1138
1178
final String uuid = settings .get (SETTING_INDEX_UUID , INDEX_UUID_NA_VALUE );
1139
1179
1140
- return new IndexMetaData (new Index (index , uuid ), version , primaryTerms , state , numberOfShards , numberOfReplicas , tmpSettings , mappings .build (),
1180
+ return new IndexMetaData (new Index (index , uuid ), version , mappingVersion , primaryTerms , state , numberOfShards , numberOfReplicas , tmpSettings , mappings .build (),
1141
1181
tmpAliases .build (), customs .build (), filledInSyncAllocationIds .build (), requireFilters , initialRecoveryFilters , includeFilters , excludeFilters ,
1142
1182
indexCreatedVersion , indexUpgradedVersion , getRoutingNumShards (), routingPartitionSize , waitForActiveShards , rolloverInfos .build ());
1143
1183
}
@@ -1146,6 +1186,7 @@ public static void toXContent(IndexMetaData indexMetaData, XContentBuilder build
1146
1186
builder .startObject (indexMetaData .getIndex ().getName ());
1147
1187
1148
1188
builder .field (KEY_VERSION , indexMetaData .getVersion ());
1189
+ builder .field (KEY_MAPPING_VERSION , indexMetaData .getMappingVersion ());
1149
1190
builder .field (KEY_ROUTING_NUM_SHARDS , indexMetaData .getRoutingNumShards ());
1150
1191
builder .field (KEY_STATE , indexMetaData .getState ().toString ().toLowerCase (Locale .ENGLISH ));
1151
1192
@@ -1219,6 +1260,7 @@ public static IndexMetaData fromXContent(XContentParser parser) throws IOExcepti
1219
1260
if (token != XContentParser .Token .START_OBJECT ) {
1220
1261
throw new IllegalArgumentException ("expected object but got a " + token );
1221
1262
}
1263
+ boolean mappingVersion = false ;
1222
1264
while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
1223
1265
if (token == XContentParser .Token .FIELD_NAME ) {
1224
1266
currentFieldName = parser .currentName ();
@@ -1317,6 +1359,9 @@ public static IndexMetaData fromXContent(XContentParser parser) throws IOExcepti
1317
1359
builder .state (State .fromString (parser .text ()));
1318
1360
} else if (KEY_VERSION .equals (currentFieldName )) {
1319
1361
builder .version (parser .longValue ());
1362
+ } else if (KEY_MAPPING_VERSION .equals (currentFieldName )) {
1363
+ mappingVersion = true ;
1364
+ builder .mappingVersion (parser .longValue ());
1320
1365
} else if (KEY_ROUTING_NUM_SHARDS .equals (currentFieldName )) {
1321
1366
builder .setRoutingNumShards (parser .intValue ());
1322
1367
} else {
@@ -1326,6 +1371,9 @@ public static IndexMetaData fromXContent(XContentParser parser) throws IOExcepti
1326
1371
throw new IllegalArgumentException ("Unexpected token " + token );
1327
1372
}
1328
1373
}
1374
+ if (Assertions .ENABLED && Version .indexCreated (builder .settings ).onOrAfter (Version .V_6_5_0 )) {
1375
+ assert mappingVersion : "mapping version should be present for indices created on or after 6.5.0" ;
1376
+ }
1329
1377
return builder .build ();
1330
1378
}
1331
1379
}
0 commit comments