mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-09-11 21:20:39 +02:00
Merge bitcoin/bitcoin#34937: Fix startup failure with RLIM_INFINITY fd limits
735b25519asupport: clamp RLIMIT_MEMLOCK to size_t (Sjors Provoost)8ab4b9fc85init: clamp fd limits to int (Sjors Provoost)4afbabdcefFix startup failure with RLIM_INFINITY fd limits (Sjors Provoost) Pull request description: When setting the fd limit to unlimited, the node fails to start: ```sh ulimit -n unlimited build/bin/bitcoind Error: Not enough file descriptors available. -1 available, 160 required. ``` This was caused by `RaiseFileDescriptorLimit()` (introduced in #2568) casting `limitFD.rlim_cur` to `int`, which for `RLIM_INFINITY` overflows to `-1`. Fix it by returning `std::numeric_limits<int>::max()` instead. Some platforms implement `RLIM_INFINITY` as the maximum uint64, others as int64 (-1). So simply changing the return type to `uint64_t` wouldn't work. Similarly, though unlikely to actually happen: ```sh ulimit -n 214748364 build/bin/bitcoind Error: Not enough file descriptors available. -2147483648 available, 160 required. ``` The second commit expands the fix by clamping all values above `std::numeric_limits<int>::max()` instead of letting them overflow. This PR also expands `test/functional/feature_init.py` to cover these, using `resource.setrlimit`. The check is skipped on environments with a hard limit below infinity (or that don't have the Python [Resource module](https://docs.python.org/3/library/resource.html)). macOS by default has a hard limit of infinity, but on e.g. Ubuntu the default hard limit is 524288. The third commit applies a similar fix to `PosixLockedPageAllocator::GetLimit()` for 32-bit systems, but without a test. ACKs for top commit: winterrdog: Re-ACK735b25519aachow101: ACK735b25519asedited: Re-ACK735b25519apinheadmz: ACK735b25519aTree-SHA512: 0ce0292ecd61456bdec6943b06cbb9ecfc5180ee6dce850f8496ef54af22c1fae6ea473085202f5ba6f72e4dc51a29247620c9a0eae31e96658adc77b293129f
This commit is contained in:
@@ -8,6 +8,7 @@ import configparser
|
||||
from enum import Enum
|
||||
import argparse
|
||||
from datetime import datetime, timezone
|
||||
from importlib.util import find_spec
|
||||
import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
@@ -1082,6 +1083,17 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
||||
if not self.has_previous_releases():
|
||||
raise SkipTest("previous releases not available or disabled")
|
||||
|
||||
def has_resource_module(self):
|
||||
"""Checks whether the resource module is available."""
|
||||
return find_spec('resource') is not None
|
||||
|
||||
@property
|
||||
def RLIM_INFINITY(self):
|
||||
if not self.has_resource_module():
|
||||
return None
|
||||
import resource
|
||||
return resource.RLIM_INFINITY
|
||||
|
||||
def has_previous_releases(self):
|
||||
"""Checks whether previous releases are present and enabled."""
|
||||
if not os.path.isdir(self.options.previous_releases_path):
|
||||
|
||||
Reference in New Issue
Block a user