set a maximum name refresh time of 20 minutes.
authorAndrew Tridgell <tridge@samba.org>
Mon, 31 Aug 1998 04:19:31 +0000 (04:19 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 31 Aug 1998 04:19:31 +0000 (04:19 +0000)
The previous code was strictly correct, but not very practical. self
names were only refreshed every 3 days. I hit a situation where the
Samba WINS server was restarted after deleting wins.dat and didn't
notice some remote subnets (also running Samba). I realised that the
complete database wouldn't have been rebuilt for 3 days, which is way
too long. In order to recover from WINS restarts we need a much
shorter maximum refresh time.
(This used to be commit 1d23dd0912e81ff72695bd043e8e2aee32da18a8)

source3/include/nameserv.h
source3/nmbd/nmbd_mynames.c
source3/nmbd/nmbd_namelistdb.c

index fe00a1415d5cd8d7ae79d9d0c9de76366ca2381a..c219a1f723b49d2ca8f36c0fc2e5c4b096a15067 100644 (file)
@@ -546,6 +546,10 @@ struct packet_struct
 /* Do all remote announcements this often. */
 #define REMOTE_ANNOUNCE_INTERVAL 180
 
+/* what is the maximum period between name refreshes. Note that this only
+   affects non-permanent self names */
+#define MAX_REFRESH_TIME (60*20)
+
 /* Types of machine we can announce as. */
 #define ANNOUNCE_AS_NT 1
 #define ANNOUNCE_AS_WIN95 2
index ba42274165207640cd046708fd25f1407233294e..4a4e102786ed770107ac254ff0e6e5e85f568288 100644 (file)
@@ -197,7 +197,7 @@ void refresh_my_names(time_t t)
         if( !is_refresh_already_queued( subrec, namerec) )
           refresh_name( subrec, namerec, NULL, NULL, NULL );
         namerec->data.death_time += lp_max_ttl();
-        namerec->data.refresh_time += lp_max_ttl();
+        namerec->data.refresh_time += MIN(lp_max_ttl(), MAX_REFRESH_TIME);
       }
     }
   }
index de5835a11515d228b7cafb4e7a22c005df6e3160..498cbcfdcf6f6662ded5fa15381571df3bd405ae 100644 (file)
@@ -186,7 +186,7 @@ void update_name_ttl( struct name_record *namerec, int ttl )
   if( namerec->data.death_time != PERMANENT_TTL )
     namerec->data.death_time = time_now + ttl;
 
-  namerec->data.refresh_time = time_now + (ttl/2);
+  namerec->data.refresh_time = time_now + MIN((ttl/2), MAX_REFRESH_TIME);
 
   namerec->subnet->namelist_changed = True;
 } /* update_name_ttl */
@@ -251,7 +251,7 @@ struct name_record *add_name_to_subnet( struct subnet_record *subrec,
   else
     namerec->data.death_time = time_now + ttl;
 
-  namerec->data.refresh_time = time_now + (ttl/2);
+  namerec->data.refresh_time = time_now + MIN((ttl/2), MAX_REFRESH_TIME);
 
   /* Now add the record to the name list. */    
   update_name_in_namelist( subrec, namerec );