s3:count_current_connections: do not clear orphaned entries from connections.tdb
authorGregor Beck <gbeck@sernet.de>
Mon, 27 Aug 2012 13:12:36 +0000 (15:12 +0200)
committerMichael Adam <obnox@samba.org>
Fri, 19 Oct 2012 10:14:59 +0000 (12:14 +0200)
This removes one of the last callers of connetions_forall.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
source3/smbd/connection.c
source3/smbd/proto.h

index d334e8bdc1e70595ecfacc3f4fca2f24cee2f71f..ac2ab955d2bcce9670bd434d63ea8a3a277f91c3 100644 (file)
@@ -57,15 +57,14 @@ bool yield_connection(connection_struct *conn, const char *name)
 struct count_stat {
        int curr_connections;
        const char *name;
-       bool Clear;
+       bool verify;
 };
 
 /****************************************************************************
  Count the entries belonging to a service in the connection db.
 ****************************************************************************/
 
-static int count_fn(struct db_record *rec,
-                   const struct connections_key *ckey,
+static int count_fn(const struct connections_key *ckey,
                    const struct connections_data *crec,
                    void *udp)
 {
@@ -75,24 +74,13 @@ static int count_fn(struct db_record *rec,
                return 0;
        }
 
-       /* If the pid was not found delete the entry from connections.tdb */
-
-       if (cs->Clear && !process_exists(crec->pid) && (errno == ESRCH)) {
-               NTSTATUS status;
-               DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n",
-                        procid_str_static(&crec->pid), crec->cnum,
-                        crec->servicename));
-
-               status = dbwrap_record_delete(rec);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0,("count_fn: tdb_delete failed with error %s\n",
-                                nt_errstr(status)));
-               }
+       if (cs->verify && !process_exists(crec->pid)) {
                return 0;
        }
 
-       if (strequal(crec->servicename, cs->name))
+       if (strequal(crec->servicename, cs->name)) {
                cs->curr_connections++;
+       }
 
        return 0;
 }
@@ -101,14 +89,14 @@ static int count_fn(struct db_record *rec,
  Claim an entry in the connections database.
 ****************************************************************************/
 
-int count_current_connections( const char *sharename, bool clear  )
+int count_current_connections(const char *sharename, bool verify)
 {
        struct count_stat cs;
        int ret;
 
        cs.curr_connections = 0;
        cs.name = sharename;
-       cs.Clear = clear;
+       cs.verify = verify;
 
        /*
         * This has a race condition, but locking the chain before hand is worse
@@ -120,7 +108,7 @@ int count_current_connections( const char *sharename, bool clear  )
         * via ctdb, which is not possible without root.
         */
        become_root();
-       ret = connections_forall(count_fn, &cs);
+       ret = connections_forall_read(count_fn, &cs);
        unbecome_root();
 
        if (ret < 0) {
index f1b359f917966cf86e3de935e0b31db626ee2981..a71547678f2f1b45c57eae3a20b1c1ef25c3a93d 100644 (file)
@@ -161,7 +161,7 @@ void msg_force_tdis(struct messaging_context *msg,
 /* The following definitions come from smbd/connection.c  */
 
 bool yield_connection(connection_struct *conn, const char *name);
-int count_current_connections( const char *sharename, bool clear  );
+int count_current_connections(const char *sharename, bool verify);
 bool connections_snum_used(struct smbd_server_connection *unused, int snum);
 bool claim_connection(connection_struct *conn, const char *name);