Skip to content

Commit 1509b14

Browse files
committed
Adjust "vm_memory_high_watermark" code to be more forgiving about large data (such as a reported memory limit of 18446744073709551615/MAX_UINT)
1 parent 2720de9 commit 1509b14

File tree

2 files changed

+38
-30
lines changed

2 files changed

+38
-30
lines changed

3.6/alpine/docker-entrypoint.sh

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,17 +253,23 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
253253
)
254254

255255
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
256-
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
257-
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
258-
memLimitKb="$(( memLimitB / 1024 ))"
259-
256+
memTotalKb=
257+
if [ -r /proc/meminfo ]; then
260258
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
261-
262-
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
263-
memLimitB=
264-
memLimitKb=
265-
fi
266-
259+
fi
260+
memLimitB=
261+
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
262+
# "18446744073709551615" is a valid value for "memory.limit_in_bytes", which is too big for Bash math to handle
263+
# "$(( 18446744073709551615 / 1024 ))" = 0; "$(( 18446744073709551615 * 40 / 100 ))" = 0
264+
memLimitB="$(awk -v totKb="$memTotalKb" '{
265+
limB = $0;
266+
limKb = limB / 1024;
267+
if (!totKb || limKb < totKb) {
268+
printf "%.0f\n", limB;
269+
}
270+
}' /sys/fs/cgroup/memory/memory.limit_in_bytes)"
271+
fi
272+
if [ -n "$memTotalKb" ] || [ -n "$memLimitB" ]; then
267273
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
268274
vmMemoryHighWatermark=
269275
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
@@ -302,18 +308,16 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
302308
)"
303309
elif [ -n "$memLimitB" ]; then
304310
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
305-
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
311+
vmMemoryHighWatermark="{ absolute, $(awk -v lim="$memLimitB" 'BEGIN { printf "%.0f\n", lim * 0.4; exit }') }"
306312
# otherwise let the default behavior win (40% of the total available)
307313
fi
308314
if [ "$vmMemoryHighWatermark" ]; then
309315
# https://www.rabbitmq.com/memory.html#memsup-usage
310316
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
311317
fi
312318
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
313-
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
314-
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
315-
echo >&2 ' - /proc/meminfo'
316-
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
319+
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but current system memory or cgroup memory limit cannot be determined'
320+
echo >&2 ' (so "vm_memory_high_watermark" will not be set)'
317321
fi
318322

319323
if [ "$haveSslConfig" ]; then

3.6/debian/docker-entrypoint.sh

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,17 +253,23 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
253253
)
254254

255255
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
256-
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
257-
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
258-
memLimitKb="$(( memLimitB / 1024 ))"
259-
256+
memTotalKb=
257+
if [ -r /proc/meminfo ]; then
260258
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
261-
262-
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
263-
memLimitB=
264-
memLimitKb=
265-
fi
266-
259+
fi
260+
memLimitB=
261+
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
262+
# "18446744073709551615" is a valid value for "memory.limit_in_bytes", which is too big for Bash math to handle
263+
# "$(( 18446744073709551615 / 1024 ))" = 0; "$(( 18446744073709551615 * 40 / 100 ))" = 0
264+
memLimitB="$(awk -v totKb="$memTotalKb" '{
265+
limB = $0;
266+
limKb = limB / 1024;
267+
if (!totKb || limKb < totKb) {
268+
printf "%.0f\n", limB;
269+
}
270+
}' /sys/fs/cgroup/memory/memory.limit_in_bytes)"
271+
fi
272+
if [ -n "$memTotalKb" ] || [ -n "$memLimitB" ]; then
267273
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
268274
vmMemoryHighWatermark=
269275
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
@@ -302,18 +308,16 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
302308
)"
303309
elif [ -n "$memLimitB" ]; then
304310
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
305-
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
311+
vmMemoryHighWatermark="{ absolute, $(awk -v lim="$memLimitB" 'BEGIN { printf "%.0f\n", lim * 0.4; exit }') }"
306312
# otherwise let the default behavior win (40% of the total available)
307313
fi
308314
if [ "$vmMemoryHighWatermark" ]; then
309315
# https://www.rabbitmq.com/memory.html#memsup-usage
310316
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
311317
fi
312318
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
313-
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
314-
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
315-
echo >&2 ' - /proc/meminfo'
316-
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
319+
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but current system memory or cgroup memory limit cannot be determined'
320+
echo >&2 ' (so "vm_memory_high_watermark" will not be set)'
317321
fi
318322

319323
if [ "$haveSslConfig" ]; then

0 commit comments

Comments
 (0)