Skip to content

Commit 69c94f4

Browse files
committed
Merge branch 'master' into peer-recovery-retention-leases
2 parents 40ea029 + 343bb08 commit 69c94f4

File tree

235 files changed

+1944
-1737
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

235 files changed

+1944
-1737
lines changed

buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy

+21-12
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,9 @@ class VagrantTestPlugin implements Plugin<Project> {
324324
fi
325325
326326
if [ -z "\$SYSTEM_JAVA_HOME" ]; then
327-
export SYSTEM_JAVA_HOME="${-> convertPath(project, linuxSystemJdk.toString()) }"
327+
export SYSTEM_JAVA_HOME="${-> convertLinuxPath(project, linuxSystemJdk.toString()) }"
328328
fi
329-
"${-> convertPath(project, linuxGradleJdk.toString()) }"/bin/java -cp "\$PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner "\${test_args[@]}"
329+
"${-> convertLinuxPath(project, linuxGradleJdk.toString()) }"/bin/java -cp "\$PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner "\${test_args[@]}"
330330
"""
331331
}
332332
Task createWindowsRunnerScript = project.tasks.create('createWindowsRunnerScript', FileContentsTask) {
@@ -335,14 +335,20 @@ class VagrantTestPlugin implements Plugin<Project> {
335335
// the use of $args rather than param() here is deliberate because the syntax for array (multivalued) parameters is likely
336336
// a little trappy for those unfamiliar with powershell
337337
contents """\
338-
if (\$args.Count -eq 0) {
339-
\$testArgs = @("${-> project.extensions.esvagrant.testClass}")
340-
} else {
341-
\$testArgs = \$args
338+
try {
339+
if (\$args.Count -eq 0) {
340+
\$testArgs = @("${-> project.extensions.esvagrant.testClass}")
341+
} else {
342+
\$testArgs = \$args
343+
}
344+
\$Env:SYSTEM_JAVA_HOME = "${-> convertWindowsPath(project, windowsSystemJdk.toString()) }"
345+
& "${-> convertWindowsPath(project, windowsGradleJdk.toString()) }/bin/java" -cp "\$Env:PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner @testArgs
346+
exit \$LASTEXITCODE
347+
} catch {
348+
# catch if we have a failure to even run the script at all above, equivalent to set -e, sort of
349+
echo "\$_.Exception.Message"
350+
exit 1
342351
}
343-
\$Env:SYSTEM_JAVA_HOME = "${-> convertPath(project, windowsSystemJdk.toString()) }"
344-
& "${-> convertPath(project, windowsGradleJdk.toString()) }"/bin/java -cp "\$Env:PACKAGING_TESTS/*" org.elasticsearch.packaging.VMTestRunner @testArgs
345-
exit \$LASTEXITCODE
346352
"""
347353
}
348354

@@ -578,7 +584,7 @@ class VagrantTestPlugin implements Plugin<Project> {
578584

579585
if (LINUX_BOXES.contains(box)) {
580586
Task batsPackagingTest = project.tasks.create("vagrant${boxTask}#batsPackagingTest", BatsOverVagrantTask) {
581-
remoteCommand "export SYSTEM_JAVA_HOME=\"${-> convertPath(project, linuxSystemJdk.toString())}\"; " + BATS_TEST_COMMAND
587+
remoteCommand "export SYSTEM_JAVA_HOME=\"${-> convertLinuxPath(project, linuxSystemJdk.toString())}\"; " + BATS_TEST_COMMAND
582588
boxName box
583589
environmentVars vagrantEnvVars
584590
dependsOn up, setupPackagingTest, linuxSystemJdk
@@ -625,7 +631,7 @@ class VagrantTestPlugin implements Plugin<Project> {
625631
// https://github.com/hashicorp/vagrant/blob/9c299a2a357fcf87f356bb9d56e18a037a53d138/plugins/communicators/winrm/communicator.rb#L195-L225
626632
// https://devops-collective-inc.gitbooks.io/secrets-of-powershell-remoting/content/manuscript/accessing-remote-computers.html
627633
javaPackagingTest.command = 'winrm'
628-
javaPackagingTest.args = ['--elevated', '--command', 'powershell -File "$Env:PACKAGING_TESTS/run-tests.ps1"']
634+
javaPackagingTest.args = ['--elevated', '--command', '& "$Env:PACKAGING_TESTS/run-tests.ps1"; exit $LASTEXITCODE']
629635
}
630636

631637
TaskExecutionAdapter javaPackagingReproListener = createReproListener(project, javaPackagingTest.path)
@@ -658,7 +664,10 @@ class VagrantTestPlugin implements Plugin<Project> {
658664
}
659665

660666
// convert the given path from an elasticsearch repo path to a VM path
661-
private String convertPath(Project project, String path) {
667+
private String convertLinuxPath(Project project, String path) {
662668
return "/elasticsearch/" + project.rootDir.toPath().relativize(Paths.get(path));
663669
}
670+
private String convertWindowsPath(Project project, String path) {
671+
return "C:\\elasticsearch\\" + project.rootDir.toPath().relativize(Paths.get(path)).toString().replace('/', '\\');
672+
}
664673
}

client/rest-high-level/src/main/java/org/elasticsearch/client/DataFrameRequestConverters.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737

3838
import static org.elasticsearch.client.RequestConverters.REQUEST_BODY_CONTENT_TYPE;
3939
import static org.elasticsearch.client.RequestConverters.createEntity;
40+
import static org.elasticsearch.client.dataframe.DeleteDataFrameTransformRequest.FORCE;
4041
import static org.elasticsearch.client.dataframe.GetDataFrameTransformRequest.ALLOW_NO_MATCH;
42+
import static org.elasticsearch.client.dataframe.PutDataFrameTransformRequest.DEFER_VALIDATION;
4143

4244
final class DataFrameRequestConverters {
4345

@@ -50,6 +52,9 @@ static Request putDataFrameTransform(PutDataFrameTransformRequest putRequest) th
5052
.build();
5153
Request request = new Request(HttpPut.METHOD_NAME, endpoint);
5254
request.setEntity(createEntity(putRequest, REQUEST_BODY_CONTENT_TYPE));
55+
if (putRequest.getDeferValidation() != null) {
56+
request.addParameter(DEFER_VALIDATION, Boolean.toString(putRequest.getDeferValidation()));
57+
}
5358
return request;
5459
}
5560

@@ -71,12 +76,16 @@ static Request getDataFrameTransform(GetDataFrameTransformRequest getRequest) {
7176
return request;
7277
}
7378

74-
static Request deleteDataFrameTransform(DeleteDataFrameTransformRequest request) {
79+
static Request deleteDataFrameTransform(DeleteDataFrameTransformRequest deleteRequest) {
7580
String endpoint = new RequestConverters.EndpointBuilder()
7681
.addPathPartAsIs("_data_frame", "transforms")
77-
.addPathPart(request.getId())
82+
.addPathPart(deleteRequest.getId())
7883
.build();
79-
return new Request(HttpDelete.METHOD_NAME, endpoint);
84+
Request request = new Request(HttpDelete.METHOD_NAME, endpoint);
85+
if (deleteRequest.getForce() != null) {
86+
request.addParameter(FORCE, Boolean.toString(deleteRequest.getForce()));
87+
}
88+
return request;
8089
}
8190

8291
static Request startDataFrameTransform(StartDataFrameTransformRequest startRequest) {

client/rest-high-level/src/main/java/org/elasticsearch/client/dataframe/DeleteDataFrameTransformRequest.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
*/
3232
public class DeleteDataFrameTransformRequest implements Validatable {
3333

34+
public static final String FORCE = "force";
35+
3436
private final String id;
37+
private Boolean force;
3538

3639
public DeleteDataFrameTransformRequest(String id) {
3740
this.id = id;
@@ -41,6 +44,14 @@ public String getId() {
4144
return id;
4245
}
4346

47+
public Boolean getForce() {
48+
return force;
49+
}
50+
51+
public void setForce(boolean force) {
52+
this.force = force;
53+
}
54+
4455
@Override
4556
public Optional<ValidationException> validate() {
4657
if (id == null) {
@@ -54,7 +65,7 @@ public Optional<ValidationException> validate() {
5465

5566
@Override
5667
public int hashCode() {
57-
return Objects.hash(id);
68+
return Objects.hash(id, force);
5869
}
5970

6071
@Override
@@ -67,6 +78,6 @@ public boolean equals(Object obj) {
6778
return false;
6879
}
6980
DeleteDataFrameTransformRequest other = (DeleteDataFrameTransformRequest) obj;
70-
return Objects.equals(id, other.id);
81+
return Objects.equals(id, other.id) && Objects.equals(force, other.force);
7182
}
7283
}

client/rest-high-level/src/main/java/org/elasticsearch/client/dataframe/PutDataFrameTransformRequest.java

+15
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131

3232
public class PutDataFrameTransformRequest implements ToXContentObject, Validatable {
3333

34+
public static final String DEFER_VALIDATION = "defer_validation";
3435
private final DataFrameTransformConfig config;
36+
private Boolean deferValidation;
3537

3638
public PutDataFrameTransformRequest(DataFrameTransformConfig config) {
3739
this.config = config;
@@ -41,6 +43,19 @@ public DataFrameTransformConfig getConfig() {
4143
return config;
4244
}
4345

46+
public Boolean getDeferValidation() {
47+
return deferValidation;
48+
}
49+
50+
/**
51+
* Indicates if deferrable validations should be skipped until the transform starts
52+
*
53+
* @param deferValidation {@code true} will cause validations to be deferred
54+
*/
55+
public void setDeferValidation(boolean deferValidation) {
56+
this.deferValidation = deferValidation;
57+
}
58+
4459
@Override
4560
public Optional<ValidationException> validate() {
4661
ValidationException validationException = new ValidationException();

client/rest-high-level/src/test/java/org/elasticsearch/client/DataFrameRequestConvertersTests.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
import static org.hamcrest.Matchers.allOf;
5151
import static org.hamcrest.Matchers.equalTo;
5252
import static org.hamcrest.Matchers.hasEntry;
53+
import static org.hamcrest.Matchers.hasKey;
54+
import static org.hamcrest.Matchers.not;
5355

5456
public class DataFrameRequestConvertersTests extends ESTestCase {
5557

@@ -66,14 +68,17 @@ public void testPutDataFrameTransform() throws IOException {
6668
PutDataFrameTransformRequest putRequest = new PutDataFrameTransformRequest(
6769
DataFrameTransformConfigTests.randomDataFrameTransformConfig());
6870
Request request = DataFrameRequestConverters.putDataFrameTransform(putRequest);
69-
71+
assertThat(request.getParameters(), not(hasKey("defer_validation")));
7072
assertEquals(HttpPut.METHOD_NAME, request.getMethod());
7173
assertThat(request.getEndpoint(), equalTo("/_data_frame/transforms/" + putRequest.getConfig().getId()));
7274

7375
try (XContentParser parser = createParser(JsonXContent.jsonXContent, request.getEntity().getContent())) {
7476
DataFrameTransformConfig parsedConfig = DataFrameTransformConfig.PARSER.apply(parser, null);
7577
assertThat(parsedConfig, equalTo(putRequest.getConfig()));
7678
}
79+
putRequest.setDeferValidation(true);
80+
request = DataFrameRequestConverters.putDataFrameTransform(putRequest);
81+
assertThat(request.getParameters(), hasEntry("defer_validation", Boolean.toString(putRequest.getDeferValidation())));
7782
}
7883

7984
public void testDeleteDataFrameTransform() {
@@ -82,6 +87,13 @@ public void testDeleteDataFrameTransform() {
8287

8388
assertEquals(HttpDelete.METHOD_NAME, request.getMethod());
8489
assertThat(request.getEndpoint(), equalTo("/_data_frame/transforms/foo"));
90+
91+
assertThat(request.getParameters(), not(hasKey("force")));
92+
93+
deleteRequest.setForce(true);
94+
request = DataFrameRequestConverters.deleteDataFrameTransform(deleteRequest);
95+
96+
assertThat(request.getParameters(), hasEntry("force", "true"));
8597
}
8698

8799
public void testStartDataFrameTransform() {

client/rest-high-level/src/test/java/org/elasticsearch/client/DataFrameTransformIT.java

+16
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,22 @@ public void testCreateDelete() throws IOException {
180180
assertThat(deleteError.getMessage(), containsString("Transform with id [test-crud] could not be found"));
181181
}
182182

183+
public void testCreateDeleteWithDefer() throws IOException {
184+
String sourceIndex = "missing-source-index";
185+
186+
String id = "test-with-defer";
187+
DataFrameTransformConfig transform = validDataFrameTransformConfig(id, sourceIndex, "pivot-dest");
188+
DataFrameClient client = highLevelClient().dataFrame();
189+
PutDataFrameTransformRequest request = new PutDataFrameTransformRequest(transform);
190+
request.setDeferValidation(true);
191+
AcknowledgedResponse ack = execute(request, client::putDataFrameTransform, client::putDataFrameTransformAsync);
192+
assertTrue(ack.isAcknowledged());
193+
194+
ack = execute(new DeleteDataFrameTransformRequest(transform.getId()), client::deleteDataFrameTransform,
195+
client::deleteDataFrameTransformAsync);
196+
assertTrue(ack.isAcknowledged());
197+
}
198+
183199
public void testGetTransform() throws IOException {
184200
String sourceIndex = "transform-source";
185201
createIndex(sourceIndex);

client/rest-high-level/src/test/java/org/elasticsearch/client/SyncedFlushResponseTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ TestPlan createTestPlan() throws IOException {
191191
);
192192
} else {
193193
successful++;
194-
shardResponses.put(shardRouting, new SyncedFlushService.ShardSyncedFlushResponse());
194+
shardResponses.put(shardRouting, new SyncedFlushService.ShardSyncedFlushResponse((String) null));
195195
}
196196
}
197197
shardsResults.add(new ShardsSyncedFlushResult(shardId, "_sync_id_" + shard, replicas + 1, shardResponses));

client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/DataFrameTransformDocumentationIT.java

+2
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public void testPutDataFrameTransform() throws IOException, InterruptedException
166166
// tag::put-data-frame-transform-request
167167
PutDataFrameTransformRequest request =
168168
new PutDataFrameTransformRequest(transformConfig); // <1>
169+
request.setDeferValidation(false); // <2>
169170
// end::put-data-frame-transform-request
170171

171172
// tag::put-data-frame-transform-execute
@@ -374,6 +375,7 @@ public void testDeleteDataFrameTransform() throws IOException, InterruptedExcept
374375
// tag::delete-data-frame-transform-request
375376
DeleteDataFrameTransformRequest request =
376377
new DeleteDataFrameTransformRequest("mega-transform"); // <1>
378+
request.setForce(false); // <2>
377379
// end::delete-data-frame-transform-request
378380

379381
// tag::delete-data-frame-transform-execute

client/rest/src/test/java/org/elasticsearch/client/RestClientBuilderIntegTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ private static SSLContext getSslContext() throws Exception {
134134
* 12.0.1 so we pin to TLSv1.2 when running on an earlier JDK
135135
*/
136136
private static String getProtocol() {
137-
String version = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("java.specification.version"));
137+
String version = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("java.version"));
138138
String[] components = version.split("\\.");
139139
if (components.length > 0) {
140140
final int major = Integer.valueOf(components[0]);

distribution/src/bin/elasticsearch-service.bat

+4
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ if exist "%JAVA_HOME%\bin\server\jvm.dll" (
106106
)
107107

108108
:foundJVM
109+
if not defined ES_TMPDIR (
110+
for /f "tokens=* usebackq" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.TempDirectory"`) do set ES_TMPDIR=%%a
111+
)
112+
109113
set ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options
110114

111115
if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;%

distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java

+17-8
Original file line numberDiff line numberDiff line change
@@ -500,17 +500,26 @@ private Path downloadAndValidate(
500500
}
501501
}
502502

503-
try {
504-
final byte[] zipBytes = Files.readAllBytes(zip);
505-
final String actualChecksum = MessageDigests.toHexString(MessageDigest.getInstance(digestAlgo).digest(zipBytes));
506-
if (expectedChecksum.equals(actualChecksum) == false) {
507-
throw new UserException(
503+
// read the bytes of the plugin zip in chunks to avoid out of memory errors
504+
try (InputStream zis = Files.newInputStream(zip)) {
505+
try {
506+
final MessageDigest digest = MessageDigest.getInstance(digestAlgo);
507+
final byte[] bytes = new byte[8192];
508+
int read;
509+
while ((read = zis.read(bytes)) != -1) {
510+
assert read > 0 : read;
511+
digest.update(bytes, 0, read);
512+
}
513+
final String actualChecksum = MessageDigests.toHexString(digest.digest());
514+
if (expectedChecksum.equals(actualChecksum) == false) {
515+
throw new UserException(
508516
ExitCodes.IO_ERROR,
509517
digestAlgo + " mismatch, expected " + expectedChecksum + " but got " + actualChecksum);
518+
}
519+
} catch (final NoSuchAlgorithmException e) {
520+
// this should never happen as we are using SHA-1 and SHA-512 here
521+
throw new AssertionError(e);
510522
}
511-
} catch (final NoSuchAlgorithmException e) {
512-
// this should never happen as we are using SHA-1 and SHA-512 here
513-
throw new AssertionError(e);
514523
}
515524

516525
if (officialPlugin) {

docs/java-rest/high-level/dataframe/delete_data_frame.asciidoc

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ A +{request}+ object requires a non-null `id`.
1616
include-tagged::{doc-tests-file}[{api}-request]
1717
---------------------------------------------------
1818
<1> Constructing a new request referencing an existing {dataframe-transform}
19+
<2> Sets the optional argument `force`. When `true`, the {dataframe-transform}
20+
is deleted regardless of its current state. The default value is `false`,
21+
meaning that only `stopped` {dataframe-transforms} can be deleted.
1922

2023
include::../execution.asciidoc[]
2124

docs/java-rest/high-level/dataframe/put_data_frame.asciidoc

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ A +{request}+ requires the following argument:
2020
include-tagged::{doc-tests-file}[{api}-request]
2121
--------------------------------------------------
2222
<1> The configuration of the {dataframe-transform} to create
23+
<2> Whether or not to wait to run deferrable validations until `_start` is called.
24+
This option should be used with care as the created {dataframe-transform} will run
25+
with the privileges of the user creating it. Meaning, if they do not have privileges,
26+
such an error will not be visible until `_start` is called.
2327

2428
[id="{upid}-{api}-config"]
2529
==== Data Frame Transform Configuration

docs/reference/data-frames/apis/delete-transform.asciidoc

+7
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ see {stack-ov}/security-privileges.html[Security privileges] and
3434
`<data_frame_transform_id>`::
3535
(Required, string) Identifier for the {dataframe-transform}.
3636

37+
[[delete-data-frame-transform-query-parms]]
38+
==== {api-query-parms-title}
39+
40+
`force`::
41+
(Optional, boolean) When `true`, the {dataframe-transform} is deleted regardless of its
42+
current state. The default value is `false`, meaning that the {dataframe-transform} must be
43+
`stopped` before it can be deleted.
3744

3845
[[delete-data-frame-transform-examples]]
3946
==== {api-examples-title}

0 commit comments

Comments
 (0)