The branch, master has been updated via eba1212 ctdb-tests: Add a policy routing test with misconfiguration via 5a6a932 ctdb-tests: Make fake gateway different to actual public IPs via 7d04778 ctdb-scripts: Improve error handling for 50.samba testparm failure via 6538ba5 ctdb-pmda: Add missing prototype declaration for non-static function via 7949ce1 ctdb-daemon: Reset database statistics when resetting statistics via d9030d8 ctdb-system: Remove unused system specific calls from e45b0d4 source3/rpc_client: Fix CID 1273041 Condition is redundant
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit eba12122ccce602aede7756b8f91d34fe927d2c0 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Aug 4 17:03:50 2015 +1000 ctdb-tests: Add a policy routing test with misconfiguration To support this, extend the "ip route add" stub to detect duplicate routes. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Fri Aug 7 08:37:38 CEST 2015 on sn-devel-104 commit 5a6a9326e58c4ebabd351326493d5d320e0130e6 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Aug 4 16:12:31 2015 +1000 ctdb-tests: Make fake gateway different to actual public IPs Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 7d04778c82a8f657b6ba0173c29529fa03ab7a25 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Jul 30 16:49:35 2015 +1000 ctdb-scripts: Improve error handling for 50.samba testparm failure Also add tests. Update testparm stub to fake error and timeout. Add timeout stub. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 6538ba5243a043bc727039a16a7a9d5d8027fa06 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Aug 3 15:36:06 2015 +1000 ctdb-pmda: Add missing prototype declaration for non-static function BUG: https://bugzilla.samba.org/show_bug.cgi?id=11434 Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 7949ce103f2062aa703a24f72e11be96dc497a7a Author: Amitay Isaacs <ami...@gmail.com> Date: Thu Apr 2 13:53:09 2015 +1100 ctdb-daemon: Reset database statistics when resetting statistics When the ctdb statistics is reset, reset per database statistics to keep it consistent with ctdb statistics. Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit d9030d8c10ebe6f95f33cbc691b5756d97395b0f Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Aug 3 15:02:43 2015 +1000 ctdb-system: Remove unused system specific calls Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> ----------------------------------------------------------------------- Summary of changes: ctdb/common/system_aix.c | 18 --- ctdb/common/system_freebsd.c | 32 ---- ctdb/common/system_gnu.c | 18 --- ctdb/common/system_kfreebsd.c | 31 ---- ctdb/common/system_linux.c | 177 ----------------------- ctdb/config/events.d/50.samba | 45 ++++-- ctdb/include/ctdb_private.h | 5 +- ctdb/server/ctdb_control.c | 7 + ctdb/server/ctdb_ltdb_server.c | 14 ++ ctdb/tests/eventscripts/13.per_ip_routing.023.sh | 26 ++++ ctdb/tests/eventscripts/50.samba.monitor.110.sh | 20 +++ ctdb/tests/eventscripts/50.samba.monitor.111.sh | 25 ++++ ctdb/tests/eventscripts/50.samba.monitor.112.sh | 13 ++ ctdb/tests/eventscripts/50.samba.monitor.113.sh | 16 ++ ctdb/tests/eventscripts/scripts/local.sh | 4 +- ctdb/tests/eventscripts/stubs/ip | 10 ++ ctdb/tests/eventscripts/stubs/testparm | 36 ++++- ctdb/tests/eventscripts/stubs/timeout | 8 + ctdb/tests/src/ctdb_porting_tests.c | 18 --- ctdb/utils/pmda/pmda_ctdb.c | 3 +- 20 files changed, 214 insertions(+), 312 deletions(-) create mode 100755 ctdb/tests/eventscripts/13.per_ip_routing.023.sh create mode 100755 ctdb/tests/eventscripts/50.samba.monitor.110.sh create mode 100755 ctdb/tests/eventscripts/50.samba.monitor.111.sh create mode 100755 ctdb/tests/eventscripts/50.samba.monitor.112.sh create mode 100755 ctdb/tests/eventscripts/50.samba.monitor.113.sh create mode 100755 ctdb/tests/eventscripts/stubs/timeout Changeset truncated at 500 lines: diff --git a/ctdb/common/system_aix.c b/ctdb/common/system_aix.c index 41f61ae..a98d382 100644 --- a/ctdb/common/system_aix.c +++ b/ctdb/common/system_aix.c @@ -374,26 +374,8 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid) return ret; } -char *ctdb_get_process_name(pid_t pid) -{ - /* FIXME AIX: get_process_name not implemented */ - return NULL; -} - int ctdb_set_process_name(const char *name) { /* FIXME AIX: set_process_name not implemented */ return -ENOSYS; } - -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info) -{ - /* FIXME AIX: get_lock_info not implemented */ - return false; -} - -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid) -{ - /* FIXME AIX: get_blocker_pid not implemented */ - return false; -} diff --git a/ctdb/common/system_freebsd.c b/ctdb/common/system_freebsd.c index 9597a7a..c5a816b 100644 --- a/ctdb/common/system_freebsd.c +++ b/ctdb/common/system_freebsd.c @@ -370,40 +370,8 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid) return 1; } -char *ctdb_get_process_name(pid_t pid) -{ - char path[32]; - char buf[PATH_MAX]; - char *ptr; - int n; - - snprintf(path, sizeof(path), "/proc/%d/exe", pid); - n = readlink(path, buf, sizeof(buf)); - if (n < 0) { - return NULL; - } - - /* Remove any extra fields */ - buf[n] = '\0'; - ptr = strtok(buf, " "); - return strdup(ptr); - return NULL; -} - int ctdb_set_process_name(const char *name) { /* FIXME FreeBSD: set_process_name not implemented */ return -ENOSYS; } - -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info) -{ - /* FIXME FreeBSD: get_lock_info not implemented */ - return false; -} - -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid) -{ - /* FIXME FreeBSD: get_blocker_pid not implemented */ - return false; -} diff --git a/ctdb/common/system_gnu.c b/ctdb/common/system_gnu.c index 2ab1399..bf8f43c 100644 --- a/ctdb/common/system_gnu.c +++ b/ctdb/common/system_gnu.c @@ -363,26 +363,8 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid) return 1; } -char *ctdb_get_process_name(pid_t pid) -{ - /* FIXME GNU/Hurd: get_process_name not implemented */ - return NULL; -} - int ctdb_set_process_name(const char *name) { /* FIXME GNU/Hurd: set_process_name not implemented */ return -ENOSYS; } - -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info) -{ - /* FIXME GNU/Hurd: get_lock_info not implemented */ - return false; -} - -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid) -{ - /* FIXME GNU/Hurd: get_blocker_pid not implemented */ - return false; -} diff --git a/ctdb/common/system_kfreebsd.c b/ctdb/common/system_kfreebsd.c index 41aa4d6..de7c891 100644 --- a/ctdb/common/system_kfreebsd.c +++ b/ctdb/common/system_kfreebsd.c @@ -363,39 +363,8 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid) return 1; } -char *ctdb_get_process_name(pid_t pid) -{ - char path[32]; - char buf[PATH_MAX]; - char *ptr; - int n; - - snprintf(path, sizeof(path), "/proc/%d/exe", pid); - n = readlink(path, buf, sizeof(buf)); - if (n < 0) { - return NULL; - } - - /* Remove any extra fields */ - buf[n] = '\0'; - ptr = strtok(buf, " "); - return strdup(ptr); -} - int ctdb_set_process_name(const char *name) { /* FIXME kFreeBSD: set_process_name not implemented */ return -ENOSYS; } - -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info) -{ - /* FIXME kFreeBSD: get_lock_info not implemented */ - return false; -} - -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid) -{ - /* FIXME kFreeBSD: get_blocker_pid not implemented */ - return false; -} diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index fdb8d12..79d1a83 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -598,28 +598,6 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid) } /* - * Find the process name from process ID - */ -char *ctdb_get_process_name(pid_t pid) -{ - char path[32]; - char buf[PATH_MAX]; - char *ptr; - int n; - - snprintf(path, sizeof(path), "/proc/%d/exe", pid); - n = readlink(path, buf, sizeof(buf)-1); - if (n < 0) { - return NULL; - } - - /* Remove any extra fields */ - buf[n] = '\0'; - ptr = strtok(buf, " "); - return (ptr == NULL ? ptr : strdup(ptr)); -} - -/* * Set process name */ int ctdb_set_process_name(const char *name) @@ -630,158 +608,3 @@ int ctdb_set_process_name(const char *name) procname[15] = '\0'; return prctl(PR_SET_NAME, (unsigned long)procname, 0, 0, 0); } - -/* - * Parsing a line from /proc/locks, - */ -static bool parse_proc_locks_line(char *line, pid_t *pid, - struct ctdb_lock_info *curlock) -{ - char *ptr, *saveptr; - - /* output of /proc/locks - * - * lock assigned - * 1: POSIX ADVISORY WRITE 25945 fd:00:6424820 212 212 - * - * lock waiting - * 1: -> POSIX ADVISORY WRITE 25946 fd:00:6424820 212 212 - */ - - /* Id: */ - ptr = strtok_r(line, " ", &saveptr); - if (ptr == NULL) return false; - - /* -> */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - if (strcmp(ptr, "->") == 0) { - curlock->waiting = true; - ptr = strtok_r(NULL, " ", &saveptr); - } else { - curlock->waiting = false; - } - - /* POSIX */ - if (ptr == NULL || strcmp(ptr, "POSIX") != 0) { - return false; - } - - /* ADVISORY */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - - /* WRITE */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - if (strcmp(ptr, "READ") == 0) { - curlock->read_only = true; - } else if (strcmp(ptr, "WRITE") == 0) { - curlock->read_only = false; - } else { - return false; - } - - /* PID */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - *pid = atoi(ptr); - - /* MAJOR:MINOR:INODE */ - ptr = strtok_r(NULL, " :", &saveptr); - if (ptr == NULL) return false; - ptr = strtok_r(NULL, " :", &saveptr); - if (ptr == NULL) return false; - ptr = strtok_r(NULL, " :", &saveptr); - if (ptr == NULL) return false; - curlock->inode = atol(ptr); - - /* START OFFSET */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - curlock->start = atol(ptr); - - /* END OFFSET */ - ptr = strtok_r(NULL, " ", &saveptr); - if (ptr == NULL) return false; - if (strncmp(ptr, "EOF", 3) == 0) { - curlock->end = (off_t)-1; - } else { - curlock->end = atol(ptr); - } - - return true; -} - -/* - * Find information of lock being waited on for given process ID - */ -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info) -{ - FILE *fp; - struct ctdb_lock_info curlock; - pid_t pid; - char buf[1024]; - bool status = false; - - if ((fp = fopen("/proc/locks", "r")) == NULL) { - DEBUG(DEBUG_ERR, ("Failed to read locks information")); - return false; - } - while (fgets(buf, sizeof(buf), fp) != NULL) { - if (! parse_proc_locks_line(buf, &pid, &curlock)) { - continue; - } - if (pid == req_pid && curlock.waiting) { - *lock_info = curlock; - status = true; - break; - } - } - fclose(fp); - - return status; -} - -/* - * Find process ID which holds an overlapping byte lock for required - * inode and byte range. - */ -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid) -{ - FILE *fp; - struct ctdb_lock_info curlock; - pid_t pid; - char buf[1024]; - bool status = false; - - if ((fp = fopen("/proc/locks", "r")) == NULL) { - DEBUG(DEBUG_ERR, ("Failed to read locks information")); - return false; - } - while (fgets(buf, sizeof(buf), fp) != NULL) { - if (! parse_proc_locks_line(buf, &pid, &curlock)) { - continue; - } - - if (curlock.waiting) { - continue; - } - - if (curlock.inode != reqlock->inode) { - continue; - } - - if (curlock.start > reqlock->end || - curlock.end < reqlock->start) { - /* Outside the required range */ - continue; - } - *blocker_pid = pid; - status = true; - break; - } - fclose(fp); - - return status; -} diff --git a/ctdb/config/events.d/50.samba b/ctdb/config/events.d/50.samba index 4b53cba..1742ff1 100755 --- a/ctdb/config/events.d/50.samba +++ b/ctdb/config/events.d/50.samba @@ -78,19 +78,42 @@ testparm_foreground_update () { _timeout="$1" - if ! _out=$(timeout $_timeout testparm -v -s 2>/dev/null) ; then - if [ -f "$smbconf_cache" ] ; then - echo "WARNING: smb.conf cache update failed - using old cache file" - return 1 - else - die "ERROR: smb.conf cache create failed" - fi - fi - + # No need to remove these temporary files, since there are only 2 + # of them. + _out="${smbconf_cache}.out" + _err="${smbconf_cache}.err" + + timeout $_timeout testparm -v -s >"$_out" 2>"$_err" + case $? in + 0) : ;; + 124) + if [ -f "$smbconf_cache" ] ; then + echo "WARNING: smb.conf cache update timed out - using old cache file" + return 1 + else + echo "ERROR: smb.conf cache create failed - testparm command timed out" + exit 1 + fi + ;; + *) + if [ -f "$smbconf_cache" ] ; then + echo "WARNING: smb.conf cache update failed - using old cache file" + cat "$_err" + return 1 + else + echo "ERROR: smb.conf cache create failed - testparm failed with:" + cat "$_err" + exit 1 + fi + esac + + # Only using $$ here to avoid a collision. This is written into + # CTDB's own state directory so there is no real need for a secure + # temporary file. _tmpfile="${smbconf_cache}.$$" # Patterns to exclude... - pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+=' - echo "$_out" | grep -Ev "$pat" >"$_tmpfile" + _pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+=' + grep -Ev "$_pat" <"$_out" >"$_tmpfile" mv "$_tmpfile" "$smbconf_cache" # atomic return 0 diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 4cb0fe6..1d91923 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -1136,10 +1136,7 @@ struct ctdb_lock_info { bool read_only; }; -char *ctdb_get_process_name(pid_t pid); int ctdb_set_process_name(const char *name); -bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info); -bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid); typedef void (*client_async_callback)(struct ctdb_context *ctdb, uint32_t node_pnn, int32_t res, TDB_DATA outdata, void *callback_data); @@ -1449,6 +1446,8 @@ int ctdb_fetch_func(struct ctdb_call_info *call); int ctdb_fetch_with_header_func(struct ctdb_call_info *call); +void ctdb_db_statistics_reset(struct ctdb_db_context *ctdb_db); + int32_t ctdb_control_get_db_statistics(struct ctdb_context *ctdb, uint32_t db_id, TDB_DATA *outdata); diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index fda4c29..59b7d09 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -151,8 +151,15 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, } case CTDB_CONTROL_STATISTICS_RESET: { + struct ctdb_db_context *ctdb_db; + CHECK_CONTROL_DATA_SIZE(0); ZERO_STRUCT(ctdb->statistics); + for (ctdb_db = ctdb->db_list; + ctdb_db != NULL; + ctdb_db = ctdb_db->next) { + ctdb_db_statistics_reset(ctdb_db); + } ctdb->statistics.statistics_start_time = timeval_current(); return 0; } diff --git a/ctdb/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c index 5357c6c..ad61f14 100644 --- a/ctdb/server/ctdb_ltdb_server.c +++ b/ctdb/server/ctdb_ltdb_server.c @@ -1600,6 +1600,20 @@ int ctdb_set_db_sticky(struct ctdb_context *ctdb, struct ctdb_db_context *ctdb_d return 0; } +void ctdb_db_statistics_reset(struct ctdb_db_context *ctdb_db) +{ + struct ctdb_db_statistics *s = &ctdb_db->statistics; + int i; + + for (i=0; i<MAX_HOT_KEYS; i++) { + if (s->hot_keys[i].key.dsize > 0) { + talloc_free(s->hot_keys[i].key.dptr); + } + } + + ZERO_STRUCT(ctdb_db->statistics); +} + int32_t ctdb_control_get_db_statistics(struct ctdb_context *ctdb, uint32_t db_id, TDB_DATA *outdata) diff --git a/ctdb/tests/eventscripts/13.per_ip_routing.023.sh b/ctdb/tests/eventscripts/13.per_ip_routing.023.sh new file mode 100755 index 0000000..336e129 --- /dev/null +++ b/ctdb/tests/eventscripts/13.per_ip_routing.023.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +. "${TEST_SCRIPTS_DIR}/unit.sh" + +define_test "1 IP configured, broken configuration, takeip" + +setup_ctdb +setup_ctdb_policy_routing + +# Configuration for 1 IP +create_policy_routing_config 1 default + +# takeip should add routes for the given address +ctdb_get_1_public_address | +while read dev ip bits ; do + # Now add configuration breakage by changing default route into a + # link local route with a gateway + net=$(ipv4_host_addr_to_net "$ip" "$bits") + sed -i -e "s@0\.0\.0\.0/0@${net}@" "$CTDB_PER_IP_ROUTING_CONF" + + ok <<EOF +RTNETLINK answers: File exists +add_routing_for_ip: failed to add route: ${net} via ${net%.*}.254 dev ${dev} table ctdb.${ip} +EOF -- Samba Shared Repository