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

Reply via email to