Skip to content

Commit f91da12

Browse files
authored
Merge branch 'main' into revert-128293
2 parents 4f2b964 + 94e9513 commit f91da12

File tree

21 files changed

+117
-96
lines changed

21 files changed

+117
-96
lines changed

.buildkite/hooks/pre-command

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ fi
9696

9797
if [[ "${USE_PERF_CREDENTIALS:-}" == "true" ]]; then
9898
PERF_METRICS_HOST=$(vault read -field=es_host /secret/ci/elastic-elasticsearch/microbenchmarks-metrics)
99-
PERF_METRICS_USERNAME=$(vault read -field=es_username /secret/ci/elastic-elasticsearch/microbenchmarks-metrics)
99+
PERF_METRICS_USERNAME=$(vault read -field=es_user /secret/ci/elastic-elasticsearch/microbenchmarks-metrics)
100100
PERF_METRICS_PASSWORD=$(vault read -field=es_password /secret/ci/elastic-elasticsearch/microbenchmarks-metrics)
101101

102102
export PERF_METRICS_HOST

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/dependencies/patches/Utils.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import java.util.HexFormat;
2525
import java.util.Locale;
2626
import java.util.function.Function;
27+
import java.util.jar.Attributes;
2728
import java.util.jar.JarEntry;
2829
import java.util.jar.JarFile;
2930
import java.util.jar.JarOutputStream;
31+
import java.util.jar.Manifest;
3032
import java.util.stream.Collectors;
3133

3234
import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
@@ -60,6 +62,10 @@ public String toString() {
6062
}
6163
}
6264

65+
public static void patchJar(File inputJar, File outputJar, Collection<PatcherInfo> patchers) {
66+
patchJar(inputJar, outputJar, patchers, false);
67+
}
68+
6369
/**
6470
* Patches the classes in the input JAR file, using the collection of patchers. Each patcher specifies a target class (its jar entry
6571
* name) and the SHA256 digest on the class bytes.
@@ -69,8 +75,11 @@ public String toString() {
6975
* @param inputFile the JAR file to patch
7076
* @param outputFile the output (patched) JAR file
7177
* @param patchers list of patcher info (classes to patch (jar entry name + optional SHA256 digest) and ASM visitor to transform them)
78+
* @param unsignJar whether to remove class signatures from the JAR Manifest; set this to true when patching a signed JAR,
79+
* otherwise the patched classes will fail to load at runtime due to mismatched signatures.
80+
* @see <a href="https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html">Understanding Signing and Verification</a>
7281
*/
73-
public static void patchJar(File inputFile, File outputFile, Collection<PatcherInfo> patchers) {
82+
public static void patchJar(File inputFile, File outputFile, Collection<PatcherInfo> patchers, boolean unsignJar) {
7483
var classPatchers = patchers.stream().collect(Collectors.toMap(PatcherInfo::jarEntryName, Function.identity()));
7584
var mismatchedClasses = new ArrayList<MismatchInfo>();
7685
try (JarFile jarFile = new JarFile(inputFile); JarOutputStream jos = new JarOutputStream(new FileOutputStream(outputFile))) {
@@ -101,9 +110,23 @@ public static void patchJar(File inputFile, File outputFile, Collection<PatcherI
101110
);
102111
}
103112
} else {
104-
// Read the entry's data and write it to the new JAR
105113
try (InputStream is = jarFile.getInputStream(entry)) {
106-
is.transferTo(jos);
114+
if (unsignJar && entryName.equals("META-INF/MANIFEST.MF")) {
115+
var manifest = new Manifest(is);
116+
for (var manifestEntry : manifest.getEntries().entrySet()) {
117+
var nonSignatureAttributes = new Attributes();
118+
for (var attribute : manifestEntry.getValue().entrySet()) {
119+
if (attribute.getKey().toString().endsWith("Digest") == false) {
120+
nonSignatureAttributes.put(attribute.getKey(), attribute.getValue());
121+
}
122+
}
123+
manifestEntry.setValue(nonSignatureAttributes);
124+
}
125+
manifest.write(jos);
126+
} else if (unsignJar == false || entryName.matches("META-INF/.*\\.SF") == false) {
127+
// Read the entry's data and write it to the new JAR
128+
is.transferTo(jos);
129+
}
107130
}
108131
}
109132
jos.closeEntry();

docs/changelog/128613.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 128613
2+
summary: Improve support for bytecode patching signed jars
3+
area: Infra/Core
4+
type: enhancement
5+
issues: []

muted-tests.yml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,6 @@ tests:
496496
- class: org.elasticsearch.packaging.test.DockerTests
497497
method: test073RunEsAsDifferentUserAndGroupWithoutBindMounting
498498
issue: https://github.com/elastic/elasticsearch/issues/128996
499-
- class: org.elasticsearch.xpack.esql.qa.mixed.MixedClusterEsqlSpecIT
500-
method: test {lookup-join.LookupJoinOnTimeSeriesIndex ASYNC}
501-
issue: https://github.com/elastic/elasticsearch/issues/129078
502-
- class: org.elasticsearch.xpack.esql.qa.mixed.MixedClusterEsqlSpecIT
503-
method: test {lookup-join.LookupJoinOnTimeSeriesIndex SYNC}
504-
issue: https://github.com/elastic/elasticsearch/issues/129082
505499
- class: org.elasticsearch.upgrades.UpgradeClusterClientYamlTestSuiteIT
506500
method: test {p0=upgraded_cluster/70_ilm/Test Lifecycle Still There And Indices Are Still Managed}
507501
issue: https://github.com/elastic/elasticsearch/issues/129097

server/src/internalClusterTest/java/org/elasticsearch/cluster/ClusterStateDiffIT.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.cluster.metadata.IndexTemplateMetadata;
2727
import org.elasticsearch.cluster.metadata.Metadata;
2828
import org.elasticsearch.cluster.metadata.NodesShutdownMetadata;
29+
import org.elasticsearch.cluster.metadata.ProjectId;
2930
import org.elasticsearch.cluster.node.DiscoveryNode;
3031
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
3132
import org.elasticsearch.cluster.node.DiscoveryNodes;
@@ -45,6 +46,7 @@
4546
import org.elasticsearch.common.io.stream.StreamInput;
4647
import org.elasticsearch.common.settings.Settings;
4748
import org.elasticsearch.common.util.set.Sets;
49+
import org.elasticsearch.core.FixForMultiProject;
4850
import org.elasticsearch.gateway.GatewayService;
4951
import org.elasticsearch.index.Index;
5052
import org.elasticsearch.index.IndexVersion;
@@ -706,12 +708,15 @@ public Metadata.Builder put(Metadata.Builder builder, Metadata.ProjectCustom par
706708

707709
@Override
708710
public Metadata.Builder remove(Metadata.Builder builder, String name) {
711+
@FixForMultiProject
712+
final var projectBuilder = builder.getProject(ProjectId.DEFAULT);
709713
if (IndexGraveyard.TYPE.equals(name)) {
710714
// there must always be at least an empty graveyard
711-
return builder.indexGraveyard(IndexGraveyard.builder().build());
715+
projectBuilder.indexGraveyard(IndexGraveyard.builder().build());
712716
} else {
713-
return builder.removeProjectCustom(name);
717+
projectBuilder.removeCustom(name);
714718
}
719+
return builder;
715720
}
716721

717722
@Override

server/src/internalClusterTest/java/org/elasticsearch/snapshots/CustomMetadataContextIT.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ public void testShouldRestoreOnlySnapshotMetadata() throws Exception {
9191
assertThat(getSnapshot("test-repo", "test-snapshot").state(), equalTo(SnapshotState.SUCCESS));
9292

9393
logger.info("update custom persistent metadata");
94-
updateClusterState(currentState -> currentState.copyAndUpdateMetadata(metadataBuilder -> {
94+
updateClusterState(currentState -> currentState.copyAndUpdateProject(currentState.metadata().getProject().id(), builder -> {
9595
if (isSnapshotMetadataSet == false || randomBoolean()) {
96-
metadataBuilder.putCustom(SnapshotMetadata.TYPE, new SnapshotMetadata("after_snapshot_s"));
96+
builder.putCustom(SnapshotMetadata.TYPE, new SnapshotMetadata("after_snapshot_s"));
9797
} else {
98-
metadataBuilder.removeProjectCustom(SnapshotMetadata.TYPE);
98+
builder.removeCustom(SnapshotMetadata.TYPE);
9999
}
100-
metadataBuilder.putCustom(ApiMetadata.TYPE, new ApiMetadata("after_snapshot_ns"));
100+
builder.putCustom(ApiMetadata.TYPE, new ApiMetadata("after_snapshot_ns"));
101101
}));
102102

103103
logger.info("restore snapshot");

server/src/main/java/org/elasticsearch/cluster/coordination/RemoveCustomsCommand.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.elasticsearch.cli.UserException;
1717
import org.elasticsearch.cluster.ClusterState;
1818
import org.elasticsearch.cluster.metadata.Metadata;
19+
import org.elasticsearch.cluster.metadata.ProjectId;
20+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1921
import org.elasticsearch.common.regex.Regex;
2022
import org.elasticsearch.core.FixForMultiProject;
2123
import org.elasticsearch.core.Tuple;
@@ -66,6 +68,8 @@ protected void processDataPaths(Terminal terminal, Path[] dataPaths, OptionSet o
6668
"project scoped custom metadata names: " + oldClusterState.metadata().getProject().customs().keySet()
6769
);
6870
final Metadata.Builder metadataBuilder = Metadata.builder(oldClusterState.metadata());
71+
@FixForMultiProject
72+
final ProjectMetadata.Builder projectBuilder = metadataBuilder.getProject(ProjectId.DEFAULT);
6973
for (String customToRemove : customsToRemove) {
7074
@FixForMultiProject
7175
boolean matched = false;
@@ -82,7 +86,7 @@ protected void processDataPaths(Terminal terminal, Path[] dataPaths, OptionSet o
8286
}
8387
for (String customKey : oldClusterState.metadata().getProject().customs().keySet()) {
8488
if (Regex.simpleMatch(customToRemove, customKey)) {
85-
metadataBuilder.removeProjectCustom(customKey);
89+
projectBuilder.removeCustom(customKey);
8690
if (matched == false) {
8791
terminal.println("The following customs will be removed:");
8892
}

server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,18 +1743,6 @@ public Builder putProjectCustom(String type, ProjectCustom custom) {
17431743
return this;
17441744
}
17451745

1746-
@Deprecated(forRemoval = true)
1747-
public Builder removeProjectCustom(String type) {
1748-
getSingleProject().removeCustom(type);
1749-
return this;
1750-
}
1751-
1752-
@Deprecated(forRemoval = true)
1753-
public Builder removeProjectCustomIf(BiPredicate<String, ? super ProjectCustom> p) {
1754-
getSingleProject().removeCustomIf(p);
1755-
return this;
1756-
}
1757-
17581746
@Deprecated(forRemoval = true)
17591747
public Builder projectCustoms(Map<String, ProjectCustom> projectCustoms) {
17601748
projectCustoms.forEach((key, value) -> Objects.requireNonNull(value, key));

server/src/test/java/org/elasticsearch/cluster/ClusterChangedEventTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,10 +681,12 @@ private static ClusterState nextState(
681681
final ClusterState.Builder builder = ClusterState.builder(previousState);
682682
builder.stateUUID(UUIDs.randomBase64UUID());
683683
Metadata.Builder metadataBuilder = Metadata.builder(previousState.metadata());
684+
ProjectMetadata.Builder projectBuilder = ProjectMetadata.builder(previousState.metadata().projects().values().iterator().next());
684685
metadataBuilder.removeCustomIf((ignore, custom) -> custom instanceof TestClusterCustomMetadata);
685-
metadataBuilder.removeProjectCustomIf((ignore, custom) -> custom instanceof TestProjectCustomMetadata);
686+
projectBuilder.removeCustomIf((ignore, custom) -> custom instanceof TestProjectCustomMetadata);
686687
clusterCustoms.forEach(clusterCustom -> metadataBuilder.putCustom(clusterCustom.getWriteableName(), clusterCustom));
687-
projectCustoms.forEach(projectCustom -> metadataBuilder.putCustom(projectCustom.getWriteableName(), projectCustom));
688+
projectCustoms.forEach(projectCustom -> projectBuilder.putCustom(projectCustom.getWriteableName(), projectCustom));
689+
metadataBuilder.put(projectBuilder);
688690
builder.metadata(metadataBuilder);
689691
return builder.build();
690692
}

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,20 +1391,6 @@ public void testBuilderRemoveClusterCustomIf() {
13911391
assertThat(metadata.custom("custom2"), sameInstance(custom2));
13921392
}
13931393

1394-
public void testBuilderRemoveProjectCustomIf() {
1395-
var custom1 = new TestProjectCustomMetadata();
1396-
var custom2 = new TestProjectCustomMetadata();
1397-
var builder = Metadata.builder();
1398-
builder.putCustom("custom1", custom1);
1399-
builder.putCustom("custom2", custom2);
1400-
1401-
builder.removeProjectCustomIf((key, value) -> Objects.equals(key, "custom1"));
1402-
1403-
var metadata = builder.build();
1404-
assertThat(metadata.getProject().custom("custom1"), nullValue());
1405-
assertThat(metadata.getProject().custom("custom2"), sameInstance(custom2));
1406-
}
1407-
14081394
public void testBuilderRejectsDataStreamThatConflictsWithIndex() {
14091395
final String dataStreamName = "my-data-stream";
14101396
IndexMetadata idx = createFirstBackingIndex(dataStreamName).build();

0 commit comments

Comments
 (0)