Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions demo/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[*.sh]
indent_style = space
indent_size = 2
2 changes: 1 addition & 1 deletion demo/.shellcheckrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
disable=SC2148,SC1090,SC2002
disable=SC2148,SC1090,SC1091,SC2002,SC2153
137 changes: 67 additions & 70 deletions demo/2025-10/run-demo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,36 @@ ln -s "$TMP_DIR" ./leios-run-tmp-dir
echo "Generate the Leios DB and the schedules"
leiosdemo202510 generate "$TMP_DIR/upstream.db" manifest.json "$TMP_DIR/base-schedule.json"
# Make a schedule.json from the base-schedule.json such that the first number in each array is 182.9
jq 'map(.[0] = 182.9)' "$TMP_DIR/base-schedule.json" > "$TMP_DIR/schedule.json"

jq 'map(.[0] = 182.9)' "$TMP_DIR/base-schedule.json" >"$TMP_DIR/schedule.json"

if [[ ! "$SECONDS_UNTIL_REF_SLOT" =~ ^[0-9]*$ ]] || [[ "$SECONDS_UNTIL_REF_SLOT" -le 0 ]]; then
echo "Error: \${SECONDS_UNTIL_REF_SLOT} must be a positive integer of seconds, which will be added to the execution time of this script." >&2
exit 1
echo "Error: \${SECONDS_UNTIL_REF_SLOT} must be a positive integer of seconds, which will be added to the execution time of this script." >&2
exit 1
fi

if [ ! -d "${DATA%/}" ]; then
DATA="${DATA%/}"
echo "Error: DATA directory '$DATA' not found or is not a directory." >&2
exit 1
DATA="${DATA%/}"
echo "Error: DATA directory '$DATA' not found or is not a directory." >&2
exit 1
fi

if [[ -z "${CARDANO_NODE}" ]]; then
echo "Error: \${CARDANO_NODE} must be the path to the cardano-node exe." >&2
exit 1
echo "Error: \${CARDANO_NODE} must be the path to the cardano-node exe." >&2
exit 1
fi

if [[ -z "${IMMDB_SERVER}" ]]; then
echo "Error: \${IMMDB_SERVER} must be the path to the immdb-server exe." >&2
exit 1
echo "Error: \${IMMDB_SERVER} must be the path to the immdb-server exe." >&2
exit 1
fi

if [[ -z "${REF_SLOT}" ]] || [[ ! "$REF_SLOT" =~ ^[0-9]*$ ]] || [[ "$REF_SLOT" -lt 0 ]]; then
echo "Error: \${REF_SLOT} must be a non-negative integer, a slot number" >&2
exit 1
echo "Error: \${REF_SLOT} must be a non-negative integer, a slot number" >&2
exit 1
fi

now=$(date +%s)
ONSET_OF_REF_SLOT=$(( now + SECONDS_UNTIL_REF_SLOT ))
ONSET_OF_REF_SLOT=$((now + SECONDS_UNTIL_REF_SLOT))
echo "REF_SLOT=$REF_SLOT"
echo "ONSET_OF_REF_SLOT=$ONSET_OF_REF_SLOT"
echo "$REF_SLOT"
Expand All @@ -52,18 +51,17 @@ PORT3=3003

TOXIPROXY=100

if pgrep -fx "toxiproxy-server" > /dev/null
then
echo "Toxiproxy is already running"
if pgrep -fx "toxiproxy-server" >/dev/null; then
echo "Toxiproxy is already running"
else
echo "Starting Toxiproxy"
toxiproxy-server 1> "$TMP_DIR/toxiproxy.log" 2>&1 &
echo "Starting Toxiproxy"
toxiproxy-server 1>"$TMP_DIR/toxiproxy.log" 2>&1 &
fi

# shellcheck disable=SC2329
cleanup_proxy() {
toxiproxy-cli delete mocked-upstream-peer-proxy 2>/dev/null || true
toxiproxy-cli delete node0-proxy 2>/dev/null || true
toxiproxy-cli delete mocked-upstream-peer-proxy 2>/dev/null || true
toxiproxy-cli delete node0-proxy 2>/dev/null || true
}

trap cleanup_proxy EXIT INT TERM
Expand All @@ -75,21 +73,20 @@ toxiproxy-cli create --listen 127.0.0.1:"$PORT1" --upstream 127.0.0.1:"$((TOXIPR
toxiproxy-cli create --listen 127.0.0.1:"$PORT2" --upstream 127.0.0.1:"$((TOXIPROXY + PORT2))" node0-proxy

for i in mocked-upstream-peer-proxy node0-proxy; do
# TODO magic numbers
toxiproxy-cli toxic add --type latency --attribute latency=150 --attribute jitter=30 $i # milliseconds
toxiproxy-cli toxic add --type bandwidth --attribute rate=2500 $i # kilobytes per second
# FYI, 125 kilobyte/s = 1 megabit/s, so EG 2500 kilobyte/s = 20 megabit/s
# TODO magic numbers
toxiproxy-cli toxic add --type latency --attribute latency=150 --attribute jitter=30 $i # milliseconds
toxiproxy-cli toxic add --type bandwidth --attribute rate=2500 $i # kilobytes per second
# FYI, 125 kilobyte/s = 1 megabit/s, so EG 2500 kilobyte/s = 20 megabit/s
done

echo "Ports: ${PORT1} ${PORT2} ${PORT3}, each plus ${TOXIPROXY} for toxiproxy"


##
## Run cardano-node (node-0)
##

echo "Creating $TMP_DIR/topology-node-0.json"
cat << EOF > "$TMP_DIR/topology-node-0.json"
cat <<EOF >"$TMP_DIR/topology-node-0.json"
{
"bootstrapPeers": [],
"localRoots": [
Expand All @@ -113,13 +110,13 @@ mkdir -p "$TMP_DIR/node-0/db"
cat leios-schema.sql | sqlite3 "$TMP_DIR/node-0/leios.db"

env LEIOS_DB_PATH="$TMP_DIR/node-0/leios.db" \
"$CARDANO_NODE" run \
--config "$DATA/leios-node/config.json" \
--topology "$TMP_DIR/topology-node-0.json" \
--database-path "$TMP_DIR/node-0/db" \
--socket-path "$TMP_DIR/node-0.socket" \
--host-addr 127.0.0.1 --port $((TOXIPROXY + PORT2)) \
&> "$TMP_DIR/cardano-node-0.log" &
"$CARDANO_NODE" run \
--config "$DATA/leios-node/config.json" \
--topology "$TMP_DIR/topology-node-0.json" \
--database-path "$TMP_DIR/node-0/db" \
--socket-path "$TMP_DIR/node-0.socket" \
--host-addr 127.0.0.1 --port $((TOXIPROXY + PORT2)) \
&>"$TMP_DIR/cardano-node-0.log" &

CARDANO_NODE_0_PID=$!

Expand All @@ -129,7 +126,7 @@ echo "Cardano node 0 started with PID: $CARDANO_NODE_0_PID"
## Run a second Cardano-node (To be eventually replaced by a mocked downstream node)
##

cat << EOF > "$TMP_DIR/topology-node-1.json"
cat <<EOF >"$TMP_DIR/topology-node-1.json"
{
"bootstrapPeers": [],
"localRoots": [
Expand All @@ -153,13 +150,13 @@ mkdir -p "$TMP_DIR/node-1/db"
cat leios-schema.sql | sqlite3 "$TMP_DIR/node-1/leios.db"

env LEIOS_DB_PATH="$TMP_DIR/node-1/leios.db" \
"$CARDANO_NODE" run \
--config "$DATA/leios-node/config.json" \
--topology "$TMP_DIR/topology-node-1.json" \
--database-path "$TMP_DIR/node-1/db" \
--socket-path "$TMP_DIR/node-1.socket" \
--host-addr 127.0.0.1 --port "$PORT3" \
&> "$TMP_DIR/cardano-node-1.log" &
"$CARDANO_NODE" run \
--config "$DATA/leios-node/config.json" \
--topology "$TMP_DIR/topology-node-1.json" \
--database-path "$TMP_DIR/node-1/db" \
--socket-path "$TMP_DIR/node-1.socket" \
--host-addr 127.0.0.1 --port "$PORT3" \
&>"$TMP_DIR/cardano-node-1.log" &

MOCKED_PEER_PID=$!

Expand All @@ -170,14 +167,14 @@ echo "Cardano node 1 started with PID: $MOCKED_PEER_PID"
##

"$IMMDB_SERVER" \
--db "$DATA/immdb-node/immutable/" \
--config "$DATA/immdb-node/config.json" \
--initial-slot "$REF_SLOT" \
--initial-time "$ONSET_OF_REF_SLOT" \
--leios-schedule "$TMP_DIR/schedule.json" \
--leios-db "$TMP_DIR/upstream.db" \
--port $((TOXIPROXY + PORT1)) \
&> "$TMP_DIR/immdb-server.log" &
--db "$DATA/immdb-node/immutable/" \
--config "$DATA/immdb-node/config.json" \
--initial-slot "$REF_SLOT" \
--initial-time "$ONSET_OF_REF_SLOT" \
--leios-schedule "$TMP_DIR/schedule.json" \
--leios-db "$TMP_DIR/upstream.db" \
--port $((TOXIPROXY + PORT1)) \
&>"$TMP_DIR/immdb-server.log" &

IMMDB_SERVER_PID=$!

Expand All @@ -186,11 +183,11 @@ echo "ImmDB server started with PID: $IMMDB_SERVER_PID"
# Wait briefly and check if immdb-server is still running
sleep 2
if ! kill -0 "$IMMDB_SERVER_PID" 2>/dev/null; then
echo "ERROR: ImmDB server (PID $IMMDB_SERVER_PID) failed to start" >&2
echo "Log output from $TMP_DIR/immdb-server.log:" >&2
cat "$TMP_DIR/immdb-server.log" >&2
kill "$CARDANO_NODE_0_PID" "$MOCKED_PEER_PID" 2>/dev/null || true
exit 1
echo "ERROR: ImmDB server (PID $IMMDB_SERVER_PID) failed to start" >&2
echo "Log output from $TMP_DIR/immdb-server.log:" >&2
cat "$TMP_DIR/immdb-server.log" >&2
kill "$CARDANO_NODE_0_PID" "$MOCKED_PEER_PID" 2>/dev/null || true
exit 1
fi

echo "All processes running successfully"
Expand All @@ -215,55 +212,55 @@ echo "=== Database Dumps ==="
echo

echo "--- ImmDB Server (immutable db) ---"
db-analyser --db "$DATA/immdb-node/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/immdb-node/config.json" > "$TMP_DIR/immdb-server-db-dump.txt" 2>&1
db-analyser --db "$DATA/immdb-node/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/immdb-node/config.json" >"$TMP_DIR/immdb-server-db-dump.txt" 2>&1
echo "Saved to: $TMP_DIR/immdb-server-db-dump.txt"
echo

echo "--- Node 0 (immutable db) ---"
if [ -d "$TMP_DIR/node-0/db/immutable" ]; then
db-analyser --db "$TMP_DIR/node-0/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" > "$TMP_DIR/node-0-db-dump.txt" 2>&1
echo "Saved to: $TMP_DIR/node-0-db-dump.txt"
db-analyser --db "$TMP_DIR/node-0/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" >"$TMP_DIR/node-0-db-dump.txt" 2>&1
echo "Saved to: $TMP_DIR/node-0-db-dump.txt"
else
echo "No immutable db found at $TMP_DIR/node-0/db/immutable/"
echo "No immutable db found at $TMP_DIR/node-0/db/immutable/"
fi
echo

echo "--- Node 1 (immutable db) ---"
if [ -d "$TMP_DIR/node-1/db/immutable" ]; then
db-analyser --db "$TMP_DIR/node-1/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" > "$TMP_DIR/node-1-db-dump.txt" 2>&1
echo "Saved to: $TMP_DIR/node-1-db-dump.txt"
db-analyser --db "$TMP_DIR/node-1/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" >"$TMP_DIR/node-1-db-dump.txt" 2>&1
echo "Saved to: $TMP_DIR/node-1-db-dump.txt"
else
echo "No immutable db found at $TMP_DIR/node-1/db/immutable/"
echo "No immutable db found at $TMP_DIR/node-1/db/immutable/"
fi
echo

echo "=== Leios SQLite Databases ==="
echo

echo "--- Upstream Leios DB ---"
sqlite3 "$TMP_DIR/upstream.db" ".dump" > "$TMP_DIR/upstream-leios-db-dump.sql"
sqlite3 "$TMP_DIR/upstream.db" ".dump" >"$TMP_DIR/upstream-leios-db-dump.sql"
echo "Saved to: $TMP_DIR/upstream-leios-db-dump.sql"
echo

echo "--- Node 0 Leios DB ---"
sqlite3 "$TMP_DIR/node-0/leios.db" ".dump" > "$TMP_DIR/node-0-leios-db-dump.sql"
sqlite3 "$TMP_DIR/node-0/leios.db" ".dump" >"$TMP_DIR/node-0-leios-db-dump.sql"
echo "Saved to: $TMP_DIR/node-0-leios-db-dump.sql"
echo

echo "--- Node 1 Leios DB ---"
sqlite3 "$TMP_DIR/node-1/leios.db" ".dump" > "$TMP_DIR/node-1-leios-db-dump.sql"
sqlite3 "$TMP_DIR/node-1/leios.db" ".dump" >"$TMP_DIR/node-1-leios-db-dump.sql"
echo "Saved to: $TMP_DIR/node-1-leios-db-dump.sql"
echo

# Log analysis

cat "$TMP_DIR/cardano-node-0.log" | grep -v -i -e leios > "$TMP_DIR/logA"
cat "$TMP_DIR/cardano-node-1.log" | grep -v -i -e leios > "$TMP_DIR/logB"
cat "$TMP_DIR/cardano-node-0.log" | grep -v -i -e leios >"$TMP_DIR/logA"
cat "$TMP_DIR/cardano-node-1.log" | grep -v -i -e leios >"$TMP_DIR/logB"

python3 analyse.py \
"$REF_SLOT" "$ONSET_OF_REF_SLOT" \
"$TMP_DIR/logA" "$TMP_DIR/logB" \
"$TMP_DIR/scatter_plot.png"
"$REF_SLOT" "$ONSET_OF_REF_SLOT" \
"$TMP_DIR/logA" "$TMP_DIR/logB" \
"$TMP_DIR/scatter_plot.png"

# Status

Expand Down
22 changes: 19 additions & 3 deletions demo/2025-11/.env
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
WORKING_DIR=.tmp-leios-202511-demo

SCRIPTS=./scripts

DEF_CARDANO_NODE=cardano-node
DEF_IMMDB_SERVER=immdb-server
DEF_DATA_DIR=data
Expand All @@ -8,6 +10,20 @@ DEF_SECONDS_UNTIL_REF_SLOT=5
DEF_LEIOS_MANIFEST=manifest.json
DEF_ANALYSE_PY=analyse.py
DEF_PYTHON3=python
DEF_UPSTREAM_NODE_PORT=3001
DEF_NODE0_PORT=3002
DEF_DOWNSTREAM_NODE_PORT=3003

DEF_PORT_UPSTREAM_NODE=3001
DEF_PORT_NODE0=3002
DEF_PORT_DOWNSTREAM_NODE=3003

DEF_IP_UPSTREAM_NODE="10.0.0.1"
DEF_IP_NODE0="10.0.0.2"
DEF_IP_DOWNSTREAM_NODE="10.0.0.3"

DEF_RATE_UP_TO_N0="100Mbps"
DEF_DELAY_UP_TO_N0="20ms"
DEF_RATE_N0_TO_UP="100Mbps"
DEF_DELAY_N0_TO_UP="20ms"
DEF_RATE_N0_TO_DOWN="100Mbps"
DEF_DELAY_N0_TO_DOWN="20ms"
DEF_RATE_DOWN_TO_N0="100Mbps"
DEF_DELAY_DOWN_TO_N0="20ms"
10 changes: 7 additions & 3 deletions demo/2025-11/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ Run the Leios X-Ray (Grafana based observability stack)

```shell
export LOG_PATH=".tmp-leios-202511-demo/*.log"
export SS_FILTER="( sport = 3001 and dport = 3002 ) or ( sport = 3002 and dport = 3001 ) or ( sport = 3002 and dport = 3003 ) or ( sport = 3003 and dport = 3002 )"
nix run github:input-output-hk/ouroboros-leios#x_ray
```

Expand All @@ -71,8 +70,13 @@ SECONDS_UNTIL_REF_SLOT=5
LEIOS_MANIFEST=manifest.json
ANALYSE_PY=analyse.py
PYTHON3=python
CARDANO_NODE=cardano-node
IMMDB_SERVER=immdb-server
RATE_UP_TO_N0="100Mbps";
DELAY_UP_TO_N0="20ms";
RATE_N0_TO_UP="100Mbps";
DELAY_N0_TO_UP="20ms";
RATE_N0_TO_DOWN="100Mbps";
DELAY_N0_TO_DOWN="20ms";
RATE_DOWN_TO_N0="100Mbps";
```

To clean up just delete the working directories
Expand Down
30 changes: 25 additions & 5 deletions demo/2025-11/build.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@
name = "dev-demo-2025-11";
src = ./.;
inputsFrom = [ config.devShells.dev-demo ];
packages = [ pkgs.process-compose ];
packages = [
pkgs.process-compose
pkgs.iproute2
pkgs.sqlite
config.packages.ss_http_exporter
];
inherit (config.devShells.dev-demo) IMMDB_SERVER CARDANO_NODE;
};
};
Expand All @@ -24,13 +29,20 @@
runtimeInputs =
config.devShells.dev-demo-2025-11.nativeBuildInputs
++ config.devShells.dev-demo-2025-11.buildInputs
++ [ pkgs.sqlite ];
++ [
pkgs.iproute2
pkgs.sqlite
];
runtimeEnv = {
# Non configurable
WORKING_DIR = ".tmp-leios-202511-demo";
UPSTREAM_NODE_PORT = 3001;
NODE0_PORT = 3002;
DOWNSTREAM_NODE_PORT = 3003;
SCRIPTS = ./scripts;
PORT_UPSTREAM_NODE = 3001;
PORT_NODE0 = 3002;
PORT_DOWNSTREAM_NODE = 3003;
IP_UPSTREAM_NODE = "10.0.0.1";
IP_NODE0 = "10.0.0.2";
IP_DOWNSTREAM_NODE = "10.0.0.3";
# Configurable (if you see DEF_FOO that's a default value for FOO if unset)
DEF_CARDANO_NODE = config.devShells.dev-demo-2025-11.CARDANO_NODE;
DEF_IMMDB_SERVER = config.devShells.dev-demo-2025-11.IMMDB_SERVER;
Expand All @@ -47,6 +59,14 @@
]
)
);
DEF_RATE_UP_TO_N0 = "100Mbps";
DEF_DELAY_UP_TO_N0 = "20ms";
DEF_RATE_N0_TO_UP = "100Mbps";
DEF_DELAY_N0_TO_UP = "20ms";
DEF_RATE_N0_TO_DOWN = "100Mbps";
DEF_DELAY_N0_TO_DOWN = "20ms";
DEF_RATE_DOWN_TO_N0 = "100Mbps";
DEF_DELAY_DOWN_TO_N0 = "20ms";
};
text = ''
process-compose --no-server -f ${./process-compose.yaml};
Expand Down
4 changes: 2 additions & 2 deletions demo/2025-11/data/downstream-node/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"": {
"backends": [
"Stdout MachineFormat",
"PrometheusSimple 127.0.0.1 12902"
"PrometheusSimple 0.0.0.0 12900"
],
"detail": "DNormal",
"severity": "Notice"
Expand Down Expand Up @@ -236,7 +236,7 @@
"severity": "Notice"
},
"Resources": {
"severity": "Debug"
"severity": "Silence"
},
"Shutdown": {
"severity": "Notice"
Expand Down
Loading