Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<Integer> AVAILABLE_PROCESSORS = Suppliers
.memoizeWithExpiration(Runtime.getRuntime()::availableProcessors, 30, TimeUnit.SECONDS);

@Inject
public LocalMemoryManager(NodeMemoryConfig config)
{
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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()
Expand Down
Loading