@@ -253,17 +253,23 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
253
253
)
254
254
255
255
# 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
260
258
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
267
273
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
268
274
vmMemoryHighWatermark=
269
275
if [ " ${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:- } " ]; then
@@ -302,18 +308,16 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
302
308
) "
303
309
elif [ -n " $memLimitB " ]; then
304
310
# 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 } ' ) }"
306
312
# otherwise let the default behavior win (40% of the total available)
307
313
fi
308
314
if [ " $vmMemoryHighWatermark " ]; then
309
315
# https://www.rabbitmq.com/memory.html#memsup-usage
310
316
rabbitConfig+=( " { vm_memory_high_watermark, $vmMemoryHighWatermark }" )
311
317
fi
312
318
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)'
317
321
fi
318
322
319
323
if [ " $haveSslConfig " ]; then
0 commit comments