Skip to content

Commit 3c96086

Browse files
Merge branch 'main' into ia-enable-ccm-by-default
2 parents 8437cd3 + 72d2b72 commit 3c96086

File tree

165 files changed

+1912
-1027
lines changed

Some content is hidden

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

165 files changed

+1912
-1027
lines changed

docs/changelog/139244.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 139244
2+
summary: "Inference command: support for CCS"
3+
area: ES|QL
4+
type: enhancement
5+
issues:
6+
- 136860

docs/reference/query-languages/esql/_snippets/functions/examples/text_embedding.md

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/lists/time-series-aggregation-functions.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
* [`AVG_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-avg_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
33
* [`COUNT_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-count_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
44
* [`COUNT_DISTINCT_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-count_distinct_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
5-
* [`DELTA`](../../functions-operators/time-series-aggregation-functions.md#esql-rate) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
5+
* [`DELTA`](../../functions-operators/time-series-aggregation-functions.md#esql-delta) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
66
* [`FIRST_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-first_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
7-
* [`IDELTA`](../../functions-operators/time-series-aggregation-functions.md#esql-rate) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
8-
* [`INCREASE`](../../functions-operators/time-series-aggregation-functions.md#esql-rate) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
9-
* [`IRATE`](../../functions-operators/time-series-aggregation-functions.md#esql-rate) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
7+
* [`IDELTA`](../../functions-operators/time-series-aggregation-functions.md#esql-idelta) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
8+
* [`INCREASE`](../../functions-operators/time-series-aggregation-functions.md#esql-increase) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
9+
* [`IRATE`](../../functions-operators/time-series-aggregation-functions.md#esql-irate) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
1010
* [`LAST_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-last_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
1111
* [`MAX_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-max_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`
1212
* [`MIN_OVER_TIME`](../../functions-operators/time-series-aggregation-functions.md#esql-min_over_time) {applies_to}`stack: preview 9.2` {applies_to}`serverless: preview`

docs/reference/query-languages/esql/kibana/definition/functions/text_embedding.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/GeoIpTaskState.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
package org.elasticsearch.ingest.geoip;
1111

1212
import org.elasticsearch.TransportVersion;
13-
import org.elasticsearch.TransportVersions;
1413
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1514
import org.elasticsearch.common.io.stream.StreamInput;
1615
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -44,10 +43,6 @@
4443

4544
public class GeoIpTaskState implements PersistentTaskState, VersionedNamedWriteable {
4645

47-
private static boolean includeSha256(TransportVersion version) {
48-
return version.onOrAfter(TransportVersions.V_8_15_0);
49-
}
50-
5146
private static final ParseField DATABASES = new ParseField("databases");
5247

5348
static final GeoIpTaskState EMPTY = new GeoIpTaskState(Map.of());
@@ -78,14 +73,7 @@ public static GeoIpTaskState fromXContent(XContentParser parser) throws IOExcept
7873

7974
GeoIpTaskState(StreamInput input) throws IOException {
8075
databases = input.readImmutableMap(
81-
in -> new Metadata(
82-
in.readLong(),
83-
in.readVInt(),
84-
in.readVInt(),
85-
in.readString(),
86-
in.readLong(),
87-
includeSha256(in.getTransportVersion()) ? input.readOptionalString() : null
88-
)
76+
in -> new Metadata(in.readLong(), in.readVInt(), in.readVInt(), in.readString(), in.readLong(), input.readOptionalString())
8977
);
9078
}
9179

@@ -144,9 +132,7 @@ public void writeTo(StreamOutput out) throws IOException {
144132
o.writeVInt(v.lastChunk);
145133
o.writeString(v.md5);
146134
o.writeLong(v.lastCheck);
147-
if (includeSha256(o.getTransportVersion())) {
148-
o.writeOptionalString(v.sha256);
149-
}
135+
o.writeOptionalString(v.sha256);
150136
});
151137
}
152138

modules/percolator/src/test/java/org/elasticsearch/percolator/QueryBuilderStoreTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.index.mapper.TestDocumentParserContext;
3333
import org.elasticsearch.index.query.SearchExecutionContext;
3434
import org.elasticsearch.index.query.TermQueryBuilder;
35+
import org.elasticsearch.script.field.BinaryDocValuesField;
3536
import org.elasticsearch.search.SearchModule;
3637
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
3738
import org.elasticsearch.test.ESTestCase;
@@ -88,7 +89,7 @@ public void testStoringQueryBuilders() throws IOException {
8889
when(searchExecutionContext.getWriteableRegistry()).thenReturn(writableRegistry());
8990
when(searchExecutionContext.getParserConfig()).thenReturn(parserConfig());
9091
when(searchExecutionContext.getForField(fieldMapper.fieldType(), fielddataOperation)).thenReturn(
91-
new BytesBinaryIndexFieldData(fieldMapper.fullPath(), CoreValuesSourceType.KEYWORD)
92+
new BytesBinaryIndexFieldData(fieldMapper.fullPath(), CoreValuesSourceType.KEYWORD, BinaryDocValuesField::new)
9293
);
9394
when(searchExecutionContext.getFieldType(Mockito.anyString())).thenAnswer(invocation -> {
9495
final String fieldName = (String) invocation.getArguments()[0];

modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobContainer.java

Lines changed: 71 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import java.util.List;
8585
import java.util.Map;
8686
import java.util.concurrent.atomic.AtomicLong;
87+
import java.util.function.Supplier;
8788
import java.util.stream.Collectors;
8889

8990
import static org.elasticsearch.common.blobstore.support.BlobContainerUtils.getRegisterUsingConsistentRead;
@@ -144,10 +145,11 @@ public void writeBlob(OperationPurpose purpose, String blobName, InputStream inp
144145
throws IOException {
145146
assert BlobContainer.assertPurposeConsistency(purpose, blobName);
146147
assert inputStream.markSupported() : "No mark support on inputStream breaks the S3 SDK's ability to retry requests";
148+
final var condition = failIfAlreadyExists ? ConditionalOperation.IF_NONE_MATCH : ConditionalOperation.NONE;
147149
if (blobSize <= getLargeBlobThresholdInBytes()) {
148-
executeSingleUpload(purpose, blobStore, buildKey(blobName), inputStream, blobSize, failIfAlreadyExists);
150+
executeSingleUpload(purpose, blobStore, buildKey(blobName), inputStream, blobSize, condition);
149151
} else {
150-
executeMultipartUpload(purpose, blobStore, buildKey(blobName), inputStream, blobSize, failIfAlreadyExists);
152+
executeMultipartUpload(purpose, blobStore, buildKey(blobName), inputStream, blobSize, condition);
151153
}
152154
}
153155

@@ -536,6 +538,59 @@ String buildKey(String blobName) {
536538
return keyPath + blobName;
537539
}
538540

541+
/**
542+
* Enumeration of mutually exlusive conditional operations supported by S3.
543+
*
544+
* @see <a href=https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html>S3-conditional-requests</a>
545+
*/
546+
sealed interface ConditionalOperation permits ConditionalOperation.IfMatch, ConditionalOperation.IfNoneMatch,
547+
ConditionalOperation.None {
548+
ConditionalOperation NONE = new None();
549+
ConditionalOperation IF_NONE_MATCH = new IfNoneMatch();
550+
551+
static ConditionalOperation ifMatch(String etag) {
552+
return new IfMatch(etag);
553+
}
554+
555+
record None() implements ConditionalOperation {}
556+
557+
record IfNoneMatch() implements ConditionalOperation {}
558+
559+
record IfMatch(String etag) implements ConditionalOperation {}
560+
}
561+
562+
static void putObject(
563+
OperationPurpose purpose,
564+
S3BlobStore s3BlobStore,
565+
String blobName,
566+
long contentLength,
567+
Supplier<RequestBody> body,
568+
ConditionalOperation condition
569+
) {
570+
final var putRequestBuilder = PutObjectRequest.builder()
571+
.bucket(s3BlobStore.bucket())
572+
.key(blobName)
573+
.contentLength(contentLength)
574+
.storageClass(s3BlobStore.getStorageClass())
575+
.acl(s3BlobStore.getCannedACL());
576+
if (s3BlobStore.serverSideEncryption()) {
577+
putRequestBuilder.serverSideEncryption(ServerSideEncryption.AES256);
578+
}
579+
if (s3BlobStore.supportsConditionalWrites(purpose)) {
580+
switch (condition) {
581+
case ConditionalOperation.IfMatch ifMatch -> putRequestBuilder.ifMatch(ifMatch.etag);
582+
case ConditionalOperation.IfNoneMatch ignored -> putRequestBuilder.ifNoneMatch("*");
583+
case ConditionalOperation.None ignored -> {
584+
}
585+
}
586+
}
587+
S3BlobStore.configureRequestForMetrics(putRequestBuilder, s3BlobStore, Operation.PUT_OBJECT, purpose);
588+
final var putRequest = putRequestBuilder.build();
589+
try (var client = s3BlobStore.clientReference()) {
590+
client.client().putObject(putRequest, body.get());
591+
}
592+
}
593+
539594
/**
540595
* Uploads a blob using a single upload request
541596
*/
@@ -545,33 +600,17 @@ void executeSingleUpload(
545600
final String blobName,
546601
final InputStream input,
547602
final long blobSize,
548-
final boolean failIfAlreadyExists
603+
final ConditionalOperation condition
549604
) throws IOException {
550-
try (var clientReference = s3BlobStore.clientReference()) {
605+
try {
551606
// Extra safety checks
552607
if (blobSize > MAX_FILE_SIZE.getBytes()) {
553608
throw new IllegalArgumentException("Upload request size [" + blobSize + "] can't be larger than " + MAX_FILE_SIZE);
554609
}
555610
if (blobSize > s3BlobStore.bufferSizeInBytes()) {
556611
throw new IllegalArgumentException("Upload request size [" + blobSize + "] can't be larger than buffer size");
557612
}
558-
559-
final var putRequestBuilder = PutObjectRequest.builder()
560-
.bucket(s3BlobStore.bucket())
561-
.key(blobName)
562-
.contentLength(blobSize)
563-
.storageClass(s3BlobStore.getStorageClass())
564-
.acl(s3BlobStore.getCannedACL());
565-
if (s3BlobStore.serverSideEncryption()) {
566-
putRequestBuilder.serverSideEncryption(ServerSideEncryption.AES256);
567-
}
568-
if (failIfAlreadyExists && s3BlobStore.supportsConditionalWrites(purpose)) {
569-
putRequestBuilder.ifNoneMatch("*");
570-
}
571-
S3BlobStore.configureRequestForMetrics(putRequestBuilder, blobStore, Operation.PUT_OBJECT, purpose);
572-
573-
final var putRequest = putRequestBuilder.build();
574-
clientReference.client().putObject(putRequest, RequestBody.fromInputStream(input, blobSize));
613+
putObject(purpose, s3BlobStore, blobName, blobSize, () -> RequestBody.fromInputStream(input, blobSize), condition);
575614
} catch (final SdkException e) {
576615
throw new IOException("Unable to upload object [" + blobName + "] using a single upload", e);
577616
}
@@ -590,7 +629,7 @@ private void executeMultipart(
590629
final long partSize,
591630
final long blobSize,
592631
final PartOperation partOperation,
593-
final boolean failIfAlreadyExists
632+
final ConditionalOperation condition
594633
) throws IOException {
595634

596635
ensureMultiPartUploadSize(blobSize);
@@ -661,8 +700,13 @@ private void executeMultipart(
661700
.uploadId(uploadId)
662701
.multipartUpload(b -> b.parts(parts));
663702

664-
if (failIfAlreadyExists && s3BlobStore.supportsConditionalWrites(purpose)) {
665-
completeMultipartUploadRequestBuilder.ifNoneMatch("*");
703+
if (s3BlobStore.supportsConditionalWrites(purpose)) {
704+
switch (condition) {
705+
case ConditionalOperation.IfMatch ifMatch -> completeMultipartUploadRequestBuilder.ifMatch(ifMatch.etag);
706+
case ConditionalOperation.IfNoneMatch ignored -> completeMultipartUploadRequestBuilder.ifNoneMatch("*");
707+
case ConditionalOperation.None ignored -> {
708+
}
709+
}
666710
}
667711

668712
S3BlobStore.configureRequestForMetrics(completeMultipartUploadRequestBuilder, blobStore, operation, purpose);
@@ -690,7 +734,7 @@ void executeMultipartUpload(
690734
final String blobName,
691735
final InputStream input,
692736
final long blobSize,
693-
final boolean failIfAlreadyExists
737+
final ConditionalOperation condition
694738
) throws IOException {
695739
executeMultipart(
696740
purpose,
@@ -708,7 +752,7 @@ void executeMultipartUpload(
708752
return CompletedPart.builder().partNumber(partNum).eTag(uploadResponse.eTag()).build();
709753
}
710754
},
711-
failIfAlreadyExists
755+
condition
712756
);
713757
}
714758

@@ -756,7 +800,7 @@ void executeMultipartCopy(
756800
return CompletedPart.builder().partNumber(partNum).eTag(uploadPartCopyResponse.copyPartResult().eTag()).build();
757801
}
758802
}),
759-
false
803+
ConditionalOperation.NONE
760804
);
761805
}
762806

0 commit comments

Comments
 (0)