The branch, master has been updated
       via  7c5ce115f2c ctdb-failover: Add sm-notify to statd_callout
       via  e4914e6a4f1 ctdb-scripts: Only send notifies for newly taken IPs
       via  85afee0a83d ctdb-tests: Update statd-callout unit test 
infrastructure
      from  31c2bc58565 vfs_ceph_new: Reduce a level of indirection for 
SMB_VFS_FSTATVFS

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7c5ce115f2c11e5a2dd326238f08bc5e7c10641c
Author: Peter Schwenke <[email protected]>
Date:   Thu Oct 9 12:48:28 2025 +1100

    ctdb-failover: Add sm-notify to statd_callout
    
    sm-notify is required when an NFS client reboots.
    rpc-statd on the client will send an sm-notify to
    rpc-statd on the NFS sever.
    
    Add a test case.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15938
    
    Signed-off-by: Peter Schwenke <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>
    
    Autobuild-User(master): Martin Schwenke <[email protected]>
    Autobuild-Date(master): Wed Feb 18 12:29:16 UTC 2026 on atb-devel-224

commit e4914e6a4f1cb77eebf86c5ab3f241c2a9e5bd05
Author: Peter Schwenke <[email protected]>
Date:   Tue Apr 29 16:33:45 2025 +1000

    ctdb-scripts: Only send notifies for newly taken IPs
    
    We no longer delete shared state (and send notifies) for
    IPs previously held by the current node. The NFS lock manager
    won't have released locks for these IPs, so won't generate
    SM_MON on reclaim attempts.  Therefore, there will be
    no add-client to put them back.
    
    We now record newly taken IP addresses in takeip,
    and only send notifies for those during
    ipreallocated.  The extra notifies were also confusing
    statd.
    
    Update existing tests to always simulate taking all of a node's IPs.
    This causes no output changes.
    
    Test updates confirm the subtleties of the statd_callout_helper
    behaviour change.  These pretend to only take a single IP, so
    SM_NOTIFY must not be sent for other IPs.  Shared state should
    remain for these other files.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15939
    
    Signed-off-by: Peter Schwenke <[email protected]>
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 85afee0a83dd2f70b90cff4c1e21b865640261fb
Author: Martin Schwenke <[email protected]>
Date:   Thu May 15 15:20:25 2025 +1000

    ctdb-tests: Update statd-callout unit test infrastructure
    
    Don't cheat.  Keep some state about what is happening, similar to what
    statd_callout and statd_callout_helper are expected to keep.  This
    means hinting arguments to check_shared_storage_statd_state() and
    check_statd_callout_smnotify() can be dropped.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15939
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/config/events/legacy/60.nfs.script            |  3 +
 ctdb/failover/statd_callout.c                      | 21 +++++-
 .../UNIT/eventscripts/scripts/statd-callout.sh     | 84 +++++++++++++++-------
 ctdb/tests/UNIT/eventscripts/statd-callout.001.sh  |  2 +-
 ctdb/tests/UNIT/eventscripts/statd-callout.002.sh  |  2 +-
 ctdb/tests/UNIT/eventscripts/statd-callout.004.sh  |  8 ++-
 ctdb/tests/UNIT/eventscripts/statd-callout.005.sh  | 12 +++-
 ctdb/tests/UNIT/eventscripts/statd-callout.006.sh  | 12 +++-
 .../{statd-callout.006.sh => statd-callout.008.sh} | 14 +++-
 ctdb/tests/UNIT/eventscripts/statd-callout.050.sh  | 11 +++
 .../{statd-callout.101.sh => statd-callout.108.sh} |  2 +-
 .../{statd-callout.101.sh => statd-callout.150.sh} |  2 +-
 .../{statd-callout.201.sh => statd-callout.208.sh} |  2 +-
 .../{statd-callout.101.sh => statd-callout.250.sh} |  2 +-
 ctdb/tools/statd_callout_helper                    | 44 ++++++++++--
 15 files changed, 175 insertions(+), 46 deletions(-)
 copy ctdb/tests/UNIT/eventscripts/{statd-callout.006.sh => 
statd-callout.008.sh} (60%)
 create mode 100755 ctdb/tests/UNIT/eventscripts/statd-callout.050.sh
 copy ctdb/tests/UNIT/eventscripts/{statd-callout.101.sh => 
statd-callout.108.sh} (70%)
 copy ctdb/tests/UNIT/eventscripts/{statd-callout.101.sh => 
statd-callout.150.sh} (70%)
 copy ctdb/tests/UNIT/eventscripts/{statd-callout.201.sh => 
statd-callout.208.sh} (69%)
 copy ctdb/tests/UNIT/eventscripts/{statd-callout.101.sh => 
statd-callout.250.sh} (70%)


Changeset truncated at 500 lines:

diff --git a/ctdb/config/events/legacy/60.nfs.script 
b/ctdb/config/events/legacy/60.nfs.script
index c59a0c18ea8..0146a39170c 100755
--- a/ctdb/config/events/legacy/60.nfs.script
+++ b/ctdb/config/events/legacy/60.nfs.script
@@ -325,6 +325,9 @@ shutdown)
 
 takeip)
        nfs_callout "$@" || exit $?
+       if [ -x "${CTDB_HELPER_BINDIR}/statd_callout_helper" ] ; then
+               "${CTDB_HELPER_BINDIR}/statd_callout_helper" takeip "$3"
+       fi
        ctdb_service_set_reconfigure
        ;;
 
diff --git a/ctdb/failover/statd_callout.c b/ctdb/failover/statd_callout.c
index 8064432b21f..4111d675100 100644
--- a/ctdb/failover/statd_callout.c
+++ b/ctdb/failover/statd_callout.c
@@ -353,10 +353,27 @@ static void del_client_shared_dir(const char *cip)
 
 static void usage(void)
 {
-       printf("usage: %s: { add-client | del-client } <client-ip>\n", 
progname);
+       printf("usage: %s { add-client | del-client } <client-ip>\n", progname);
+       printf("       %s sm-notify mon_name ip_addr state\n", progname);
        exit(1);
 }
 
+/**
+ * @brief To be used as the statd ha-callout program
+ *
+ * Examples
+ *         progname add-client 192.168.10.94 nsds2
+ *         progname del-client 192.168.10.94 nsds2
+ *         progname sm-notify sitar1 192.168.10.94 127
+ *
+ * @param[in] event     One of add-client, del-client, sm-notify
+ * @param[in] mon_name  The client being monitored.  For add-client, del-client
+ *                      this will be the IP address. For sm-notify it will
+ *                      be the hostname
+ * @param[in] other     We don't actually use this.  For add-client and
+ *                      del-client it will be NFS server hostname.
+ *                     For sm-notify, it will be the client's state number.
+ */
 int main(int argc, const char *argv[])
 {
        const char *event = NULL;
@@ -394,6 +411,8 @@ int main(int argc, const char *argv[])
                case CTDB_SC_MODE_NONE:
                        break;
                }
+       } else if (strcmp(event, "sm-notify") == 0) {
+               exit(0);
        } else {
                usage();
        }
diff --git a/ctdb/tests/UNIT/eventscripts/scripts/statd-callout.sh 
b/ctdb/tests/UNIT/eventscripts/scripts/statd-callout.sh
index 10912c5d3e5..f34248b2f6c 100644
--- a/ctdb/tests/UNIT/eventscripts/scripts/statd-callout.sh
+++ b/ctdb/tests/UNIT/eventscripts/scripts/statd-callout.sh
@@ -23,13 +23,18 @@ setup()
        if [ "$statd_callout_location" = "$CTDB_STATD_CALLOUT_SHARED_STORAGE" 
]; then
                statd_callout_location=""
        fi
+
+       state_dir="${CTDB_TEST_TMP_DIR}/statd-callout-state"
+       mkdir -p "$state_dir"
 }
 
-ctdb_catdb_format_pairs()
+ctdb_catdb_format()
 {
        _count=0
 
-       while read -r _k _v; do
+       while read -r _sip_cip; do
+               _k="statd-state@${_sip_cip}"
+               _v="DATETIME"
                _kn=$(printf '%s' "$_k" | wc -c)
                _vn=$(printf '%s' "$_v" | wc -c)
                cat <<EOF
@@ -50,17 +55,19 @@ result_filter()
        sed -e 's|^\(data(10) = \)".........."$|data(8) = "DATETIME"|'
 }
 
-check_ctdb_tdb_statd_state()
+ctdb_shared_state_list()
 {
-       ctdb_get_my_public_addresses |
-               while read -r _ _sip _; do
-                       for _cip; do
-                               cat <<EOF
-statd-state@${_sip}@${_cip} DATETIME
-EOF
-                       done
+       find "$state_dir" -name "mon@*" |
+               while read -r _f; do
+                       echo "${_f#*/mon@}"
                done |
-               ctdb_catdb_format_pairs | {
+               sort
+}
+
+check_ctdb_tdb_statd_state()
+{
+       ctdb_shared_state_list |
+               ctdb_catdb_format | {
                ok
                simple_test_command ctdb catdb "$statd_callout_location"
        } || exit $?
@@ -68,13 +75,8 @@ EOF
 
 check_shared_dir_statd_state()
 {
-       ctdb_get_my_public_addresses |
-               while read -r _ _sip _; do
-                       for _cip; do
-                               echo "statd-state@${_sip}@${_cip}"
-                       done
-               done |
-               sort | {
+       ctdb_shared_state_list |
+               sed -e 's|^|statd-state@|' | {
                ok
                _dir="${CTDB_TEST_TMP_DIR}${statd_callout_location}"
                mkdir -p "$_dir"
@@ -130,14 +132,20 @@ check_statd_callout_smnotify()
 
        nfs_load_config
 
-       ctdb_get_my_public_addresses |
-               while read -r _ _sip _; do
-                       for _cip; do
-                               cat <<EOF
+       find "$state_dir" -name "takeip@${FAKE_CTDB_PNN}@*" |
+               while read -r _f; do
+                       _sip="${_f##*@}"
+                       _prefix="mon@${_sip}@"
+                       find "$state_dir" -name "${_prefix}*" |
+                               while read -r _f; do
+                                       _cip="${_f##*@}"
+                                       cat <<EOF
 SM_NOTIFY: ${_sip} -> ${_cip}, MON_NAME=${FAKE_NFS_HOSTNAME}, STATE=${_state}
 EOF
-                       done
-               done | {
+                                       rm -f "$_f"
+                               done
+               done |
+               sort | {
                ok
                simple_test_event "notify"
        } || exit $?
@@ -180,9 +188,35 @@ EOF
        export CTDB_STATD_CALLOUT_CONFIG_FILE
 
        case "$event" in
-       add-client | del-client)
+       add-client)
                cmd="${CTDB_SCRIPTS_HELPER_BINDIR}/statd_callout"
                unit_test "$cmd" "$event" "$@"
+               ctdb_get_my_public_addresses |
+                       while read -r _ _sip _; do
+                               touch "${state_dir}/mon@${_sip}@${1}"
+                       done
+               ;;
+       del-client)
+               cmd="${CTDB_SCRIPTS_HELPER_BINDIR}/statd_callout"
+               unit_test "$cmd" "$event" "$@"
+               ctdb_get_my_public_addresses |
+                       while read -r _ _sip _; do
+                               rm -f "${state_dir}/mon@${_sip}@${1}"
+                       done
+               ;;
+       sm-notify)
+               cmd="${CTDB_SCRIPTS_HELPER_BINDIR}/statd_callout"
+               unit_test "$cmd" "$event" "$@"
+               ;;
+       takeip)
+               cmd="${CTDB_SCRIPTS_TOOLS_HELPER_DIR}/statd_callout_helper"
+               script_test "$cmd" "$event" "$@"
+               touch "${state_dir}/takeip@${FAKE_CTDB_PNN}@${1}"
+               ;;
+       notify)
+               cmd="${CTDB_SCRIPTS_TOOLS_HELPER_DIR}/statd_callout_helper"
+               script_test "$cmd" "$event" "$@"
+               rm -f "${state_dir}/takeip@${FAKE_CTDB_PNN}@"*
                ;;
        *)
                cmd="${CTDB_SCRIPTS_TOOLS_HELPER_DIR}/statd_callout_helper"
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.001.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.001.sh
index 475750041c5..69de3c93b85 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.001.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.001.sh
@@ -16,4 +16,4 @@ simple_test_event "startup"
 simple_test_event "add-client" "192.168.123.45"
 simple_test_event "update"
 
-check_shared_storage_statd_state "192.168.123.45"
+check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.002.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.002.sh
index 7e5d7b23621..7d94d9ca881 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.002.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.002.sh
@@ -17,4 +17,4 @@ simple_test_event "add-client" "192.168.123.45"
 simple_test_event "add-client" "192.168.123.46"
 simple_test_event "update"
 
-check_shared_storage_statd_state "192.168.123.45" "192.168.123.46"
+check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.004.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.004.sh
index 1b1bc05490a..2ea80129446 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.004.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.004.sh
@@ -13,11 +13,15 @@ setup "$mode"
 
 ok_null
 simple_test_event "startup"
+ctdb_get_my_public_addresses |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.45"
 simple_test_event "update"
 
-check_shared_storage_statd_state "192.168.123.45"
+check_shared_storage_statd_state
 
-check_statd_callout_smnotify "192.168.123.45"
+check_statd_callout_smnotify
 
 check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.005.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.005.sh
index 5a9274b1402..b3dcfcad360 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.005.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.005.sh
@@ -13,6 +13,10 @@ setup "$mode"
 
 ok_null
 simple_test_event "startup"
+ctdb_get_my_public_addresses |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.45"
 simple_test_event "update"
 
@@ -20,13 +24,17 @@ ctdb_set_pnn 1
 
 ok_null
 simple_test_event "startup"
+ctdb_get_my_public_addresses |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.46"
 simple_test_event "update"
 
 ctdb_set_pnn 0
 
-check_statd_callout_smnotify "192.168.123.45"
+check_statd_callout_smnotify
 
 ctdb_set_pnn 1
 
-check_shared_storage_statd_state "192.168.123.46"
+check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh
index 1721a5c50b3..35a7f6dcd81 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh
@@ -13,6 +13,10 @@ setup "$mode"
 
 ok_null
 simple_test_event "startup"
+ctdb_get_my_public_addresses |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.45"
 simple_test_event "update"
 
@@ -20,15 +24,19 @@ ctdb_set_pnn 1
 
 ok_null
 simple_test_event "startup"
+ctdb_get_my_public_addresses |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.46"
 simple_test_event "update"
 
 ctdb_set_pnn 0
 
-check_statd_callout_smnotify "192.168.123.45"
+check_statd_callout_smnotify
 
 ctdb_set_pnn 1
 
-check_statd_callout_smnotify "192.168.123.46"
+check_statd_callout_smnotify
 
 check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.008.sh
similarity index 60%
copy from ctdb/tests/UNIT/eventscripts/statd-callout.006.sh
copy to ctdb/tests/UNIT/eventscripts/statd-callout.008.sh
index 1721a5c50b3..73e4c5b35d1 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.006.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.008.sh
@@ -7,12 +7,16 @@ if [ -z "$CTDB_STATD_CALLOUT_SHARED_STORAGE" ]; then
 fi
 mode="$CTDB_STATD_CALLOUT_SHARED_STORAGE"
 
-define_test "${mode} - 2 x add-client to different nodes, notify on both"
+define_test "${mode} - add-client on different nodes, take 1 IP, notify on 
both"
 
 setup "$mode"
 
 ok_null
 simple_test_event "startup"
+ctdb_get_1_public_address |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.45"
 simple_test_event "update"
 
@@ -20,15 +24,19 @@ ctdb_set_pnn 1
 
 ok_null
 simple_test_event "startup"
+ctdb_get_1_public_address |
+       while read -r _ sip _; do
+               simple_test_event "takeip" "$sip"
+       done
 simple_test_event "add-client" "192.168.123.46"
 simple_test_event "update"
 
 ctdb_set_pnn 0
 
-check_statd_callout_smnotify "192.168.123.45"
+check_statd_callout_smnotify
 
 ctdb_set_pnn 1
 
-check_statd_callout_smnotify "192.168.123.46"
+check_statd_callout_smnotify
 
 check_shared_storage_statd_state
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.050.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.050.sh
new file mode 100755
index 00000000000..54232a491c3
--- /dev/null
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.050.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "confirm sm-notify is ignored"
+
+setup
+
+ok_null
+simple_test_event "startup"
+simple_test_event "sm-notify" "192.168.10.104" "client10" "9999"
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.108.sh
similarity index 70%
copy from ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
copy to ctdb/tests/UNIT/eventscripts/statd-callout.108.sh
index b57bd953f1b..224b58429d9 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.108.sh
@@ -3,4 +3,4 @@
 CTDB_STATD_CALLOUT_SHARED_STORAGE="shared_dir"
 
 _dir=$(dirname "$0")
-. "${_dir}/statd-callout.001.sh"
+. "${_dir}/statd-callout.008.sh"
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.150.sh
similarity index 70%
copy from ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
copy to ctdb/tests/UNIT/eventscripts/statd-callout.150.sh
index b57bd953f1b..35c9a34ce44 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.150.sh
@@ -3,4 +3,4 @@
 CTDB_STATD_CALLOUT_SHARED_STORAGE="shared_dir"
 
 _dir=$(dirname "$0")
-. "${_dir}/statd-callout.001.sh"
+. "${_dir}/statd-callout.050.sh"
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.201.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.208.sh
similarity index 69%
copy from ctdb/tests/UNIT/eventscripts/statd-callout.201.sh
copy to ctdb/tests/UNIT/eventscripts/statd-callout.208.sh
index 95a95e0d94e..6fc8bf15afe 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.201.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.208.sh
@@ -3,4 +3,4 @@
 CTDB_STATD_CALLOUT_SHARED_STORAGE="none"
 
 _dir=$(dirname "$0")
-. "${_dir}/statd-callout.001.sh"
+. "${_dir}/statd-callout.008.sh"
diff --git a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh 
b/ctdb/tests/UNIT/eventscripts/statd-callout.250.sh
similarity index 70%
copy from ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
copy to ctdb/tests/UNIT/eventscripts/statd-callout.250.sh
index b57bd953f1b..35c9a34ce44 100755
--- a/ctdb/tests/UNIT/eventscripts/statd-callout.101.sh
+++ b/ctdb/tests/UNIT/eventscripts/statd-callout.250.sh
@@ -3,4 +3,4 @@
 CTDB_STATD_CALLOUT_SHARED_STORAGE="shared_dir"
 
 _dir=$(dirname "$0")
-. "${_dir}/statd-callout.001.sh"
+. "${_dir}/statd-callout.050.sh"
diff --git a/ctdb/tools/statd_callout_helper b/ctdb/tools/statd_callout_helper
index 6ab466f74b2..98c1a7c6e4b 100755
--- a/ctdb/tools/statd_callout_helper
+++ b/ctdb/tools/statd_callout_helper
@@ -80,6 +80,7 @@ create_add_del_client_dir()
 # script_state_dir set by ctdb_setup_state_dir()
 # shellcheck disable=SC2154
 statd_callout_state_dir="${script_state_dir}/statd_callout"
+statd_new_ips_file="${statd_callout_state_dir}/new_ips.txt"
 
 # Set default value, if necessary
 : "${CTDB_STATD_CALLOUT_SHARED_STORAGE:=persistent_db}"
@@ -216,9 +217,10 @@ 
persistent_db_grep_filter="${statd_callout_state_dir}/.grep_filter"
 
 persistent_db_make_grep_filter()
 {
+       _ips_file="$1"
        while read -r _ip; do
                echo "statd-state@${_ip}@"
-       done <"$CTDB_MY_PUBLIC_IPS_CACHE" >"$persistent_db_grep_filter"
+       done <"$_ips_file" >"$persistent_db_grep_filter"
 }
 
 update_persistent_db()
@@ -231,7 +233,7 @@ update_persistent_db()
                exit 0
        fi
 
-       persistent_db_make_grep_filter
+       persistent_db_make_grep_filter "$CTDB_MY_PUBLIC_IPS_CACHE"
 
        # Use cat instead of direct grep since POSIX grep does not
        # have -h
@@ -249,10 +251,14 @@ update_persistent_db()
 
 list_records_persistent_db()
 {
-       persistent_db_make_grep_filter
+       persistent_db_make_grep_filter "$statd_new_ips_file"
 
+       # Redirect below to /dev/null is because some versions of grep
+       # appear to not drain the input if the file passed to -f is
+       # empty (so it matches nothing).  This can cause the first sed
+       # command in the pipeline to exit with EPIPE.
        $CTDB catdb "$statd_callout_db" |
-               sed -n -e 's|^key([0-9]*) = "\([^"]*\)".*|\1|p' |
+               sed -n -e 's|^key([0-9]*) = "\([^"]*\)".*|\1|p' 2>/dev/null |
                grep -F -f "$persistent_db_grep_filter" |
                sed -e 's|statd-state@\([^@]*\)@\(.*\)|\1 \2|'
 
@@ -308,11 +314,27 @@ update_shared_dir()
        :
 }
 
+save_ip()
+{
+       _ip_addr=$1
+       _f="$statd_new_ips_file"
+       _lock="${_f}.lock"
+       _new="${_f}.new.$$"
+       {
+               flock --timeout 10 9 ||
+                       die "statd_callout_helper save_ip: timeout"
+
+               cat "$_f" 2>/dev/null >"$_new"
+               echo "$_ip_addr" >>"$_new"
+               mv "$_new" "$_f"
+       } 9>"$_lock"
+}
+
 list_records_shared_dir()
 {
        while read -r _ip; do
                ls "${statd_callout_shared_dir}/statd-state@${_ip}@"*
-       done <"$CTDB_MY_PUBLIC_IPS_CACHE" |
+       done <"${statd_new_ips_file}" |
                while read -r _f; do
                        if [ ! -f "$_f" ]; then
                                continue
@@ -379,6 +401,11 @@ startup()


-- 
Samba Shared Repository

Reply via email to