Skip to content

Commit 39ada69

Browse files
committed
Merge branch 'main' into retry_shard_movements_during_query
# Conflicts: # x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/DataNodeComputeHandler.java # x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/DataNodeRequestSender.java # x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plugin/DataNodeRequestSenderTests.java
2 parents 0908649 + 128144d commit 39ada69

File tree

69 files changed

+1757
-436
lines changed

Some content is hidden

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

69 files changed

+1757
-436
lines changed

docs/changelog/125631.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 125631
2+
summary: Add `documents_found` and `values_loaded`
3+
area: ES|QL
4+
type: enhancement
5+
issues: []

docs/changelog/126911.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 126911
2+
summary: Fix `vec_caps` to test for OS support too (on x64)
3+
area: Vector Search
4+
type: bug
5+
issues:
6+
- 126809

libs/native/libraries/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ configurations {
1919
}
2020

2121
var zstdVersion = "1.5.5"
22-
var vecVersion = "1.0.10"
22+
var vecVersion = "1.0.11"
2323

2424
repositories {
2525
exclusiveContent {

libs/native/src/main/java/org/elasticsearch/nativeaccess/jdk/JdkVectorLibrary.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public final class JdkVectorLibrary implements VectorLibrary {
4141
try {
4242
int caps = (int) vecCaps$mh.invokeExact();
4343
logger.info("vec_caps=" + caps);
44-
if (caps != 0) {
44+
if (caps > 0) {
4545
if (caps == 2) {
4646
dot7u$mh = downcallHandle(
4747
"dot7u_2",
@@ -67,6 +67,11 @@ public final class JdkVectorLibrary implements VectorLibrary {
6767
}
6868
INSTANCE = new JdkVectorSimilarityFunctions();
6969
} else {
70+
if (caps < 0) {
71+
logger.warn("""
72+
Your CPU supports vector capabilities, but they are disabled at OS level. For optimal performance, \
73+
enable them in your OS/Hypervisor/VM/container""");
74+
}
7075
dot7u$mh = null;
7176
sqr7u$mh = null;
7277
INSTANCE = null;

libs/simdvec/native/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ apply plugin: 'cpp'
1111

1212
var os = org.gradle.internal.os.OperatingSystem.current()
1313

14-
// To update this library run publish_vec_binaries.sh ( or ./gradlew vecSharedLibrary )
14+
// To update this library run publish_vec_binaries.sh ( or ./gradlew buildSharedLibrary )
1515
// Or
1616
// For local development, build the docker image with:
1717
// docker build --platform linux/arm64 --progress=plain --file=Dockerfile.aarch64 . (for aarch64)

libs/simdvec/native/publish_vec_binaries.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ if [ -z "$ARTIFACTORY_API_KEY" ]; then
2020
exit 1;
2121
fi
2222

23-
VERSION="1.0.10"
23+
VERSION="1.0.11"
2424
ARTIFACTORY_REPOSITORY="${ARTIFACTORY_REPOSITORY:-https://artifactory.elastic.dev/artifactory/elasticsearch-native/}"
2525
TEMP=$(mktemp -d)
2626

libs/simdvec/native/src/vec/c/amd64/vec.c

+37-3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,23 @@ static inline void cpuid(int output[4], int functionNumber) {
4646
#endif
4747
}
4848

49+
// Multi-platform XGETBV "intrinsic"
50+
static inline int64_t xgetbv(int ctr) {
51+
#if defined(__GNUC__) || defined(__clang__)
52+
// use inline assembly, Gnu/AT&T syntax
53+
uint32_t a, d;
54+
__asm("xgetbv" : "=a"(a),"=d"(d) : "c"(ctr) : );
55+
return a | (((uint64_t) d) << 32);
56+
57+
#elif (defined (_MSC_FULL_VER) && _MSC_FULL_VER >= 160040000) || (defined (__INTEL_COMPILER) && __INTEL_COMPILER >= 1200)
58+
// Microsoft or Intel compiler supporting _xgetbv intrinsic
59+
return _xgetbv(ctr);
60+
61+
#else
62+
#error Unsupported compiler
63+
#endif
64+
}
65+
4966
// Utility function to horizontally add 8 32-bit integers
5067
static inline int hsum_i32_8(const __m256i a) {
5168
const __m128i sum128 = _mm_add_epi32(_mm256_castsi256_si128(a), _mm256_extractf128_si256(a, 1));
@@ -57,11 +74,20 @@ static inline int hsum_i32_8(const __m256i a) {
5774

5875
EXPORT int vec_caps() {
5976
int cpuInfo[4] = {-1};
60-
// Calling __cpuid with 0x0 as the function_id argument
77+
// Calling CPUID function 0x0 as the function_id argument
6178
// gets the number of the highest valid function ID.
6279
cpuid(cpuInfo, 0);
6380
int functionIds = cpuInfo[0];
81+
if (functionIds == 0) {
82+
// No CPUID functions
83+
return 0;
84+
}
85+
// call CPUID function 0x1 for feature flags
86+
cpuid(cpuInfo, 1);
87+
int hasOsXsave = (cpuInfo[2] & (1 << 27)) != 0;
88+
int avxEnabledInOS = hasOsXsave && ((xgetbv(0) & 6) == 6);
6489
if (functionIds >= 7) {
90+
// call CPUID function 0x7 for AVX2/512 flags
6591
cpuid(cpuInfo, 7);
6692
int ebx = cpuInfo[1];
6793
int ecx = cpuInfo[2];
@@ -72,10 +98,18 @@ EXPORT int vec_caps() {
7298
// int avx512_vnni = (ecx & 0x00000800) != 0;
7399
// if (avx512 && avx512_vnni) {
74100
if (avx512) {
75-
return 2;
101+
if (avxEnabledInOS) {
102+
return 2;
103+
} else {
104+
return -2;
105+
}
76106
}
77107
if (avx2) {
78-
return 1;
108+
if (avxEnabledInOS) {
109+
return 1;
110+
} else {
111+
return -1;
112+
}
79113
}
80114
}
81115
return 0;

server/src/main/java/org/elasticsearch/TransportVersions.java

+1
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ static TransportVersion def(int id) {
222222
public static final TransportVersion AMAZON_BEDROCK_TASK_SETTINGS = def(9_049_0_00);
223223
public static final TransportVersion ESQL_REPORT_SHARD_PARTITIONING = def(9_050_0_00);
224224
public static final TransportVersion ESQL_QUERY_PLANNING_DURATION = def(9_051_0_00);
225+
public static final TransportVersion ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED = def(9_052_0_00);
225226

226227
/*
227228
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/common/Strings.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ public static String toString(ChunkedToXContent chunkedToXContent, boolean prett
822822
* Allows to configure the params.
823823
* Allows to control whether the outputted json needs to be pretty printed and human readable.
824824
*/
825-
private static String toString(ToXContent toXContent, ToXContent.Params params, boolean pretty, boolean human) {
825+
public static String toString(ToXContent toXContent, ToXContent.Params params, boolean pretty, boolean human) {
826826
try {
827827
XContentBuilder builder = createBuilder(pretty, human);
828828
if (toXContent.isFragment()) {

test/framework/src/main/java/org/elasticsearch/node/MockNode.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package org.elasticsearch.node;
1111

12+
import org.elasticsearch.action.search.OnlinePrewarmingService;
13+
import org.elasticsearch.action.search.OnlinePrewarmingServiceProvider;
1214
import org.elasticsearch.client.internal.node.NodeClient;
1315
import org.elasticsearch.cluster.ClusterInfoService;
1416
import org.elasticsearch.cluster.MockInternalClusterInfoService;
@@ -117,6 +119,10 @@ SearchService newSearchService(
117119
tracer
118120
);
119121
}
122+
OnlinePrewarmingService onlinePrewarmingService = pluginsService.loadSingletonServiceProvider(
123+
OnlinePrewarmingServiceProvider.class,
124+
() -> OnlinePrewarmingServiceProvider.DEFAULT
125+
).create(clusterService.getSettings(), threadPool, clusterService);
120126
return new MockSearchService(
121127
clusterService,
122128
indicesService,
@@ -126,7 +132,8 @@ SearchService newSearchService(
126132
fetchPhase,
127133
circuitBreakerService,
128134
executorSelector,
129-
tracer
135+
tracer,
136+
onlinePrewarmingService
130137
);
131138
}
132139

test/framework/src/main/java/org/elasticsearch/search/MockSearchService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ public MockSearchService(
8585
FetchPhase fetchPhase,
8686
CircuitBreakerService circuitBreakerService,
8787
ExecutorSelector executorSelector,
88-
Tracer tracer
88+
Tracer tracer,
89+
OnlinePrewarmingService onlinePrewarmingService
8990
) {
9091
super(
9192
clusterService,
@@ -97,7 +98,7 @@ public MockSearchService(
9798
circuitBreakerService,
9899
executorSelector,
99100
tracer,
100-
OnlinePrewarmingService.NOOP
101+
onlinePrewarmingService
101102
);
102103
}
103104

test/framework/src/main/java/org/elasticsearch/test/rest/ESRestTestCase.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -2672,8 +2672,13 @@ protected static MapMatcher getProfileMatcher() {
26722672
.entry("drivers", instanceOf(List.class));
26732673
}
26742674

2675-
protected static MapMatcher getResultMatcher(boolean includeMetadata, boolean includePartial) {
2675+
protected static MapMatcher getResultMatcher(boolean includeMetadata, boolean includePartial, boolean includeDocumentsFound) {
26762676
MapMatcher mapMatcher = matchesMap();
2677+
if (includeDocumentsFound) {
2678+
// Older versions may not return documents_found and values_loaded.
2679+
mapMatcher = mapMatcher.entry("documents_found", greaterThanOrEqualTo(0));
2680+
mapMatcher = mapMatcher.entry("values_loaded", greaterThanOrEqualTo(0));
2681+
}
26772682
if (includeMetadata) {
26782683
mapMatcher = mapMatcher.entry("took", greaterThanOrEqualTo(0));
26792684
}
@@ -2688,7 +2693,7 @@ protected static MapMatcher getResultMatcher(boolean includeMetadata, boolean in
26882693
* Create empty result matcher from result, taking into account all metadata items.
26892694
*/
26902695
protected static MapMatcher getResultMatcher(Map<String, Object> result) {
2691-
return getResultMatcher(result.containsKey("took"), result.containsKey("is_partial"));
2696+
return getResultMatcher(result.containsKey("took"), result.containsKey("is_partial"), result.containsKey("documents_found"));
26922697
}
26932698

26942699
/**

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/CompositeBlock.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ public int getPositionCount() {
8383

8484
@Override
8585
public int getTotalValueCount() {
86-
throw new UnsupportedOperationException("Composite block");
86+
int totalValueCount = 0;
87+
for (Block b : blocks) {
88+
totalValueCount += b.getTotalValueCount();
89+
}
90+
return totalValueCount;
8791
}
8892

8993
@Override

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/LuceneOperator.java

+5
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,11 @@ public Map<String, LuceneSliceQueue.PartitioningStrategy> partitioningStrategies
434434
return partitioningStrategies;
435435
}
436436

437+
@Override
438+
public long documentsFound() {
439+
return rowsEmitted;
440+
}
441+
437442
@Override
438443
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
439444
builder.startObject();

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/ValuesSourceReaderOperator.java

+30-7
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
import java.util.function.IntFunction;
4848
import java.util.function.Supplier;
4949

50+
import static org.elasticsearch.TransportVersions.ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED;
51+
5052
/**
5153
* Operator that extracts doc_values from a Lucene index out of pages that have been produced by {@link LuceneSourceOperator}
5254
* and outputs them to a new column.
@@ -113,6 +115,7 @@ public record ShardContext(IndexReader reader, Supplier<SourceLoader> newSourceL
113115
private final BlockFactory blockFactory;
114116

115117
private final Map<String, Integer> readersBuilt = new TreeMap<>();
118+
private long valuesLoaded;
116119

117120
int lastShard = -1;
118121
int lastSegment = -1;
@@ -165,6 +168,9 @@ public int get(int i) {
165168
}
166169
}
167170
success = true;
171+
for (Block b : blocks) {
172+
valuesLoaded += b.getTotalValueCount();
173+
}
168174
return page.appendBlocks(blocks);
169175
} catch (IOException e) {
170176
throw new UncheckedIOException(e);
@@ -547,7 +553,7 @@ public String toString() {
547553

548554
@Override
549555
protected Status status(long processNanos, int pagesProcessed, long rowsReceived, long rowsEmitted) {
550-
return new Status(new TreeMap<>(readersBuilt), processNanos, pagesProcessed, rowsReceived, rowsEmitted);
556+
return new Status(new TreeMap<>(readersBuilt), processNanos, pagesProcessed, rowsReceived, rowsEmitted, valuesLoaded);
551557
}
552558

553559
public static class Status extends AbstractPageMappingOperator.Status {
@@ -558,21 +564,34 @@ public static class Status extends AbstractPageMappingOperator.Status {
558564
);
559565

560566
private final Map<String, Integer> readersBuilt;
561-
562-
Status(Map<String, Integer> readersBuilt, long processNanos, int pagesProcessed, long rowsReceived, long rowsEmitted) {
567+
private final long valuesLoaded;
568+
569+
Status(
570+
Map<String, Integer> readersBuilt,
571+
long processNanos,
572+
int pagesProcessed,
573+
long rowsReceived,
574+
long rowsEmitted,
575+
long valuesLoaded
576+
) {
563577
super(processNanos, pagesProcessed, rowsReceived, rowsEmitted);
564578
this.readersBuilt = readersBuilt;
579+
this.valuesLoaded = valuesLoaded;
565580
}
566581

567582
Status(StreamInput in) throws IOException {
568583
super(in);
569584
readersBuilt = in.readOrderedMap(StreamInput::readString, StreamInput::readVInt);
585+
valuesLoaded = in.getTransportVersion().onOrAfter(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED) ? in.readVLong() : 0;
570586
}
571587

572588
@Override
573589
public void writeTo(StreamOutput out) throws IOException {
574590
super.writeTo(out);
575591
out.writeMap(readersBuilt, StreamOutput::writeVInt);
592+
if (out.getTransportVersion().onOrAfter(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED)) {
593+
out.writeVLong(valuesLoaded);
594+
}
576595
}
577596

578597
@Override
@@ -584,6 +603,11 @@ public Map<String, Integer> readersBuilt() {
584603
return readersBuilt;
585604
}
586605

606+
@Override
607+
public long valuesLoaded() {
608+
return valuesLoaded;
609+
}
610+
587611
@Override
588612
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
589613
builder.startObject();
@@ -592,6 +616,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
592616
builder.field(e.getKey(), e.getValue());
593617
}
594618
builder.endObject();
619+
builder.field("values_loaded", valuesLoaded);
595620
innerToXContent(builder);
596621
return builder.endObject();
597622
}
@@ -600,12 +625,12 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
600625
public boolean equals(Object o) {
601626
if (super.equals(o) == false) return false;
602627
Status status = (Status) o;
603-
return readersBuilt.equals(status.readersBuilt);
628+
return readersBuilt.equals(status.readersBuilt) && valuesLoaded == status.valuesLoaded;
604629
}
605630

606631
@Override
607632
public int hashCode() {
608-
return Objects.hash(super.hashCode(), readersBuilt);
633+
return Objects.hash(super.hashCode(), readersBuilt, valuesLoaded);
609634
}
610635

611636
@Override
@@ -710,6 +735,4 @@ public BlockLoader.AggregateMetricDoubleBuilder aggregateMetricDoubleBuilder(int
710735
return factory.newAggregateMetricDoubleBlockBuilder(count);
711736
}
712737
}
713-
714-
// TODO tests that mix source loaded fields and doc values in the same block
715738
}

0 commit comments

Comments
 (0)