s3:libsmb/namequery.c: add saf_join_store() function
authorStefan Metzmacher <metze@samba.org>
Mon, 27 Oct 2008 18:31:30 +0000 (19:31 +0100)
committerStefan Metzmacher <metze@samba.org>
Sat, 13 Dec 2008 10:42:35 +0000 (11:42 +0100)
saf_join_store() should be called after a successful
domain join, the affinity to the dc used at join time
has a larger ttl, to avoid problems with delayed replication.

metze

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: G√ľnther Deschner <gd@samba.org>
(cherry picked from commit 80e74a27c55c01221091e3eec930c2ac4433c22c)

source3/include/proto.h
source3/libsmb/namequery.c

index 09ebaa799e52842ed2c65f14437fa1a82df0cca4..69194ec6b2f69179a539a529189afca974f4efde 100644 (file)
@@ -2984,6 +2984,7 @@ bool namecache_status_fetch(const char *keyname,
 /* The following definitions come from libsmb/namequery.c  */
 
 bool saf_store( const char *domain, const char *servername );
+bool saf_join_store( const char *domain, const char *servername );
 bool saf_delete( const char *domain );
 char *saf_fetch( const char *domain );
 NODE_STATUS_STRUCT *node_status_query(int fd,
index 87ed5af14c59b4ccad4cc7a99f1ccb7015891f34..05679570d419d573fcaf4bbed41333c469fd8820 100644 (file)
@@ -34,6 +34,8 @@ bool global_in_nmbd = False;
 ****************************************************************************/
 #define SAFKEY_FMT     "SAF/DOMAIN/%s"
 #define SAF_TTL                900
+#define SAFJOINKEY_FMT "SAFJOIN/DOMAIN/%s"
+#define SAFJOIN_TTL    3600
 
 static char *saf_key(const char *domain)
 {
@@ -44,6 +46,15 @@ static char *saf_key(const char *domain)
        return keystr;
 }
 
+static char *saf_join_key(const char *domain)
+{
+       char *keystr;
+
+       asprintf_strupper_m(&keystr, SAFJOINKEY_FMT, domain);
+
+       return keystr;
+}
+
 /****************************************************************************
 ****************************************************************************/
 
@@ -69,7 +80,7 @@ bool saf_store( const char *domain, const char *servername )
                return False;
 
        key = saf_key( domain );
-       expire = time( NULL ) + SAF_TTL;
+       expire = time( NULL ) + lp_parm_int(-1, "saf","ttl", SAF_TTL);
 
        DEBUG(10,("saf_store: domain = [%s], server = [%s], expire = [%u]\n",
                domain, servername, (unsigned int)expire ));
@@ -81,6 +92,38 @@ bool saf_store( const char *domain, const char *servername )
        return ret;
 }
 
+bool saf_join_store( const char *domain, const char *servername )
+{
+       char *key;
+       time_t expire;
+       bool ret = False;
+
+       if ( !domain || !servername ) {
+               DEBUG(2,("saf_join_store: Refusing to store empty domain or servername!\n"));
+               return False;
+       }
+
+       if ( (strlen(domain) == 0) || (strlen(servername) == 0) ) {
+               DEBUG(0,("saf_join_store: refusing to store 0 length domain or servername!\n"));
+               return False;
+       }
+
+       if ( !gencache_init() )
+               return False;
+
+       key = saf_join_key( domain );
+       expire = time( NULL ) + lp_parm_int(-1, "saf","join ttl", SAFJOIN_TTL);
+
+       DEBUG(10,("saf_join_store: domain = [%s], server = [%s], expire = [%u]\n",
+               domain, servername, (unsigned int)expire ));
+
+       ret = gencache_set( key, servername, expire );
+
+       SAFE_FREE( key );
+
+       return ret;
+}
+
 bool saf_delete( const char *domain )
 {
        char *key;
@@ -94,15 +137,22 @@ bool saf_delete( const char *domain )
        if ( !gencache_init() )
                return False;
 
+       key = saf_join_key(domain);
+       ret = gencache_del(key);
+       SAFE_FREE(key);
+
+       if (ret) {
+               DEBUG(10,("saf_delete[join]: domain = [%s]\n", domain ));
+       }
+
        key = saf_key(domain);
        ret = gencache_del(key);
+       SAFE_FREE(key);
 
        if (ret) {
                DEBUG(10,("saf_delete: domain = [%s]\n", domain ));
        }
 
-       SAFE_FREE( key );
-
        return ret;
 }
 
@@ -124,6 +174,18 @@ char *saf_fetch( const char *domain )
        if ( !gencache_init() )
                return False;
 
+       key = saf_join_key( domain );
+
+       ret = gencache_get( key, &server, &timeout );
+
+       SAFE_FREE( key );
+
+       if ( ret ) {
+               DEBUG(5,("saf_fetch[join]: Returning \"%s\" for \"%s\" domain\n",
+                       server, domain ));
+               return server;
+       }
+
        key = saf_key( domain );
 
        ret = gencache_get( key, &server, &timeout );