From 45429eb79b420648930fd7132e23e3d6d17dbd42 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Mon, 9 Nov 2026 10:39:18 +0100 Subject: [PATCH] docs: Fix races in the getting started script (helm order and datanode wait) --- .../getting_started/getting_started.sh | 23 +++++++++++++++++-- .../getting_started/getting_started.sh.j2 | 23 +++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/modules/hdfs/examples/getting_started/getting_started.sh b/docs/modules/hdfs/examples/getting_started/getting_started.sh index 10b9f1c8..15815fb5 100755 --- a/docs/modules/hdfs/examples/getting_started/getting_started.sh +++ b/docs/modules/hdfs/examples/getting_started/getting_started.sh @@ -24,11 +24,11 @@ case "$1" in "helm") echo "Installing Operators with Helm" # tag::helm-install-operators[] -helm install --wait zookeeper-operator oci://oci.stackable.tech/sdp-charts/zookeeper-operator --version 0.0.0-dev -helm install --wait hdfs-operator oci://oci.stackable.tech/sdp-charts/hdfs-operator --version 0.0.0-dev helm install --wait commons-operator oci://oci.stackable.tech/sdp-charts/commons-operator --version 0.0.0-dev helm install --wait secret-operator oci://oci.stackable.tech/sdp-charts/secret-operator --version 0.0.0-dev helm install --wait listener-operator oci://oci.stackable.tech/sdp-charts/listener-operator --version 0.0.0-dev --set preset=stable-nodes +helm install --wait zookeeper-operator oci://oci.stackable.tech/sdp-charts/zookeeper-operator --version 0.0.0-dev +helm install --wait hdfs-operator oci://oci.stackable.tech/sdp-charts/hdfs-operator --version 0.0.0-dev # end::helm-install-operators[] ;; "stackablectl") @@ -131,6 +131,25 @@ else exit 1 fi +# The datanode can be ready before it has registered with the namenode; +# writes fail until it has. +echo "Waiting for a datanode to register with the namenode ..." +live=0 +for (( i=1; i<=60; i++ )) +do + live=$(kubectl exec -n default webhdfs-0 -- curl -s "http://simple-hdfs-namenode-default-0.simple-hdfs-namenode-default.default.svc.cluster.local:9870/jmx?qry=Hadoop:service=NameNode,name=FSNamesystemState" | jq -r '.beans[0].NumLiveDataNodes // 0' || echo 0) + if [ "$live" -ge 1 ]; then + break + fi + + sleep 2 +done + +if [ "$live" -lt 1 ]; then + echo "No datanode registered with the namenode" + exit 1 +fi + echo "Copy test file" # tag::copy-file[] kubectl cp -n default ./testdata.txt webhdfs-0:/tmp diff --git a/docs/modules/hdfs/examples/getting_started/getting_started.sh.j2 b/docs/modules/hdfs/examples/getting_started/getting_started.sh.j2 index 77d7ecc2..ee70bfdb 100755 --- a/docs/modules/hdfs/examples/getting_started/getting_started.sh.j2 +++ b/docs/modules/hdfs/examples/getting_started/getting_started.sh.j2 @@ -24,11 +24,11 @@ case "$1" in "helm") echo "Installing Operators with Helm" # tag::helm-install-operators[] -helm install --wait zookeeper-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/zookeeper-operator --version {{ versions.zookeeper }} -helm install --wait hdfs-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/hdfs-operator --version {{ versions.hdfs }} helm install --wait commons-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/commons-operator --version {{ versions.commons }} helm install --wait secret-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/secret-operator --version {{ versions.secret }} helm install --wait listener-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/listener-operator --version {{ versions.listener }} --set preset=stable-nodes +helm install --wait zookeeper-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/zookeeper-operator --version {{ versions.zookeeper }} +helm install --wait hdfs-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/hdfs-operator --version {{ versions.hdfs }} # end::helm-install-operators[] ;; "stackablectl") @@ -131,6 +131,25 @@ else exit 1 fi +# The datanode can be ready before it has registered with the namenode; +# writes fail until it has. +echo "Waiting for a datanode to register with the namenode ..." +live=0 +for (( i=1; i<=60; i++ )) +do + live=$(kubectl exec -n default webhdfs-0 -- curl -s "http://simple-hdfs-namenode-default-0.simple-hdfs-namenode-default.default.svc.cluster.local:9870/jmx?qry=Hadoop:service=NameNode,name=FSNamesystemState" | jq -r '.beans[0].NumLiveDataNodes // 0' || echo 0) + if [ "$live" -ge 1 ]; then + break + fi + + sleep 2 +done + +if [ "$live" -lt 1 ]; then + echo "No datanode registered with the namenode" + exit 1 +fi + echo "Copy test file" # tag::copy-file[] kubectl cp -n default ./testdata.txt webhdfs-0:/tmp