2022-04-20 20:05:56 +08:00
@ echo off
REM This Source Code Form is subject to the terms of the Mozilla Public
REM License, v. 2.0. If a copy of the MPL was not distributed with this
REM file, You can obtain one at https://mozilla.org/MPL/2.0/.
REM
2024-02-06 00:53:36 +08:00
REM Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
2022-04-20 20:05:56 +08:00
REM
setlocal
rem Preserve values that might contain exclamation marks before
rem enabling delayed expansion
set TDP0 = %~dp0
set STAR = %*
set CONF_SCRIPT_DIR = %~dp0
setlocal enabledelayedexpansion
setlocal enableextensions
if ERRORLEVEL 1 (
echo " Failed to enable command extensions! "
exit /B 1
)
REM Get default settings with user overrides for (RABBITMQ_)<var_name>
REM Non-empty defaults should be set in rabbitmq-env
call " %TDP0% \rabbitmq-env.bat " %~n0
if not exist " !ERLANG_HOME! \bin\erl.exe " (
echo .
echo ******************************
echo ERLANG_HOME not set correctly.
echo ******************************
echo .
echo Please either set ERLANG_HOME to point to your Erlang installation or place the
echo RabbitMQ server distribution in the Erlang lib folder.
echo .
exit /B 1
)
set RABBITMQ_DEFAULT_ALLOC_ARGS = +MBas ageffcbf +MHas ageffcbf +MBlmbcs 512 +MHlmbcs 512 +MMmcs 30
set RABBITMQ_START_RABBIT =
if " !RABBITMQ_ALLOW_INPUT! " == " " (
set RABBITMQ_START_RABBIT = !RABBITMQ_START_RABBIT! -noinput
)
if " !RABBITMQ_NODE_ONLY! " == " " (
set RABBITMQ_START_RABBIT = !RABBITMQ_START_RABBIT! -s " !RABBITMQ_BOOT_MODULE! " boot
)
set ENV_OK = true
CALL : check_not_empty " RABBITMQ_BOOT_MODULE " !RABBITMQ_BOOT_MODULE!
if " !ENV_OK! " == " false " (
EXIT /b 78
)
if " !RABBITMQ_ALLOW_INPUT! " == " " (
set ERL_CMD = erl.exe
) else (
set ERL_CMD = werl.exe
)
" !ERLANG_HOME! \bin\!ERL_CMD! " ^
!RABBITMQ_START_RABBIT! ^
-boot " !SASL_BOOT_FILE! " ^
+W w ^
!RABBITMQ_DEFAULT_ALLOC_ARGS! ^
!RABBITMQ_SERVER_ERL_ARGS! ^
!RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS! ^
!RABBITMQ_SERVER_START_ARGS! ^
-syslog logger [] ^
-syslog syslog_error_logger false ^
Revert "Set kernel param prevent_overlapping_partitions to true"
This reverts commit 8070344a38b5d3efb2e6687c73e0a163c12bd5aa.
We learnt during the last 6 days on master branch that RabbitMQ
- as of today - is not compatible with kernel parameter
`prevent_overlapping_partitions` set to `true`.
RabbitMQ explicitly disconnects node in at least two places:
1. rabbit_node_monitor to "promote" a partial network partition
to a full partition, and
2. rabbit_mnesia after a node reset to disconnect it from the
rest of the cluster.
There is no atomicity in the way we disconnect several nodes,
because it's a simple loop. Therefore, remote nodes may/will detect
disconnection at different times obviously. In global's new
behavior behind prevent_overlapping_partitions, our attempt to
disconnect all nodes in rabbit_mnesia creates a partial network
partition from global's point of view, leading to a complete
disconnection of the cluster.
For example, test
```
make ct-clustering_management t=cluster_size_3:join_and_part_cluster
```
was flaky and demonstrates the 2nd bullet point above where RabbitMQ
interfering with Erlang distribution conflicts with global's
prevent_overlapping_partitions.
When RabbitMQ resets a node, its last step is to loop over
clustered nodes and disconnect from them one at a time.
In this test with a 3-node cluster where we reset node A:
1. Node A instructs node B and C to remove node A from their view
of the cluster
2. Node A disconnects from node B
3. global on node B get a nodedow event for node A, but node C is
still connected to node A
4. global on node B concludes there is a network partition and
disconnect from node A and node C
At this point, each node is on its own.
Nothing in RabbitMQ tries to restore the connection between
nodes B and C.
The correct path forward is:
1. Get rid of Mnesia replacing it with Khepri.
2. Once mirrored classic queues are removed, get rid of rabbit_node_monitor.
3. Have a clear and consistent view of the nodes comprising a RabbitMQ Cluster:
In other words, do not use different sources of truths like nodes(),
Mnesia, Ra clusters, global monitor at different places in the code.
For the time being we live with `prevent_overlapping_partitions` set to `false`
and with the workaround for global:sync/0 being stuck introduced in
https://github.com/rabbitmq/rabbitmq-server/commit/9fcb31f348590a74fd526333cf881cfbe27241e6
2022-08-11 00:33:41 +08:00
-kernel prevent_overlapping_partitions false ^
2022-04-20 20:05:56 +08:00
!STAR!
if ERRORLEVEL 1 (
exit /B %ERRORLEVEL%
)
EXIT /B 0
: check_not_empty
if " %~2 " == " " (
ECHO " Error: ENV variable should be defined: %1 . Please check rabbitmq-env and rabbitmq-defaults, and !RABBITMQ_CONF_ENV_FILE! script files. Check also your Environment Variables settings "
set ENV_OK = false
EXIT /B 78
)
EXIT /B 0
endlocal
endlocal
endlocal