mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-04-23 14:47:31 -04:00
Elasticsearch requires access to some native functions. Historically this has been achieved with the JNA library. However, JNA is a complicated, magical library, and has caused various problems booting Elasticsearch over the years. The new Java Foreign Function and Memory API allows access to call native functions directly from Java. It also has the advantage of tight integration with hotspot which can improve performance of these functions (though performance of Elasticsearch's native calls has never been much of an issue since they are mostly at boot time). This commit adds a new native lib that is internal to Elasticsearch. It is built to use the foreign function api starting with Java 21, and continue using JNA with Java versions below that. Only one function, checking whether Elasticsearch is running as root, is migrated. Future changes will migrate other native functions.
272 lines
11 KiB
Groovy
272 lines
11 KiB
Groovy
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License
|
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
|
* Side Public License, v 1.
|
|
*/
|
|
|
|
import org.elasticsearch.gradle.internal.info.BuildParams
|
|
|
|
apply plugin: 'elasticsearch.build'
|
|
apply plugin: 'elasticsearch.publish'
|
|
apply plugin: 'elasticsearch.internal-cluster-test'
|
|
apply plugin: 'elasticsearch.internal-test-artifact'
|
|
|
|
publishing {
|
|
publications {
|
|
elastic {
|
|
artifactId 'elasticsearch'
|
|
}
|
|
}
|
|
}
|
|
|
|
base {
|
|
archivesName = 'elasticsearch'
|
|
}
|
|
|
|
dependencies {
|
|
|
|
api project(':libs:elasticsearch-core')
|
|
api project(':libs:elasticsearch-logging')
|
|
api project(':libs:elasticsearch-secure-sm')
|
|
api project(':libs:elasticsearch-x-content')
|
|
api project(":libs:elasticsearch-geo")
|
|
api project(":libs:elasticsearch-lz4")
|
|
api project(":libs:elasticsearch-plugin-api")
|
|
api project(":libs:elasticsearch-plugin-analysis-api")
|
|
api project(':libs:elasticsearch-grok')
|
|
api project(":libs:elasticsearch-tdigest")
|
|
|
|
implementation project(':libs:elasticsearch-plugin-classloader')
|
|
// no compile dependency by server, but server defines security policy for this codebase so it i>
|
|
runtimeOnly project(":libs:elasticsearch-preallocate")
|
|
|
|
// lucene
|
|
api "org.apache.lucene:lucene-core:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-analysis-common:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-backward-codecs:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-grouping:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-highlighter:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-join:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-memory:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-misc:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-queries:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-queryparser:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-sandbox:${versions.lucene}"
|
|
api "org.apache.lucene:lucene-suggest:${versions.lucene}"
|
|
|
|
// utilities
|
|
api project(":libs:elasticsearch-cli")
|
|
implementation 'com.carrotsearch:hppc:0.8.1'
|
|
|
|
// precentil ranks aggregation
|
|
api 'org.hdrhistogram:HdrHistogram:2.1.9'
|
|
|
|
// logging
|
|
api "org.apache.logging.log4j:log4j-api:${versions.log4j}"
|
|
api "org.apache.logging.log4j:log4j-core:${versions.log4j}"
|
|
|
|
// access to native functions
|
|
implementation project(':libs:elasticsearch-native')
|
|
api "net.java.dev.jna:jna:${versions.jna}"
|
|
|
|
api "co.elastic.logging:log4j2-ecs-layout:${versions.ecsLogging}"
|
|
api "co.elastic.logging:ecs-logging-core:${versions.ecsLogging}"
|
|
|
|
testImplementation(project(":test:framework")) {
|
|
// tests use the locally compiled version of server
|
|
exclude group: 'org.elasticsearch', module: 'server'
|
|
}
|
|
internalClusterTestImplementation(project(":test:framework")) {
|
|
exclude group: 'org.elasticsearch', module: 'server'
|
|
}
|
|
|
|
}
|
|
|
|
spotless {
|
|
java {
|
|
targetExclude "src/main/java/org/elasticsearch/index/IndexVersion.java"
|
|
}
|
|
}
|
|
|
|
tasks.named("forbiddenPatterns").configure {
|
|
exclude '**/*.json'
|
|
exclude '**/*.jmx'
|
|
exclude '**/*.dic'
|
|
exclude '**/*.binary'
|
|
exclude '**/*.st'
|
|
}
|
|
|
|
tasks.named('forbiddenApisMain').configure {
|
|
addSignatureFiles 'hppc-signatures'
|
|
}
|
|
tasks.named('forbiddenApisTest').configure {
|
|
addSignatureFiles 'hppc-signatures'
|
|
}
|
|
|
|
tasks.named('internalClusterTestTestingConventions').configure {
|
|
baseClass "org.elasticsearch.test.AbstractMultiClustersTestCase"
|
|
baseClass "org.elasticsearch.test.ESIntegTestCase"
|
|
baseClass "org.elasticsearch.test.ESSingleNodeTestCase"
|
|
}
|
|
|
|
File generatedResourcesDir = new File(buildDir, 'generated-resources')
|
|
def generateModulesList = tasks.register("generateModulesList") {
|
|
List<String> modules = project(':modules').subprojects.collect { it.name }
|
|
modules.add('x-pack')
|
|
File modulesFile = new File(generatedResourcesDir, "modules.txt")
|
|
inputs.property('modules', modules)
|
|
outputs.file(modulesFile)
|
|
doLast {
|
|
modulesFile.parentFile.mkdirs()
|
|
modulesFile.setText(modules.join('\n'), 'UTF-8')
|
|
}
|
|
}
|
|
|
|
def generatePluginsList = tasks.register("generatePluginsList") {
|
|
Set<String> plugins = new TreeSet<>(project(':plugins').childProjects.keySet())
|
|
plugins.remove('example')
|
|
|
|
File pluginsFile = new File(generatedResourcesDir, 'plugins.txt')
|
|
inputs.property('plugins', plugins)
|
|
outputs.file(pluginsFile)
|
|
doLast {
|
|
pluginsFile.parentFile.mkdirs()
|
|
pluginsFile.setText(plugins.join('\n'), 'UTF-8')
|
|
}
|
|
}
|
|
|
|
sourceSets.main.output.dir(generatedResourcesDir)
|
|
sourceSets.main.compiledBy(generateModulesList, generatePluginsList)
|
|
|
|
if (BuildParams.isSnapshotBuild() == false) {
|
|
tasks.named("test").configure {
|
|
systemProperty 'es.index_mode_feature_flag_registered', 'true'
|
|
systemProperty 'es.failure_store_feature_flag_enabled', 'true'
|
|
}
|
|
tasks.named("internalClusterTest").configure {
|
|
systemProperty 'es.index_mode_feature_flag_registered', 'true'
|
|
systemProperty 'es.failure_store_feature_flag_enabled', 'true'
|
|
}
|
|
}
|
|
|
|
tasks.named("test").configure {
|
|
systemProperty 'es.insecure_network_trace_enabled', 'true'
|
|
}
|
|
|
|
tasks.named("thirdPartyAudit").configure {
|
|
ignoreMissingClasses(
|
|
// from com.fasterxml.jackson.dataformat.yaml.YAMLMapper (jackson-dataformat-yaml)
|
|
'com.fasterxml.jackson.databind.ObjectMapper',
|
|
|
|
// from log4j
|
|
'com.conversantmedia.util.concurrent.SpinPolicy',
|
|
'com.fasterxml.jackson.core.JsonGenerator',
|
|
'com.fasterxml.jackson.core.JsonParser',
|
|
'com.fasterxml.jackson.core.JsonParser$Feature',
|
|
'com.fasterxml.jackson.core.JsonToken',
|
|
'com.fasterxml.jackson.core.PrettyPrinter',
|
|
'com.fasterxml.jackson.core.type.TypeReference',
|
|
'com.fasterxml.jackson.dataformat.yaml.YAMLMapper',
|
|
'com.fasterxml.jackson.databind.SerializationFeature',
|
|
'com.fasterxml.jackson.annotation.JsonInclude$Include',
|
|
'com.fasterxml.jackson.databind.DeserializationContext',
|
|
'com.fasterxml.jackson.databind.DeserializationFeature',
|
|
'com.fasterxml.jackson.databind.JsonMappingException',
|
|
'com.fasterxml.jackson.databind.JsonNode',
|
|
'com.fasterxml.jackson.databind.Module$SetupContext',
|
|
'com.fasterxml.jackson.databind.ObjectReader',
|
|
'com.fasterxml.jackson.databind.ObjectWriter',
|
|
'com.fasterxml.jackson.databind.SerializerProvider',
|
|
'com.fasterxml.jackson.databind.deser.std.StdDeserializer',
|
|
'com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer',
|
|
'com.fasterxml.jackson.databind.module.SimpleModule',
|
|
'com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter',
|
|
'com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider',
|
|
'com.fasterxml.jackson.databind.ser.std.StdScalarSerializer',
|
|
'com.fasterxml.jackson.databind.ser.std.StdSerializer',
|
|
'com.fasterxml.jackson.dataformat.xml.JacksonXmlModule',
|
|
'com.fasterxml.jackson.dataformat.xml.XmlMapper',
|
|
'com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter',
|
|
'org.fusesource.jansi.Ansi',
|
|
'org.fusesource.jansi.AnsiRenderer$Code',
|
|
'com.lmax.disruptor.EventFactory',
|
|
'com.lmax.disruptor.EventTranslator',
|
|
'com.lmax.disruptor.EventTranslatorTwoArg',
|
|
'com.lmax.disruptor.EventTranslatorVararg',
|
|
'com.lmax.disruptor.ExceptionHandler',
|
|
'com.lmax.disruptor.LifecycleAware',
|
|
'com.lmax.disruptor.RingBuffer',
|
|
'com.lmax.disruptor.Sequence',
|
|
'com.lmax.disruptor.SequenceBarrier',
|
|
'com.lmax.disruptor.SequenceReportingEventHandler',
|
|
'com.lmax.disruptor.TimeoutException',
|
|
'com.lmax.disruptor.WaitStrategy',
|
|
'com.lmax.disruptor.dsl.Disruptor',
|
|
'com.lmax.disruptor.dsl.ProducerType',
|
|
'javax.jms.Connection',
|
|
'javax.jms.ConnectionFactory',
|
|
'javax.jms.Destination',
|
|
'javax.jms.JMSException',
|
|
'javax.jms.MapMessage',
|
|
'javax.jms.Message',
|
|
'javax.jms.MessageConsumer',
|
|
'javax.jms.MessageProducer',
|
|
'javax.jms.Session',
|
|
'javax.mail.Authenticator',
|
|
'javax.mail.Message$RecipientType',
|
|
'javax.mail.PasswordAuthentication',
|
|
'javax.mail.Session',
|
|
'javax.mail.Transport',
|
|
'javax.mail.internet.InternetAddress',
|
|
'javax.mail.internet.InternetHeaders',
|
|
'javax.mail.internet.MimeMessage',
|
|
'javax.mail.internet.MimeMultipart',
|
|
'javax.mail.internet.MimeUtility',
|
|
'org.apache.commons.compress.compressors.CompressorStreamFactory',
|
|
'org.apache.commons.compress.utils.IOUtils',
|
|
'org.apache.commons.csv.CSVFormat',
|
|
'org.apache.commons.csv.QuoteMode',
|
|
'org.apache.kafka.clients.producer.Producer',
|
|
'org.apache.kafka.clients.producer.RecordMetadata',
|
|
'org.codehaus.stax2.XMLStreamWriter2',
|
|
'org.jctools.queues.MpscArrayQueue',
|
|
'org.osgi.framework.Bundle',
|
|
'org.osgi.framework.BundleActivator',
|
|
'org.osgi.framework.BundleContext',
|
|
'org.osgi.framework.BundleEvent',
|
|
'org.osgi.framework.BundleReference',
|
|
'org.osgi.framework.FrameworkUtil',
|
|
'org.osgi.framework.ServiceReference',
|
|
'org.osgi.framework.ServiceRegistration',
|
|
'org.osgi.framework.SynchronousBundleListener',
|
|
'org.osgi.framework.wiring.BundleWire',
|
|
'org.osgi.framework.wiring.BundleWiring',
|
|
'org.zeromq.ZMQ$Context',
|
|
'org.zeromq.ZMQ$Socket',
|
|
'org.zeromq.ZMQ',
|
|
)
|
|
ignoreMissingClasses 'javax.xml.bind.DatatypeConverter'
|
|
}
|
|
|
|
tasks.named("dependencyLicenses").configure {
|
|
mapping from: /lucene-.*/, to: 'lucene'
|
|
mapping from: /log4j-.*/, to: 'log4j'
|
|
dependencies = project.configurations.runtimeClasspath.fileCollection {
|
|
it.group.startsWith('org.elasticsearch') == false ||
|
|
// keep the following org.elasticsearch jars in
|
|
(it.name == 'jna' ||
|
|
it.name == 'securesm')
|
|
}
|
|
}
|
|
|
|
tasks.named("licenseHeaders").configure {
|
|
// Ignore our vendored version of Google Guice
|
|
excludes << 'org/elasticsearch/common/inject/**/*'
|
|
// Ignore temporary copies of impending 8.7 Lucene classes
|
|
excludes << 'org/apache/lucene/search/RegExp87*'
|
|
excludes << 'org/apache/lucene/search/RegexpQuery87*'
|
|
}
|
|
|
|
tasks.withType(Checkstyle.class).configureEach { t -> t.getMaxHeapSize().set("2g") }
|