diff options
Diffstat (limited to 'source3')
| -rw-r--r-- | source3/lib/gencache.c | 89 | 
1 files changed, 14 insertions, 75 deletions
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index 577ff12a19..9a4cbc2cd7 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -40,13 +40,6 @@ static struct tdb_context *cache_notrans;   * @brief Generic, persistent and shared between processes cache mechanism   *        for use by various parts of the Samba code   * - * We have two cache files, one with transactions (gencache.tdb) and - * one without (gencache_notrans.tdb) that is CLEAR_IF_FIRST. Normal - * writes go to the gencache_notrans.tdb to be fast. Every 100 writes - * to the gencache (settable with gencache:stabilize_count) or every 5 - * minutes (settable with gencache:stabilize_interval) we stabilize - * gencache_notrans.tdb with one transaction to gencache.tdb. - *   **/ @@ -114,8 +107,7 @@ again:  	DEBUG(5, ("Opening cache file at %s\n", cache_fname)); -	cache_notrans = tdb_open_log(cache_fname, 0, -				     TDB_CLEAR_IF_FIRST | TDB_SEQNUM, +	cache_notrans = tdb_open_log(cache_fname, 0, TDB_CLEAR_IF_FIRST,  				     open_flags, 0644);  	if (cache_notrans == NULL) {  		DEBUG(5, ("Opening %s failed: %s\n", cache_fname, @@ -136,51 +128,6 @@ static TDB_DATA last_stabilize_key(void)  	return result;  } -struct gencache_parse_last_stabilize_state { -	bool found; -	int last_time; -	int last_seqnum; -}; - -static int gencache_parse_last_stabilize_fn(TDB_DATA key, TDB_DATA data, -					    void *private_data) -{ -	struct gencache_parse_last_stabilize_state *state = -		(struct gencache_parse_last_stabilize_state *)private_data; - -	if ((data.dptr == NULL) || (data.dsize == 0) || -	    (data.dptr[data.dsize-1] != '\0')) { -		return -1; -	} - -	if (sscanf((char *)data.dptr, "%d/%d", &state->last_time, -		   &state->last_seqnum) != 2) { -		return -1; -	} - -	state->found = true; -	return 0; -} - -static bool gencache_parse_last_stabilize(time_t *last_time, int *last_seqnum) -{ -	struct gencache_parse_last_stabilize_state state; - -	state.found = false; - -	if (tdb_parse_record(cache_notrans, last_stabilize_key(), -			     gencache_parse_last_stabilize_fn, -			     &state) == -1) { -		return false; -	} -	if (!state.found) { -		return false; -	} -	*last_time = state.last_time; -	*last_seqnum = state.last_seqnum; -	return true; -} -  /**   * Set an entry in the cache file. If there's no such   * one, then add it. @@ -197,9 +144,9 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob,  			    time_t timeout)  {  	int ret; +	TDB_DATA databuf;  	char* val;  	time_t last_stabilize; -	int last_seqnum;  	static int writecount;  	if (tdb_data_cmp(string_term_tdb_data(keystr), @@ -259,15 +206,17 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob,  	 * gencache_notrans.tdb too large.  	 */ -	if (gencache_parse_last_stabilize(&last_stabilize, &last_seqnum)) { -		time_t next; - -		next = last_stabilize + lp_parm_int( -			-1, "gencache", "stabilize_interval", 300); - -		if (next < time(NULL)) { -			gencache_stabilize(); -		} +	last_stabilize = 0; +	databuf = tdb_fetch(cache_notrans, last_stabilize_key()); +	if ((databuf.dptr != NULL) +	    && (databuf.dptr[databuf.dsize-1] == '\0')) { +		last_stabilize = atoi((char *)databuf.dptr); +		SAFE_FREE(databuf.dptr); +	} +	if ((last_stabilize +	     + lp_parm_int(-1, "gencache", "stabilize_interval", 300)) +	    < time(NULL)) { +		gencache_stabilize();  	}  done: @@ -462,19 +411,11 @@ bool gencache_stabilize(void)  	struct stabilize_state state;  	int res;  	char *now; -	time_t last_time; -	int last_seqnum;  	if (!gencache_init()) {  		return false;  	} -	if (gencache_parse_last_stabilize(&last_time, &last_seqnum) -	    && (last_seqnum == tdb_get_seqnum(cache_notrans))) { -		/* Nothing changed */ -		return true; -	} -  	res = tdb_transaction_start(cache);  	if (res == -1) {  		DEBUG(10, ("Could not start transaction on gencache.tdb: " @@ -527,9 +468,7 @@ bool gencache_stabilize(void)  		return false;  	} -	now = talloc_asprintf(talloc_tos(), "%d/%d", -			      (int)time(NULL), -			      tdb_get_seqnum(cache_notrans)+1); +	now = talloc_asprintf(talloc_tos(), "%d", (int)time(NULL));  	if (now != NULL) {  		tdb_store(cache_notrans, last_stabilize_key(),  			  string_term_tdb_data(now), 0);  | 
