r12700: fix name release of replica records, we need to become the owner and allocate...
authorStefan Metzmacher <metze@samba.org>
Tue, 3 Jan 2006 20:03:51 +0000 (20:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:49:41 +0000 (13:49 -0500)
so that it gets replicated to the old owning wins server directly

metze
(This used to be commit 72198f00ea933db68f7ec5d85cac00c98b37a077)

source4/nbt_server/wins/winsdb.h
source4/nbt_server/wins/winsserver.c
source4/nbt_server/wins/winsserver.h

index 6bc1442f3cc1870a242bff5123cced2dd48df107..1163d96e91b44f01aa713540e48079d42a3f4950 100644 (file)
@@ -55,25 +55,4 @@ struct winsdb_handle {
        const char *local_owner;
 };
 
-struct wins_server {
-       /* wins server database handle */
-       struct winsdb_handle *wins_db;
-
-       /* some configuration */
-       struct {
-               /* 
-                * the interval (in secs) till an active record will be marked as RELEASED
-                */
-               uint32_t min_renew_interval;
-               uint32_t max_renew_interval;
-
-               /* 
-                * the interval (in secs) a record remains in RELEASED state,
-                * before it will be marked as TOMBSTONE
-                * (also known as extinction interval)
-                */
-               uint32_t tombstone_interval;
-       } config;
-};
-
 #include "nbt_server/wins/winsdb_proto.h"
index d6eeb69adaf28360d02980f13432b9d585267c4d..98ae6139058332b3c831be7766348c592b7ca6c6 100644 (file)
@@ -731,7 +731,23 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
        }
 
        if (rec->state == WREPL_STATE_RELEASED) {
-               rec->expire_time = time(NULL) + winssrv->config.tombstone_interval;
+               /*
+                * if we're not the owner, we need to take the owner ship
+                * and make the record tombstone, but expire after
+                * tombstone_interval + tombstone_timeout and not only after tombstone_timeout
+                * like for normal tombstone records.
+                * This is to replicate the record directly to the original owner,
+                * where the record is still active
+                */ 
+               if (strcmp(rec->wins_owner, winssrv->wins_db->local_owner) == 0) {
+                       rec->expire_time= time(NULL) + winssrv->config.tombstone_interval;
+               } else {
+                       rec->state      = WREPL_STATE_TOMBSTONE;
+                       rec->expire_time= time(NULL) + 
+                                         winssrv->config.tombstone_interval +
+                                         winssrv->config.tombstone_timeout;
+                       modify_flags    = WINSDB_FLAG_ALLOC_VERSION | WINSDB_FLAG_TAKE_OWNERSHIP;
+               }
        }
 
        ret = winsdb_modify(winssrv->wins_db, rec, modify_flags);
@@ -783,7 +799,7 @@ void nbtd_winsserver_request(struct nbt_name_socket *nbtsock,
 */
 NTSTATUS nbtd_winsserver_init(struct nbtd_server *nbtsrv)
 {
-       uint32_t tombstone_interval;
+       uint32_t tmp;
 
        if (!lp_wins_support()) {
                nbtsrv->winssrv = NULL;
@@ -795,8 +811,10 @@ NTSTATUS nbtd_winsserver_init(struct nbtd_server *nbtsrv)
 
        nbtsrv->winssrv->config.max_renew_interval = lp_max_wins_ttl();
        nbtsrv->winssrv->config.min_renew_interval = lp_min_wins_ttl();
-       tombstone_interval = lp_parm_int(-1,"wreplsrv","tombstone_interval", 6*24*60*60);
-       nbtsrv->winssrv->config.tombstone_interval = tombstone_interval;
+       tmp = lp_parm_int(-1,"wreplsrv","tombstone_interval", 6*24*60*60);
+       nbtsrv->winssrv->config.tombstone_interval = tmp;
+       tmp = lp_parm_int(-1,"wreplsrv","tombstone_timeout", 1*24*60*60);
+       nbtsrv->winssrv->config.tombstone_timeout = tmp;
 
        nbtsrv->winssrv->wins_db     = winsdb_connect(nbtsrv->winssrv);
        if (!nbtsrv->winssrv->wins_db) {
index 0ac40e750178b8d5f9eb24221cf4f6b417dab30d..aae2e3dfbc3752d05b18db532f80b84e37d32ba5 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+struct wins_server {
+       /* wins server database handle */
+       struct winsdb_handle *wins_db;
+
+       /* some configuration */
+       struct {
+               /* 
+                * the interval (in secs) till an active record will be marked as RELEASED
+                */
+               uint32_t min_renew_interval;
+               uint32_t max_renew_interval;
+
+               /* 
+                * the interval (in secs) a record remains in RELEASED state,
+                * before it will be marked as TOMBSTONE
+                * (also known as extinction interval)
+                */
+               uint32_t tombstone_interval;
+
+               /* 
+                * the interval (in secs) a record remains in TOMBSTONE state,
+                * before it will be removed from the database.
+                * See also 'tombstone_extra_timeout'.
+                * (also known as extinction timeout)
+                */
+               uint32_t tombstone_timeout;
+       } config;
+};
+
 struct wins_challenge_io {
        struct {
                struct nbtd_server *nbtd_server;