Skip to content

Instantly share code, notes, and snippets.

@zmstone
Last active January 15, 2025 09:25
Show Gist options
  • Save zmstone/3faede2b3079f8ed88f076e5e593d1d5 to your computer and use it in GitHub Desktop.
Save zmstone/3faede2b3079f8ed88f076e5e593d1d5 to your computer and use it in GitHub Desktop.
Start 3 EMQX nodes to form a cluster
#!/usr/bin/env bash
set -euo pipefail
DEFAULT_IMAGE='emqx:5.8.4'
IMAGE="${1:-$DEFAULT_IMAGE}"
NET='emqx.io'
NODE1="node1.$NET"
NODE2="node2.$NET"
NODE3="node3.$NET"
COOKIE='this-is-a-secret'
cleanup() {
docker rm -f "$NODE1" >/dev/null 2>&1 || true
docker rm -f "$NODE2" >/dev/null 2>&1 || true
docker rm -f "$NODE3" >/dev/null 2>&1 || true
docker network rm "$NET" >/dev/null 2>&1 || true
}
cleanup
docker network create "$NET"
wait_limit=60
wait_for_emqx() {
container="$1"
wait_limit="$2"
wait_sec=0
while ! docker exec "$container" emqx ctl status; do
wait_sec=$(( wait_sec + 1 ))
if [ $wait_sec -gt "$wait_limit" ]; then
echo "timeout wait for EMQX"
exit 1
fi
echo -n '.'
sleep 1
done
}
docker_run() {
local nodename="$1"
docker run -d -t --name "$nodename" \
--net "$NET" \
-e EMQX_NODE_NAME="emqx@${nodename}" \
-e EMQX_NODE_COOKIE="$COOKIE" \
-e EMQX_listeners__ssl__default__enable=false \
-e EMQX_listeners__wss__default__enable=false \
-e EMQX_listeners__tcp__default__proxy_protocol=true \
-e EMQX_listeners__ws__default__proxy_protocol=true \
"$IMAGE" emqx foreground
}
# Start 3 nodes
docker_run "$NODE1"
docker_run "$NODE2"
docker_run "$NODE3"
# Wait for 3 nodes
wait_for_emqx "$NODE1" 30
wait_for_emqx "$NODE2" 30
wait_for_emqx "$NODE3" 30
# Start testing schema merge issue
# make node2 join node1 to form cluster
docker exec $NODE2 emqx ctl cluster join "emqx@$NODE1"
# wait for all apps to boot
sleep 5
# stop node 2
docker stop $NODE2
# make node3 join node1 to form cluster
docker exec $NODE3 emqx ctl cluster join "emqx@$NODE1"
wait_for_emqx "$NODE3" 30
docker start $NODE2
wait_for_emqx "$NODE2" 30
# Without fix, there is log like below:
# ** FATAL ** Failed to merge schema: {aborted,function_clause}
docker logs -f $NODE2
# To verify fix: inspect merged schema with:
# docker exec -it $NODE2 emqx remote_console
# > rr(mnesia_schema).
# > mnesia:table_info('$mria_rlog_sync', cstruct).
@zmstone
Copy link
Author

zmstone commented Jan 13, 2025

This script is to test PR: emqx/otp#66 and erlang/otp#9290

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment