Skip to content

Commit f76d72c

Browse files
Merge pull request #152 from elastic/master
🤖 ESQL: Merge upstream
2 parents aa8d0e2 + fc09896 commit f76d72c

File tree

14 files changed

+1104
-952
lines changed

14 files changed

+1104
-952
lines changed

distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreWrapperTests.java

Lines changed: 0 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@
3434
import java.nio.file.Files;
3535
import java.nio.file.Path;
3636
import java.security.GeneralSecurityException;
37-
import java.security.KeyStore;
3837
import java.security.MessageDigest;
3938
import java.security.SecureRandom;
4039
import java.util.ArrayList;
4140
import java.util.Arrays;
42-
import java.util.Base64;
4341
import java.util.List;
4442
import java.util.Locale;
4543
import java.util.Set;
@@ -375,98 +373,6 @@ public void testIllegalSettingName() throws Exception {
375373
assertTrue(e.getMessage().contains("does not match the allowed setting name pattern"));
376374
}
377375

378-
public void testBackcompatV1() throws Exception {
379-
assumeFalse("Can't run in a FIPS JVM as PBE is not available", inFipsJvm());
380-
Path configDir = env.configFile();
381-
try (
382-
Directory directory = newFSDirectory(configDir);
383-
IndexOutput output = EndiannessReverserUtil.createOutput(directory, "elasticsearch.keystore", IOContext.DEFAULT);
384-
) {
385-
CodecUtil.writeHeader(output, "elasticsearch.keystore", 1);
386-
output.writeByte((byte) 0); // hasPassword = false
387-
output.writeString("PKCS12");
388-
output.writeString("PBE");
389-
390-
SecretKeyFactory secretFactory = SecretKeyFactory.getInstance("PBE");
391-
KeyStore keystore = KeyStore.getInstance("PKCS12");
392-
keystore.load(null, null);
393-
SecretKey secretKey = secretFactory.generateSecret(new PBEKeySpec("stringSecretValue".toCharArray()));
394-
KeyStore.ProtectionParameter protectionParameter = new KeyStore.PasswordProtection(new char[0]);
395-
keystore.setEntry("string_setting", new KeyStore.SecretKeyEntry(secretKey), protectionParameter);
396-
397-
ByteArrayOutputStream keystoreBytesStream = new ByteArrayOutputStream();
398-
keystore.store(keystoreBytesStream, new char[0]);
399-
byte[] keystoreBytes = keystoreBytesStream.toByteArray();
400-
output.writeInt(keystoreBytes.length);
401-
output.writeBytes(keystoreBytes, keystoreBytes.length);
402-
CodecUtil.writeFooter(output);
403-
}
404-
405-
KeyStoreWrapper keystore = KeyStoreWrapper.load(configDir);
406-
keystore.decrypt(new char[0]);
407-
SecureString testValue = keystore.getString("string_setting");
408-
assertThat(testValue.toString(), equalTo("stringSecretValue"));
409-
}
410-
411-
public void testBackcompatV2() throws Exception {
412-
assumeFalse("Can't run in a FIPS JVM as PBE is not available", inFipsJvm());
413-
Path configDir = env.configFile();
414-
byte[] fileBytes = new byte[20];
415-
random().nextBytes(fileBytes);
416-
try (
417-
Directory directory = newFSDirectory(configDir);
418-
IndexOutput output = EndiannessReverserUtil.createOutput(directory, "elasticsearch.keystore", IOContext.DEFAULT);
419-
) {
420-
CodecUtil.writeHeader(output, "elasticsearch.keystore", KeyStoreWrapper.V2_VERSION);
421-
output.writeByte((byte) 0); // hasPassword = false
422-
output.writeString("PKCS12");
423-
output.writeString("PBE"); // string algo
424-
output.writeString("PBE"); // file algo
425-
426-
output.writeVInt(2); // num settings
427-
output.writeString("string_setting");
428-
output.writeString("STRING");
429-
output.writeString("file_setting");
430-
output.writeString("FILE");
431-
432-
SecretKeyFactory secretFactory = SecretKeyFactory.getInstance("PBE");
433-
KeyStore keystore = KeyStore.getInstance("PKCS12");
434-
keystore.load(null, null);
435-
SecretKey secretKey = secretFactory.generateSecret(new PBEKeySpec("stringSecretValue".toCharArray()));
436-
KeyStore.ProtectionParameter protectionParameter = new KeyStore.PasswordProtection(new char[0]);
437-
keystore.setEntry("string_setting", new KeyStore.SecretKeyEntry(secretKey), protectionParameter);
438-
439-
byte[] base64Bytes = Base64.getEncoder().encode(fileBytes);
440-
char[] chars = new char[base64Bytes.length];
441-
for (int i = 0; i < chars.length; ++i) {
442-
chars[i] = (char) base64Bytes[i]; // PBE only stores the lower 8 bits, so this narrowing is ok
443-
}
444-
secretKey = secretFactory.generateSecret(new PBEKeySpec(chars));
445-
keystore.setEntry("file_setting", new KeyStore.SecretKeyEntry(secretKey), protectionParameter);
446-
447-
ByteArrayOutputStream keystoreBytesStream = new ByteArrayOutputStream();
448-
keystore.store(keystoreBytesStream, new char[0]);
449-
byte[] keystoreBytes = keystoreBytesStream.toByteArray();
450-
output.writeInt(keystoreBytes.length);
451-
output.writeBytes(keystoreBytes, keystoreBytes.length);
452-
CodecUtil.writeFooter(output);
453-
}
454-
455-
KeyStoreWrapper keystore = KeyStoreWrapper.load(configDir);
456-
keystore.decrypt(new char[0]);
457-
SecureString testValue = keystore.getString("string_setting");
458-
assertThat(testValue.toString(), equalTo("stringSecretValue"));
459-
460-
try (InputStream fileInput = keystore.getFile("file_setting")) {
461-
byte[] readBytes = new byte[20];
462-
assertEquals(20, fileInput.read(readBytes));
463-
for (int i = 0; i < fileBytes.length; ++i) {
464-
assertThat("byte " + i, readBytes[i], equalTo(fileBytes[i]));
465-
}
466-
assertEquals(-1, fileInput.read());
467-
}
468-
}
469-
470376
public void testBackcompatV4() throws Exception {
471377
assumeFalse("Can't run in a FIPS JVM as PBE is not available", inFipsJvm());
472378
Path configDir = env.configFile();

docs/changelog/87672.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 87672
2+
summary: Move the master stability logic into its own service separate from the `HealthIndicatorService`
3+
area: Health
4+
type: enhancement
5+
issues: []

server/src/internalClusterTest/java/org/elasticsearch/discovery/StableMasterDisruptionIT.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import org.elasticsearch.client.internal.Client;
1313
import org.elasticsearch.cluster.ClusterState;
1414
import org.elasticsearch.cluster.ClusterStateUpdateTask;
15+
import org.elasticsearch.cluster.coordination.CoordinationDiagnosticsService;
1516
import org.elasticsearch.cluster.coordination.Coordinator;
1617
import org.elasticsearch.cluster.coordination.FollowersChecker;
1718
import org.elasticsearch.cluster.coordination.LeaderChecker;
18-
import org.elasticsearch.cluster.coordination.StableMasterHealthIndicatorService;
1919
import org.elasticsearch.cluster.node.DiscoveryNode;
2020
import org.elasticsearch.cluster.service.ClusterService;
2121
import org.elasticsearch.common.Priority;
@@ -320,8 +320,8 @@ public void testRepeatedMasterChanges(String expectedMasterStabilitySummarySubst
320320
Settings.builder()
321321
.put(LeaderChecker.LEADER_CHECK_TIMEOUT_SETTING.getKey(), "1s")
322322
.put(Coordinator.PUBLISH_TIMEOUT_SETTING.getKey(), "1s")
323-
.put(StableMasterHealthIndicatorService.IDENTITY_CHANGES_THRESHOLD_SETTING.getKey(), 1)
324-
.put(StableMasterHealthIndicatorService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 100)
323+
.put(CoordinationDiagnosticsService.IDENTITY_CHANGES_THRESHOLD_SETTING.getKey(), 1)
324+
.put(CoordinationDiagnosticsService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 100)
325325
.build()
326326
);
327327
ensureStableCluster(3);
@@ -416,19 +416,16 @@ public void testRepeatedNullMasterRecognizedAsGreenIfMasterDoesNotKnowItIsUnstab
416416
Settings.builder()
417417
.put(LeaderChecker.LEADER_CHECK_TIMEOUT_SETTING.getKey(), "1s")
418418
.put(Coordinator.PUBLISH_TIMEOUT_SETTING.getKey(), "1s")
419-
.put(StableMasterHealthIndicatorService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 1)
419+
.put(CoordinationDiagnosticsService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 1)
420420
.build()
421421
);
422422
final List<String> dataNodes = internalCluster().startDataOnlyNodes(
423423
2,
424424
Settings.builder()
425425
.put(LeaderChecker.LEADER_CHECK_TIMEOUT_SETTING.getKey(), "1s")
426426
.put(Coordinator.PUBLISH_TIMEOUT_SETTING.getKey(), "1s")
427-
.put(StableMasterHealthIndicatorService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 1)
428-
.put(
429-
StableMasterHealthIndicatorService.NODE_HAS_MASTER_LOOKUP_TIMEFRAME_SETTING.getKey(),
430-
new TimeValue(60, TimeUnit.SECONDS)
431-
)
427+
.put(CoordinationDiagnosticsService.NO_MASTER_TRANSITIONS_THRESHOLD_SETTING.getKey(), 1)
428+
.put(CoordinationDiagnosticsService.NODE_HAS_MASTER_LOOKUP_TIMEFRAME_SETTING.getKey(), new TimeValue(60, TimeUnit.SECONDS))
432429
.build()
433430
);
434431
ensureStableCluster(3);

server/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.elasticsearch.cluster.routing.ShardRouting;
2828
import org.elasticsearch.cluster.routing.allocation.DiskThresholdSettings;
2929
import org.elasticsearch.cluster.service.ClusterService;
30-
import org.elasticsearch.common.collect.ImmutableOpenMap;
3130
import org.elasticsearch.common.settings.ClusterSettings;
3231
import org.elasticsearch.common.settings.Setting;
3332
import org.elasticsearch.common.settings.Setting.Property;
@@ -40,6 +39,7 @@
4039
import org.elasticsearch.threadpool.ThreadPool;
4140

4241
import java.util.ArrayList;
42+
import java.util.Collections;
4343
import java.util.HashMap;
4444
import java.util.HashSet;
4545
import java.util.List;
@@ -83,8 +83,8 @@ public class InternalClusterInfoService implements ClusterInfoService, ClusterSt
8383
private volatile TimeValue updateFrequency;
8484
private volatile TimeValue fetchTimeout;
8585

86-
private volatile ImmutableOpenMap<String, DiskUsage> leastAvailableSpaceUsages;
87-
private volatile ImmutableOpenMap<String, DiskUsage> mostAvailableSpaceUsages;
86+
private volatile Map<String, DiskUsage> leastAvailableSpaceUsages;
87+
private volatile Map<String, DiskUsage> mostAvailableSpaceUsages;
8888
private volatile IndicesStatsSummary indicesStatsSummary;
8989

9090
private final ThreadPool threadPool;
@@ -97,8 +97,8 @@ public class InternalClusterInfoService implements ClusterInfoService, ClusterSt
9797
private RefreshScheduler refreshScheduler;
9898

9999
public InternalClusterInfoService(Settings settings, ClusterService clusterService, ThreadPool threadPool, Client client) {
100-
this.leastAvailableSpaceUsages = ImmutableOpenMap.of();
101-
this.mostAvailableSpaceUsages = ImmutableOpenMap.of();
100+
this.leastAvailableSpaceUsages = Map.of();
101+
this.mostAvailableSpaceUsages = Map.of();
102102
this.indicesStatsSummary = IndicesStatsSummary.EMPTY;
103103
this.threadPool = threadPool;
104104
this.client = client;
@@ -181,15 +181,15 @@ public void onResponse(NodesStatsResponse nodesStatsResponse) {
181181
logger.warn(() -> "failed to retrieve stats for node [" + failure.nodeId() + "]", failure.getCause());
182182
}
183183

184-
ImmutableOpenMap.Builder<String, DiskUsage> leastAvailableUsagesBuilder = ImmutableOpenMap.builder();
185-
ImmutableOpenMap.Builder<String, DiskUsage> mostAvailableUsagesBuilder = ImmutableOpenMap.builder();
184+
Map<String, DiskUsage> leastAvailableUsagesBuilder = new HashMap<>();
185+
Map<String, DiskUsage> mostAvailableUsagesBuilder = new HashMap<>();
186186
fillDiskUsagePerNode(
187187
adjustNodesStats(nodesStatsResponse.getNodes()),
188188
leastAvailableUsagesBuilder,
189189
mostAvailableUsagesBuilder
190190
);
191-
leastAvailableSpaceUsages = leastAvailableUsagesBuilder.build();
192-
mostAvailableSpaceUsages = mostAvailableUsagesBuilder.build();
191+
leastAvailableSpaceUsages = Collections.unmodifiableMap(leastAvailableUsagesBuilder);
192+
mostAvailableSpaceUsages = Collections.unmodifiableMap(mostAvailableUsagesBuilder);
193193
}
194194

195195
@Override
@@ -199,8 +199,8 @@ public void onFailure(Exception e) {
199199
} else {
200200
logger.warn("failed to retrieve node stats", e);
201201
}
202-
leastAvailableSpaceUsages = ImmutableOpenMap.of();
203-
mostAvailableSpaceUsages = ImmutableOpenMap.of();
202+
leastAvailableSpaceUsages = Map.of();
203+
mostAvailableSpaceUsages = Map.of();
204204
}
205205
}, this::onStatsProcessed));
206206

@@ -246,9 +246,9 @@ public void onResponse(IndicesStatsResponse indicesStatsResponse) {
246246
}
247247

248248
final ShardStats[] stats = indicesStatsResponse.getShards();
249-
final ImmutableOpenMap.Builder<String, Long> shardSizeByIdentifierBuilder = ImmutableOpenMap.builder();
250-
final ImmutableOpenMap.Builder<ShardId, Long> shardDataSetSizeBuilder = ImmutableOpenMap.builder();
251-
final ImmutableOpenMap.Builder<ShardRouting, String> dataPathByShardRoutingBuilder = ImmutableOpenMap.builder();
249+
final Map<String, Long> shardSizeByIdentifierBuilder = new HashMap<>();
250+
final Map<ShardId, Long> shardDataSetSizeBuilder = new HashMap<>();
251+
final Map<ShardRouting, String> dataPathByShardRoutingBuilder = new HashMap<>();
252252
final Map<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace.Builder> reservedSpaceBuilders = new HashMap<>();
253253
buildShardLevelInfo(
254254
stats,
@@ -258,15 +258,14 @@ public void onResponse(IndicesStatsResponse indicesStatsResponse) {
258258
reservedSpaceBuilders
259259
);
260260

261-
final ImmutableOpenMap.Builder<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace> rsrvdSpace = ImmutableOpenMap
262-
.builder();
261+
final Map<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace> rsrvdSpace = new HashMap<>();
263262
reservedSpaceBuilders.forEach((nodeAndPath, builder) -> rsrvdSpace.put(nodeAndPath, builder.build()));
264263

265264
indicesStatsSummary = new IndicesStatsSummary(
266-
shardSizeByIdentifierBuilder.build(),
267-
shardDataSetSizeBuilder.build(),
268-
dataPathByShardRoutingBuilder.build(),
269-
rsrvdSpace.build()
265+
Collections.unmodifiableMap(shardSizeByIdentifierBuilder),
266+
Collections.unmodifiableMap(shardDataSetSizeBuilder),
267+
Collections.unmodifiableMap(dataPathByShardRoutingBuilder),
268+
Collections.unmodifiableMap(rsrvdSpace)
270269
);
271270
}
272271

@@ -342,8 +341,8 @@ private Runnable getNewRefresh() {
342341
return currentRefresh::execute;
343342
} else {
344343
return () -> {
345-
leastAvailableSpaceUsages = ImmutableOpenMap.of();
346-
mostAvailableSpaceUsages = ImmutableOpenMap.of();
344+
leastAvailableSpaceUsages = Map.of();
345+
mostAvailableSpaceUsages = Map.of();
347346
indicesStatsSummary = IndicesStatsSummary.EMPTY;
348347
thisRefreshListeners.forEach(l -> l.onResponse(ClusterInfo.EMPTY));
349348
};
@@ -413,9 +412,9 @@ public void addListener(Consumer<ClusterInfo> clusterInfoConsumer) {
413412

414413
static void buildShardLevelInfo(
415414
ShardStats[] stats,
416-
ImmutableOpenMap.Builder<String, Long> shardSizes,
417-
ImmutableOpenMap.Builder<ShardId, Long> shardDataSetSizeBuilder,
418-
ImmutableOpenMap.Builder<ShardRouting, String> newShardRoutingToDataPath,
415+
Map<String, Long> shardSizes,
416+
Map<ShardId, Long> shardDataSetSizeBuilder,
417+
Map<ShardRouting, String> newShardRoutingToDataPath,
419418
Map<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace.Builder> reservedSpaceByShard
420419
) {
421420
for (ShardStats s : stats) {
@@ -448,8 +447,8 @@ static void buildShardLevelInfo(
448447

449448
static void fillDiskUsagePerNode(
450449
List<NodeStats> nodeStatsArray,
451-
ImmutableOpenMap.Builder<String, DiskUsage> newLeastAvailableUsages,
452-
ImmutableOpenMap.Builder<String, DiskUsage> newMostAvailableUsages
450+
Map<String, DiskUsage> newLeastAvailableUsages,
451+
Map<String, DiskUsage> newMostAvailableUsages
453452
) {
454453
for (NodeStats nodeStats : nodeStatsArray) {
455454
if (nodeStats.getFs() == null) {
@@ -534,18 +533,12 @@ static void fillDiskUsagePerNode(
534533
}
535534

536535
private record IndicesStatsSummary(
537-
ImmutableOpenMap<String, Long> shardSizes,
538-
ImmutableOpenMap<ShardId, Long> shardDataSetSizes,
539-
ImmutableOpenMap<ShardRouting, String> shardRoutingToDataPath,
540-
ImmutableOpenMap<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace> reservedSpace
536+
Map<String, Long> shardSizes,
537+
Map<ShardId, Long> shardDataSetSizes,
538+
Map<ShardRouting, String> shardRoutingToDataPath,
539+
Map<ClusterInfo.NodeAndPath, ClusterInfo.ReservedSpace> reservedSpace
541540
) {
542-
static final IndicesStatsSummary EMPTY = new IndicesStatsSummary(
543-
ImmutableOpenMap.of(),
544-
ImmutableOpenMap.of(),
545-
ImmutableOpenMap.of(),
546-
ImmutableOpenMap.of()
547-
);
548-
541+
static final IndicesStatsSummary EMPTY = new IndicesStatsSummary(Map.of(), Map.of(), Map.of(), Map.of());
549542
}
550543

551544
}

0 commit comments

Comments
 (0)