diff --git a/core/trino-main/src/main/java/io/trino/memory/LocalMemoryManager.java b/core/trino-main/src/main/java/io/trino/memory/LocalMemoryManager.java index e32b5ad4cf0..a54837205d6 100644 --- a/core/trino-main/src/main/java/io/trino/memory/LocalMemoryManager.java +++ b/core/trino-main/src/main/java/io/trino/memory/LocalMemoryManager.java @@ -14,21 +14,23 @@ package io.trino.memory; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.inject.Inject; import io.airlift.units.DataSize; -import java.lang.management.ManagementFactory; -import java.lang.management.OperatingSystemMXBean; +import java.util.concurrent.TimeUnit; import static com.google.common.base.Verify.verify; import static java.lang.String.format; public final class LocalMemoryManager { - private static final OperatingSystemMXBean OPERATING_SYSTEM_MX_BEAN = ManagementFactory.getOperatingSystemMXBean(); - private final MemoryPool memoryPool; + private static final Supplier AVAILABLE_PROCESSORS = Suppliers + .memoizeWithExpiration(Runtime.getRuntime()::availableProcessors, 30, TimeUnit.SECONDS); + @Inject public LocalMemoryManager(NodeMemoryConfig config) { @@ -61,7 +63,7 @@ private void validateHeapHeadroom(NodeMemoryConfig config, long availableMemory) public MemoryInfo getInfo() { - return new MemoryInfo(OPERATING_SYSTEM_MX_BEAN.getAvailableProcessors(), memoryPool.getInfo()); + return new MemoryInfo(AVAILABLE_PROCESSORS.get(), memoryPool.getInfo()); } public MemoryPool getMemoryPool() diff --git a/core/trino-main/src/main/java/io/trino/server/TrinoSystemRequirements.java b/core/trino-main/src/main/java/io/trino/server/TrinoSystemRequirements.java index f1e9067512b..6f982673d4b 100644 --- a/core/trino-main/src/main/java/io/trino/server/TrinoSystemRequirements.java +++ b/core/trino-main/src/main/java/io/trino/server/TrinoSystemRequirements.java @@ -29,8 +29,6 @@ import java.time.Year; import java.util.List; import java.util.Locale; -import java.util.OptionalLong; -import java.util.stream.Stream; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.String.format; @@ -55,11 +53,19 @@ private static void verifyJvmRequirements() verifyOsArchitecture(); verifyByteOrder(); verifyUsingG1Gc(); + verifyUnixOperatingMBeans(); verifyFileDescriptor(); verifySlice(); verifyUtf8(); } + private static void verifyUnixOperatingMBeans() + { + if (!(ManagementFactory.getOperatingSystemMXBean() instanceof UnixOperatingSystemMXBean)) { + failRequirement("Trino requires access to UnixOperatingSystemMXBean"); + } + } + private static void verify64BitJvm() { String dataModel = System.getProperty("sun.arch.data.model"); @@ -125,26 +131,19 @@ private static void verifyUsingG1Gc() private static void verifyFileDescriptor() { - OptionalLong maxFileDescriptorCount = getMaxFileDescriptorCount(); - if (maxFileDescriptorCount.isEmpty()) { - // This should never happen since we have verified the OS and JVM above - failRequirement("Cannot read OS file descriptor limit"); - } - if (maxFileDescriptorCount.getAsLong() < MIN_FILE_DESCRIPTORS) { - failRequirement("Trino requires at least %s file descriptors (found %s)", MIN_FILE_DESCRIPTORS, maxFileDescriptorCount.getAsLong()); + long maxFileDescriptorCount = getMaxFileDescriptorCount(); + if (maxFileDescriptorCount < MIN_FILE_DESCRIPTORS) { + failRequirement("Trino requires at least %s file descriptors (found %s)", MIN_FILE_DESCRIPTORS, maxFileDescriptorCount); } - if (maxFileDescriptorCount.getAsLong() < RECOMMENDED_FILE_DESCRIPTORS) { - warnRequirement("Current OS file descriptor limit is %s. Trino recommends at least %s", maxFileDescriptorCount.getAsLong(), RECOMMENDED_FILE_DESCRIPTORS); + if (maxFileDescriptorCount < RECOMMENDED_FILE_DESCRIPTORS) { + warnRequirement("Current OS file descriptor limit is %s. Trino recommends at least %s", maxFileDescriptorCount, RECOMMENDED_FILE_DESCRIPTORS); } } - private static OptionalLong getMaxFileDescriptorCount() + private static long getMaxFileDescriptorCount() { - return Stream.of(ManagementFactory.getOperatingSystemMXBean()) - .filter(UnixOperatingSystemMXBean.class::isInstance) - .map(UnixOperatingSystemMXBean.class::cast) - .mapToLong(UnixOperatingSystemMXBean::getMaxFileDescriptorCount) - .findFirst(); + // This is safe because we have already verified the OS and JVM above + return ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getMaxFileDescriptorCount(); } private static void verifySlice()