aboutsummaryrefslogtreecommitdiff
path: root/src/datacache
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-06-12 14:48:00 +0200
committerChristian Grothoff <christian@grothoff.org>2018-06-12 14:48:00 +0200
commitf6a87ee66310529edf76c0fab76cdc7cd2aac216 (patch)
treee3697e5f549bd6d0adbeede9935b67313d4907cf /src/datacache
parentae8b5cb2eac770be0d18b7d46c238bf865e34023 (diff)
downloadgnunet-f6a87ee66310529edf76c0fab76cdc7cd2aac216.tar.gz
gnunet-f6a87ee66310529edf76c0fab76cdc7cd2aac216.zip
ensure datacache does not return expired records, fixig pq behavior with respect to FOREVER absolute time
Diffstat (limited to 'src/datacache')
-rw-r--r--src/datacache/plugin_datacache_heap.c3
-rw-r--r--src/datacache/plugin_datacache_postgres.c33
-rw-r--r--src/datacache/test_datacache.c73
-rw-r--r--src/datacache/test_datacache_quota.c31
4 files changed, 102 insertions, 38 deletions
diff --git a/src/datacache/plugin_datacache_heap.c b/src/datacache/plugin_datacache_heap.c
index 2a08fc81b..494d1ae17 100644
--- a/src/datacache/plugin_datacache_heap.c
+++ b/src/datacache/plugin_datacache_heap.c
@@ -314,6 +314,9 @@ get_cb (void *cls,
314 if ( (get_ctx->type != val->type) && 314 if ( (get_ctx->type != val->type) &&
315 (GNUNET_BLOCK_TYPE_ANY != get_ctx->type) ) 315 (GNUNET_BLOCK_TYPE_ANY != get_ctx->type) )
316 return GNUNET_OK; 316 return GNUNET_OK;
317 if (0 ==
318 GNUNET_TIME_absolute_get_remaining (val->discard_time).rel_value_us)
319 return GNUNET_OK;
317 if (NULL != get_ctx->iter) 320 if (NULL != get_ctx->iter)
318 ret = get_ctx->iter (get_ctx->iter_cls, 321 ret = get_ctx->iter (get_ctx->iter_cls,
319 key, 322 key,
diff --git a/src/datacache/plugin_datacache_postgres.c b/src/datacache/plugin_datacache_postgres.c
index 6eeeb5873..ea87acc1f 100644
--- a/src/datacache/plugin_datacache_postgres.c
+++ b/src/datacache/plugin_datacache_postgres.c
@@ -82,12 +82,12 @@ init_connection (struct Plugin *plugin)
82 struct GNUNET_PQ_PreparedStatement ps[] = { 82 struct GNUNET_PQ_PreparedStatement ps[] = {
83 GNUNET_PQ_make_prepare ("getkt", 83 GNUNET_PQ_make_prepare ("getkt",
84 "SELECT discard_time,type,value,path FROM gn011dc " 84 "SELECT discard_time,type,value,path FROM gn011dc "
85 "WHERE key=$1 AND type=$2", 85 "WHERE key=$1 AND type=$2 AND discard_time >= $3",
86 2), 86 3),
87 GNUNET_PQ_make_prepare ("getk", 87 GNUNET_PQ_make_prepare ("getk",
88 "SELECT discard_time,type,value,path FROM gn011dc " 88 "SELECT discard_time,type,value,path FROM gn011dc "
89 "WHERE key=$1", 89 "WHERE key=$1 AND discard_time >= $2",
90 1), 90 2),
91 GNUNET_PQ_make_prepare ("getex", 91 GNUNET_PQ_make_prepare ("getex",
92 "SELECT length(value) AS len,oid,key FROM gn011dc" 92 "SELECT length(value) AS len,oid,key FROM gn011dc"
93 " WHERE discard_time < $1" 93 " WHERE discard_time < $1"
@@ -97,18 +97,15 @@ init_connection (struct Plugin *plugin)
97 "SELECT length(value) AS len,oid,key FROM gn011dc" 97 "SELECT length(value) AS len,oid,key FROM gn011dc"
98 " ORDER BY prox ASC, discard_time ASC LIMIT 1", 98 " ORDER BY prox ASC, discard_time ASC LIMIT 1",
99 0), 99 0),
100 GNUNET_PQ_make_prepare ("getp",
101 "SELECT length(value) AS len,oid,key FROM gn011dc "
102 "ORDER BY discard_time ASC LIMIT 1",
103 0),
104 GNUNET_PQ_make_prepare ("get_random", 100 GNUNET_PQ_make_prepare ("get_random",
105 "SELECT discard_time,type,value,path,key FROM gn011dc " 101 "SELECT discard_time,type,value,path,key FROM gn011dc"
106 "ORDER BY key ASC LIMIT 1 OFFSET $1", 102 " WHERE discard_time >= $1"
107 1), 103 " ORDER BY key ASC LIMIT 1 OFFSET $2",
104 2),
108 GNUNET_PQ_make_prepare ("get_closest", 105 GNUNET_PQ_make_prepare ("get_closest",
109 "SELECT discard_time,type,value,path,key FROM gn011dc " 106 "SELECT discard_time,type,value,path,key FROM gn011dc "
110 "WHERE key>=$1 ORDER BY key ASC LIMIT $2", 107 "WHERE key>=$1 AND discard_time >= $2 ORDER BY key ASC LIMIT $3",
111 1), 108 3),
112 GNUNET_PQ_make_prepare ("delrow", 109 GNUNET_PQ_make_prepare ("delrow",
113 "DELETE FROM gn011dc WHERE oid=$1", 110 "DELETE FROM gn011dc WHERE oid=$1",
114 1), 111 1),
@@ -313,18 +310,22 @@ postgres_plugin_get (void *cls,
313{ 310{
314 struct Plugin *plugin = cls; 311 struct Plugin *plugin = cls;
315 uint32_t type32 = (uint32_t) type; 312 uint32_t type32 = (uint32_t) type;
313 struct GNUNET_TIME_Absolute now;
316 struct GNUNET_PQ_QueryParam paramk[] = { 314 struct GNUNET_PQ_QueryParam paramk[] = {
317 GNUNET_PQ_query_param_auto_from_type (key), 315 GNUNET_PQ_query_param_auto_from_type (key),
316 GNUNET_PQ_query_param_absolute_time (&now),
318 GNUNET_PQ_query_param_end 317 GNUNET_PQ_query_param_end
319 }; 318 };
320 struct GNUNET_PQ_QueryParam paramkt[] = { 319 struct GNUNET_PQ_QueryParam paramkt[] = {
321 GNUNET_PQ_query_param_auto_from_type (key), 320 GNUNET_PQ_query_param_auto_from_type (key),
322 GNUNET_PQ_query_param_uint32 (&type32), 321 GNUNET_PQ_query_param_uint32 (&type32),
322 GNUNET_PQ_query_param_absolute_time (&now),
323 GNUNET_PQ_query_param_end 323 GNUNET_PQ_query_param_end
324 }; 324 };
325 enum GNUNET_DB_QueryStatus res; 325 enum GNUNET_DB_QueryStatus res;
326 struct HandleResultContext hr_ctx; 326 struct HandleResultContext hr_ctx;
327 327
328 now = GNUNET_TIME_absolute_get ();
328 hr_ctx.iter = iter; 329 hr_ctx.iter = iter;
329 hr_ctx.iter_cls = iter_cls; 330 hr_ctx.iter_cls = iter_cls;
330 hr_ctx.key = key; 331 hr_ctx.key = key;
@@ -427,6 +428,7 @@ postgres_plugin_get_random (void *cls,
427{ 428{
428 struct Plugin *plugin = cls; 429 struct Plugin *plugin = cls;
429 uint32_t off; 430 uint32_t off;
431 struct GNUNET_TIME_Absolute now;
430 struct GNUNET_TIME_Absolute expiration_time; 432 struct GNUNET_TIME_Absolute expiration_time;
431 size_t data_size; 433 size_t data_size;
432 void *data; 434 void *data;
@@ -436,6 +438,7 @@ postgres_plugin_get_random (void *cls,
436 uint32_t type; 438 uint32_t type;
437 enum GNUNET_DB_QueryStatus res; 439 enum GNUNET_DB_QueryStatus res;
438 struct GNUNET_PQ_QueryParam params[] = { 440 struct GNUNET_PQ_QueryParam params[] = {
441 GNUNET_PQ_query_param_absolute_time (&now),
439 GNUNET_PQ_query_param_uint32 (&off), 442 GNUNET_PQ_query_param_uint32 (&off),
440 GNUNET_PQ_query_param_end 443 GNUNET_PQ_query_param_end
441 }; 444 };
@@ -459,6 +462,7 @@ postgres_plugin_get_random (void *cls,
459 return 0; 462 return 0;
460 if (NULL == iter) 463 if (NULL == iter)
461 return 1; 464 return 1;
465 now = GNUNET_TIME_absolute_get ();
462 off = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 466 off = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
463 plugin->num_items); 467 plugin->num_items);
464 res = GNUNET_PQ_eval_prepared_singleton_select (plugin->dbh, 468 res = GNUNET_PQ_eval_prepared_singleton_select (plugin->dbh,
@@ -620,8 +624,10 @@ postgres_plugin_get_closest (void *cls,
620{ 624{
621 struct Plugin *plugin = cls; 625 struct Plugin *plugin = cls;
622 uint32_t num_results32 = (uint32_t) num_results; 626 uint32_t num_results32 = (uint32_t) num_results;
627 struct GNUNET_TIME_Absolute now;
623 struct GNUNET_PQ_QueryParam params[] = { 628 struct GNUNET_PQ_QueryParam params[] = {
624 GNUNET_PQ_query_param_auto_from_type (key), 629 GNUNET_PQ_query_param_auto_from_type (key),
630 GNUNET_PQ_query_param_absolute_time (&now),
625 GNUNET_PQ_query_param_uint32 (&num_results32), 631 GNUNET_PQ_query_param_uint32 (&num_results32),
626 GNUNET_PQ_query_param_end 632 GNUNET_PQ_query_param_end
627 }; 633 };
@@ -630,6 +636,7 @@ postgres_plugin_get_closest (void *cls,
630 636
631 erc.iter = iter; 637 erc.iter = iter;
632 erc.iter_cls = iter_cls; 638 erc.iter_cls = iter_cls;
639 now = GNUNET_TIME_absolute_get ();
633 res = GNUNET_PQ_eval_prepared_multi_select (plugin->dbh, 640 res = GNUNET_PQ_eval_prepared_multi_select (plugin->dbh,
634 "get_closest", 641 "get_closest",
635 params, 642 params,
diff --git a/src/datacache/test_datacache.c b/src/datacache/test_datacache.c
index 12edb62f8..50e45012d 100644
--- a/src/datacache/test_datacache.c
+++ b/src/datacache/test_datacache.c
@@ -44,6 +44,11 @@ checkIt (void *cls,
44 unsigned int path_len, 44 unsigned int path_len,
45 const struct GNUNET_PeerIdentity *path) 45 const struct GNUNET_PeerIdentity *path)
46{ 46{
47 (void) key;
48 (void) type;
49 (void) exp;
50 (void) path_len;
51 (void) path;
47 if (size != sizeof (struct GNUNET_HashCode)) 52 if (size != sizeof (struct GNUNET_HashCode))
48 { 53 {
49 GNUNET_break (0); 54 GNUNET_break (0);
@@ -59,17 +64,22 @@ checkIt (void *cls,
59 64
60 65
61static void 66static void
62run (void *cls, char *const *args, const char *cfgfile, 67run (void *cls,
68 char *const *args,
69 const char *cfgfile,
63 const struct GNUNET_CONFIGURATION_Handle *cfg) 70 const struct GNUNET_CONFIGURATION_Handle *cfg)
64{ 71{
65 struct GNUNET_DATACACHE_Handle *h; 72 struct GNUNET_DATACACHE_Handle *h;
66 struct GNUNET_HashCode k; 73 struct GNUNET_HashCode k;
67 struct GNUNET_HashCode n; 74 struct GNUNET_HashCode n;
68 struct GNUNET_TIME_Absolute exp; 75 struct GNUNET_TIME_Absolute exp;
69 unsigned int i;
70 76
77 (void) cls;
78 (void) args;
79 (void) cfgfile;
71 ok = 0; 80 ok = 0;
72 h = GNUNET_DATACACHE_create (cfg, "testcache"); 81 h = GNUNET_DATACACHE_create (cfg,
82 "testcache");
73 if (h == NULL) 83 if (h == NULL)
74 { 84 {
75 FPRINTF (stderr, 85 FPRINTF (stderr,
@@ -81,7 +91,7 @@ run (void *cls, char *const *args, const char *cfgfile,
81 exp = GNUNET_TIME_absolute_get (); 91 exp = GNUNET_TIME_absolute_get ();
82 exp.abs_value_us += 5 * 60 * 1000 * 1000LL; 92 exp.abs_value_us += 5 * 60 * 1000 * 1000LL;
83 memset (&k, 0, sizeof (struct GNUNET_HashCode)); 93 memset (&k, 0, sizeof (struct GNUNET_HashCode));
84 for (i = 0; i < 100; i++) 94 for (unsigned int i = 0; i < 100; i++)
85 { 95 {
86 GNUNET_CRYPTO_hash (&k, sizeof (struct GNUNET_HashCode), &n); 96 GNUNET_CRYPTO_hash (&k, sizeof (struct GNUNET_HashCode), &n);
87 ASSERT (GNUNET_OK == 97 ASSERT (GNUNET_OK ==
@@ -93,26 +103,43 @@ run (void *cls, char *const *args, const char *cfgfile,
93 0, NULL)); 103 0, NULL));
94 k = n; 104 k = n;
95 } 105 }
96 memset (&k, 0, sizeof (struct GNUNET_HashCode)); 106 memset (&k,
97 for (i = 0; i < 100; i++) 107 0,
108 sizeof (struct GNUNET_HashCode));
109 for (unsigned int i = 0; i < 100; i++)
98 { 110 {
99 GNUNET_CRYPTO_hash (&k, sizeof (struct GNUNET_HashCode), &n); 111 GNUNET_CRYPTO_hash (&k,
100 ASSERT (1 == GNUNET_DATACACHE_get (h, &k, 1 + i % 16, &checkIt, &n)); 112 sizeof (struct GNUNET_HashCode),
113 &n);
114 ASSERT (1 == GNUNET_DATACACHE_get (h,
115 &k,
116 1 + i % 16,
117 &checkIt,
118 &n));
101 k = n; 119 k = n;
102 } 120 }
103 121
104 memset (&k, 42, sizeof (struct GNUNET_HashCode)); 122 memset (&k,
105 GNUNET_CRYPTO_hash (&k, sizeof (struct GNUNET_HashCode), &n); 123 42,
124 sizeof (struct GNUNET_HashCode));
125 GNUNET_CRYPTO_hash (&k,
126 sizeof (struct GNUNET_HashCode),
127 &n);
106 ASSERT (GNUNET_OK == 128 ASSERT (GNUNET_OK ==
107 GNUNET_DATACACHE_put (h, 129 GNUNET_DATACACHE_put (h,
108 &k, 130 &k,
109 GNUNET_YES, 131 GNUNET_YES,
110 sizeof (struct GNUNET_HashCode), 132 sizeof (struct GNUNET_HashCode),
111 (const char *) &n, 792, 133 (const char *) &n,
134 792,
112 GNUNET_TIME_UNIT_FOREVER_ABS, 135 GNUNET_TIME_UNIT_FOREVER_ABS,
113 0, NULL)); 136 0,
114 ASSERT (0 != GNUNET_DATACACHE_get (h, &k, 792, &checkIt, &n)); 137 NULL));
115 138 ASSERT (0 != GNUNET_DATACACHE_get (h,
139 &k,
140 792,
141 &checkIt,
142 &n));
116 GNUNET_DATACACHE_destroy (h); 143 GNUNET_DATACACHE_destroy (h);
117 ASSERT (ok == 0); 144 ASSERT (ok == 0);
118 return; 145 return;
@@ -137,16 +164,26 @@ main (int argc, char *argv[])
137 GNUNET_GETOPT_OPTION_END 164 GNUNET_GETOPT_OPTION_END
138 }; 165 };
139 166
167 (void) argc;
140 GNUNET_log_setup ("test-datacache", 168 GNUNET_log_setup ("test-datacache",
141 "WARNING", 169 "WARNING",
142 NULL); 170 NULL);
143 plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]); 171 plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
144 GNUNET_snprintf (cfg_name, sizeof (cfg_name), "test_datacache_data_%s.conf", 172 GNUNET_snprintf (cfg_name,
173 sizeof (cfg_name),
174 "test_datacache_data_%s.conf",
145 plugin_name); 175 plugin_name);
146 GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1, xargv, 176 GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1,
147 "test-datacache", "nohelp", options, &run, NULL); 177 xargv,
178 "test-datacache",
179 "nohelp",
180 options,
181 &run,
182 NULL);
148 if ( (0 != ok) && (77 != ok) ) 183 if ( (0 != ok) && (77 != ok) )
149 FPRINTF (stderr, "Missed some testcases: %d\n", ok); 184 FPRINTF (stderr,
185 "Missed some testcases: %d\n",
186 ok);
150 return ok; 187 return ok;
151} 188}
152 189
diff --git a/src/datacache/test_datacache_quota.c b/src/datacache/test_datacache_quota.c
index 3d02a7244..21e373608 100644
--- a/src/datacache/test_datacache_quota.c
+++ b/src/datacache/test_datacache_quota.c
@@ -41,7 +41,9 @@ static const char *plugin_name;
41 * some of the data from the last iteration is still there. 41 * some of the data from the last iteration is still there.
42 */ 42 */
43static void 43static void
44run (void *cls, char *const *args, const char *cfgfile, 44run (void *cls,
45 char *const *args,
46 const char *cfgfile,
45 const struct GNUNET_CONFIGURATION_Handle *cfg) 47 const struct GNUNET_CONFIGURATION_Handle *cfg)
46{ 48{
47 struct GNUNET_DATACACHE_Handle *h; 49 struct GNUNET_DATACACHE_Handle *h;
@@ -50,8 +52,12 @@ run (void *cls, char *const *args, const char *cfgfile,
50 char buf[3200]; 52 char buf[3200];
51 struct GNUNET_TIME_Absolute exp; 53 struct GNUNET_TIME_Absolute exp;
52 54
55 (void) cls;
56 (void) args;
57 (void) cfgfile;
53 ok = 0; 58 ok = 0;
54 h = GNUNET_DATACACHE_create (cfg, "testcache"); 59 h = GNUNET_DATACACHE_create (cfg,
60 "testcache");
55 61
56 if (h == NULL) 62 if (h == NULL)
57 { 63 {
@@ -112,7 +118,8 @@ FAILURE:
112 118
113 119
114int 120int
115main (int argc, char *argv[]) 121main (int argc,
122 char *argv[])
116{ 123{
117 char cfg_name[128]; 124 char cfg_name[128];
118 char *const xargv[] = { 125 char *const xargv[] = {
@@ -125,17 +132,27 @@ main (int argc, char *argv[])
125 GNUNET_GETOPT_OPTION_END 132 GNUNET_GETOPT_OPTION_END
126 }; 133 };
127 134
135 (void) argc;
128 GNUNET_log_setup ("test-datacache-quota", 136 GNUNET_log_setup ("test-datacache-quota",
129 "WARNING", 137 "WARNING",
130 NULL); 138 NULL);
131 139
132 plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]); 140 plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
133 GNUNET_snprintf (cfg_name, sizeof (cfg_name), "test_datacache_data_%s.conf", 141 GNUNET_snprintf (cfg_name,
142 sizeof (cfg_name),
143 "test_datacache_data_%s.conf",
134 plugin_name); 144 plugin_name);
135 GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1, xargv, 145 GNUNET_PROGRAM_run ((sizeof (xargv) / sizeof (char *)) - 1,
136 "test-datacache-quota", "nohelp", options, &run, NULL); 146 xargv,
147 "test-datacache-quota",
148 "nohelp",
149 options,
150 &run,
151 NULL);
137 if (0 != ok) 152 if (0 != ok)
138 FPRINTF (stderr, "Missed some testcases: %d\n", ok); 153 FPRINTF (stderr,
154 "Missed some testcases: %d\n",
155 ok);
139 return ok; 156 return ok;
140} 157}
141 158