s3:gencache: Add a "was_expired" argument to gencache_get_data_blob
authorVolker Lendecke <vl@samba.org>
Wed, 23 Sep 2009 13:21:40 +0000 (15:21 +0200)
committerVolker Lendecke <vl@samba.org>
Wed, 23 Sep 2009 16:50:33 +0000 (18:50 +0200)
This is set to true if the routine returns failure due to an existing but
expired entry.

source3/include/proto.h
source3/lib/gencache.c
source3/libsmb/dsgetdcname.c
source3/torture/torture.c

index f2350e7d886e5f58ecec30ba5225bf024b8c6d94..d664a26949cf31bc81b3082d719f8bb743f1f192 100644 (file)
@@ -535,7 +535,7 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout);
 bool gencache_del(const char *keystr);
 bool gencache_get(const char *keystr, char **valstr, time_t *timeout);
 bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
-                           time_t *timeout);
+                           time_t *timeout, bool *was_expired);
 bool gencache_stabilize(void);
 bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob, time_t timeout);
 void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
index ee1f4b70b3fe89d8a9d55daf2e205adc6513dafb..5c030cddab47070fb6cb4accc582bc24c207dd1e 100644 (file)
@@ -273,24 +273,25 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
  **/
 
 bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
-                           time_t *timeout)
+                           time_t *timeout, bool *was_expired)
 {
        TDB_DATA databuf;
        time_t t;
        char *endptr;
+       bool expired = false;
 
        if (keystr == NULL) {
-               return false;
+               goto fail;
        }
 
        if (tdb_data_cmp(string_term_tdb_data(keystr),
                         last_stabilize_key()) == 0) {
                DEBUG(10, ("Can't get %s as a key\n", keystr));
-               return false;
+               goto fail;
        }
 
        if (!gencache_init()) {
-               return False;
+               goto fail;
        }
 
        databuf = tdb_fetch_bystring(cache_notrans, keystr);
@@ -302,12 +303,12 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
        if (databuf.dptr == NULL) {
                DEBUG(10, ("Cache entry with key = %s couldn't be found \n",
                           keystr));
-               return False;
+               goto fail;
        }
 
        if (!gencache_pull_timeout((char *)databuf.dptr, &t, &endptr)) {
                SAFE_FREE(databuf.dptr);
-               return False;
+               goto fail;
        }
 
        DEBUG(10, ("Returning %s cache entry: key = %s, value = %s, "
@@ -317,7 +318,7 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
        if (t == 0) {
                /* Deleted */
                SAFE_FREE(databuf.dptr);
-               return False;
+               goto fail;
        }
 
        if (t <= time(NULL)) {
@@ -331,7 +332,9 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
                gencache_set(keystr, "", 0);
 
                SAFE_FREE(databuf.dptr);
-               return False;
+
+               expired = true;
+               goto fail;
        }
 
        if (blob != NULL) {
@@ -341,7 +344,7 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
                if (blob->data == NULL) {
                        SAFE_FREE(databuf.dptr);
                        DEBUG(0, ("memdup failed\n"));
-                       return False;
+                       goto fail;
                }
        }
 
@@ -352,6 +355,12 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
        }
 
        return True;
+
+fail:
+       if (was_expired != NULL) {
+               *was_expired = expired;
+       }
+       return false;
 } 
 
 struct stabilize_state {
@@ -503,7 +512,7 @@ bool gencache_get(const char *keystr, char **value, time_t *ptimeout)
        DATA_BLOB blob;
        bool ret = False;
 
-       ret = gencache_get_data_blob(keystr, &blob, ptimeout);
+       ret = gencache_get_data_blob(keystr, &blob, ptimeout, NULL);
        if (!ret) {
                return false;
        }
index 99d21eb641751d1c309997d174abd98233eaffe9..98b65942e4df030ece242492245862aa8c2eda68 100644 (file)
@@ -331,7 +331,7 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       if (!gencache_get_data_blob(key, &blob, NULL)) {
+       if (!gencache_get_data_blob(key, &blob, NULL, NULL)) {
                return NT_STATUS_NOT_FOUND;
        }
 
index 98694ed3d00a43e78d6aa4329e4105f77041a1e2..9e1ac7648ed606ecafa8f884c25dbc52c22eee8d 100644 (file)
@@ -5863,7 +5863,7 @@ static bool run_local_gencache(int dummy)
                return False;
        }
 
-       if (!gencache_get_data_blob("foo", &blob, NULL)) {
+       if (!gencache_get_data_blob("foo", &blob, NULL, NULL)) {
                d_printf("%s: gencache_get_data_blob() failed\n", __location__);
                return False;
        }
@@ -5887,7 +5887,7 @@ static bool run_local_gencache(int dummy)
                return False;
        }
 
-       if (gencache_get_data_blob("foo", &blob, NULL)) {
+       if (gencache_get_data_blob("foo", &blob, NULL, NULL)) {
                d_printf("%s: gencache_get_data_blob() on deleted entry "
                         "succeeded\n", __location__);
                return False;