aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datastore/Makefile.am1
-rw-r--r--src/datastore/datastore_api.c108
-rw-r--r--src/datastore/perf_datastore_api.c6
-rw-r--r--src/datastore/perf_datastore_api_iterators.c6
-rw-r--r--src/datastore/plugin_datastore_sqlite.c204
-rw-r--r--src/datastore/test_datastore_api.c198
-rw-r--r--src/include/gnunet_datastore_service.h2
-rw-r--r--src/transport/plugin_transport_tcp.c8
-rw-r--r--src/transport/test_transport_api_data.conf2
-rw-r--r--src/transport/test_transport_api_peer1.conf2
-rw-r--r--src/transport/test_transport_api_peer2.conf2
-rw-r--r--src/util/disk.c8
12 files changed, 340 insertions, 207 deletions
diff --git a/src/datastore/Makefile.am b/src/datastore/Makefile.am
index 1ad59099c..c3b8a9b15 100644
--- a/src/datastore/Makefile.am
+++ b/src/datastore/Makefile.am
@@ -43,6 +43,7 @@ plugin_LTLIBRARIES = \
43libgnunet_plugin_datastore_sqlite_la_SOURCES = \ 43libgnunet_plugin_datastore_sqlite_la_SOURCES = \
44 plugin_datastore_sqlite.c 44 plugin_datastore_sqlite.c
45libgnunet_plugin_datastore_sqlite_la_LIBADD = \ 45libgnunet_plugin_datastore_sqlite_la_LIBADD = \
46 $(top_builddir)/src/statistics/libgnunetstatistics.la \
46 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 47 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3
47libgnunet_plugin_datastore_sqlite_la_LDFLAGS = \ 48libgnunet_plugin_datastore_sqlite_la_LDFLAGS = \
48 $(GN_PLUGIN_LDFLAGS) 49 $(GN_PLUGIN_LDFLAGS)
diff --git a/src/datastore/datastore_api.c b/src/datastore/datastore_api.c
index 968e09b20..3b9e22a3a 100644
--- a/src/datastore/datastore_api.c
+++ b/src/datastore/datastore_api.c
@@ -113,6 +113,32 @@ struct GNUNET_DATASTORE_Handle *GNUNET_DATASTORE_connect (struct
113 113
114 114
115/** 115/**
116 * Transmit DROP message to Database service.
117 */
118static size_t
119transmit_drop (void *cls,
120 size_t size, void *buf)
121{
122 struct GNUNET_DATASTORE_Handle *h = cls;
123 struct GNUNET_MessageHeader *hdr;
124
125 if (buf == NULL)
126 {
127 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
128 _("Failed to transmit request to drop database.\n"));
129 GNUNET_DATASTORE_disconnect (h, GNUNET_NO);
130 return 0;
131 }
132 GNUNET_assert (size >= sizeof(struct GNUNET_MessageHeader));
133 hdr = buf;
134 hdr->size = htons(sizeof(struct GNUNET_MessageHeader));
135 hdr->type = htons(GNUNET_MESSAGE_TYPE_DATASTORE_DROP));
136 GNUNET_DATASTORE_disconnect (h, GNUNET_NO);
137 return sizeof(struct GNUNET_MessageHeader);
138}
139
140
141/**
116 * Disconnect from the datastore service (and free 142 * Disconnect from the datastore service (and free
117 * associated resources). 143 * associated resources).
118 * 144 *
@@ -124,7 +150,14 @@ void GNUNET_DATASTORE_disconnect (struct GNUNET_DATASTORE_Handle *h,
124{ 150{
125 if (GNUNET_YES == drop) 151 if (GNUNET_YES == drop)
126 { 152 {
127 /* FIXME: send 'drop' request */ 153 if (NULL !=
154 GNUNET_CLIENT_notify_transmit_ready (h->client,
155 sizeof(struct GNUNET_MessageHeader),
156 GNUNET_TIME_UNIT_MINUTES,
157 &transmit_drop,
158 h))
159 return;
160 GNUNET_break (0);
128 } 161 }
129 GNUNET_CLIENT_disconnect (h->client); 162 GNUNET_CLIENT_disconnect (h->client);
130 GNUNET_free (h); 163 GNUNET_free (h);
@@ -132,6 +165,45 @@ void GNUNET_DATASTORE_disconnect (struct GNUNET_DATASTORE_Handle *h,
132 165
133 166
134/** 167/**
168 * The closure is followed by the data message.
169 */
170struct PutClosure
171{
172 struct GNUNET_DATASTORE_Handle *h;
173 GNUNET_DATASTORE_ContinuationWithStatus cont;
174 void *cont_cls;
175};
176
177
178/**
179 * Transmit PUT message to Database service.
180 */
181static size_t
182transmit_put (void *cls,
183 size_t size, void *buf)
184{
185 struct PutClosure *pc = cls;
186 struct DataMessage *dm;
187 uint16_t msize;
188
189 if (buf == NULL)
190 {
191 pc->cont (pc->cont_cls, GNUNET_SYSERR,
192 gettext_noop ("Error transmitting `PUT' message to datastore service.\n"));
193 GNUNET_free (pc);
194 return 0;
195 }
196 dm = (struct DataMessage*) &pc[1];
197 msize = ntohs(dm->size);
198 GNUNET_assert (msize <= size);
199 memcpy (buf, dm, msize);
200 /* FIXME: wait for response from datastore, then
201 call our continuation! */
202 return msize;
203}
204
205
206/**
135 * Store an item in the datastore. If the item is already present, 207 * Store an item in the datastore. If the item is already present,
136 * the priorities are summed up and the higher expiration time and 208 * the priorities are summed up and the higher expiration time and
137 * lower anonymity level is used. 209 * lower anonymity level is used.
@@ -144,6 +216,7 @@ void GNUNET_DATASTORE_disconnect (struct GNUNET_DATASTORE_Handle *h,
144 * @param priority priority of the content 216 * @param priority priority of the content
145 * @param anonymity anonymity-level for the content 217 * @param anonymity anonymity-level for the content
146 * @param expiration expiration time for the content 218 * @param expiration expiration time for the content
219 * @param timeout timeout for the operation
147 * @param cont continuation to call when done 220 * @param cont continuation to call when done
148 * @param cont_cls closure for cont 221 * @param cont_cls closure for cont
149 */ 222 */
@@ -157,10 +230,41 @@ GNUNET_DATASTORE_put (struct GNUNET_DATASTORE_Handle *h,
157 uint32_t priority, 230 uint32_t priority,
158 uint32_t anonymity, 231 uint32_t anonymity,
159 struct GNUNET_TIME_Absolute expiration, 232 struct GNUNET_TIME_Absolute expiration,
233 struct GNUNET_TIME_Relative timeout,
160 GNUNET_DATASTORE_ContinuationWithStatus cont, 234 GNUNET_DATASTORE_ContinuationWithStatus cont,
161 void *cont_cls) 235 void *cont_cls)
162{ 236{
163 cont (cont_cls, GNUNET_SYSERR, "not implemented"); 237 struct PutClosure *pc;
238 struct DataMessage *dm;
239
240 pc = GNUNET_malloc (sizeof(struct PutClosure) +
241 sizeof(struct DataMessage) +
242 size);
243 dm = (struct DataMessage*) &pc[1];
244 pc->h = h;
245 pc->cont = cont;
246 pc->cont_cls = cont_cls;
247 dm->header.type = htons(GNUNET_MESSAGE_TYPE_DATASTORE_PUT);
248 dm->header.size = htons(sizeof(struct DataMessage) + size);
249 dm->rid = htonl(rid);
250 dm->size = htonl(size);
251 dm->type = htonl(type);
252 dm->priority = htonl(priority);
253 dm->anonymity = htonl(anonymity);
254 dm->uid = GNUNET_htonll(0);
255 dm->expiration = GNUNET_htonll(expiration);
256 dm->key = *key;
257 memcpy (&dm[1], data, size);
258 if (NULL == GNUNET_CLIENT_notify_transmit_ready (h->client,
259 sizeof(struct DataMessage) + size,
260 timeout,
261 &transmit_put,
262 pc))
263 {
264 GNUNET_break (0);
265 cont (cont_cls, GNUNET_SYSERR,
266 gettext_noop ("Not ready to transmit request to datastore service"));
267 }
164} 268}
165 269
166 270
diff --git a/src/datastore/perf_datastore_api.c b/src/datastore/perf_datastore_api.c
index 95ee18dad..f10f6d0f5 100644
--- a/src/datastore/perf_datastore_api.c
+++ b/src/datastore/perf_datastore_api.c
@@ -104,6 +104,9 @@ static unsigned long long stored_ops;
104 104
105static struct GNUNET_TIME_Absolute start_time; 105static struct GNUNET_TIME_Absolute start_time;
106 106
107static int ok;
108
109
107static int 110static int
108putValue (int i, int k) 111putValue (int i, int k)
109{ 112{
@@ -206,7 +209,6 @@ run (void *cls,
206static int 209static int
207check () 210check ()
208{ 211{
209 int ok = 1 + 2 + 4 + 8;
210 pid_t pid; 212 pid_t pid;
211 char *const argv[] = { "perf-datastore-api", 213 char *const argv[] = { "perf-datastore-api",
212 "-c", 214 "-c",
@@ -228,7 +230,7 @@ check ()
228 sleep (1); 230 sleep (1);
229 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, 231 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
230 argv, "perf-datastore-api", "nohelp", 232 argv, "perf-datastore-api", "nohelp",
231 options, &run, &ok); 233 options, &run, NULL);
232 if (0 != PLIBC_KILL (pid, SIGTERM)) 234 if (0 != PLIBC_KILL (pid, SIGTERM))
233 { 235 {
234 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); 236 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
diff --git a/src/datastore/perf_datastore_api_iterators.c b/src/datastore/perf_datastore_api_iterators.c
index 328cceb75..635fa1f28 100644
--- a/src/datastore/perf_datastore_api_iterators.c
+++ b/src/datastore/perf_datastore_api_iterators.c
@@ -52,6 +52,9 @@ static unsigned long long stored_ops;
52static struct GNUNET_CONFIGURATION_Handle *cfg; 52static struct GNUNET_CONFIGURATION_Handle *cfg;
53 53
54static struct GNUNET_SCHEDULER_Handle *sched; 54static struct GNUNET_SCHEDULER_Handle *sched;
55
56static int ok;
57
55 58
56static int 59static int
57putValue (struct GNUNET_DATASTORE_PluginFunctions * api, int i, int k) 60putValue (struct GNUNET_DATASTORE_PluginFunctions * api, int i, int k)
@@ -271,7 +274,6 @@ run (void *cls,
271static int 274static int
272check () 275check ()
273{ 276{
274 int ok = 1 + 2 + 4 + 8;
275 char *const argv[] = { "perf-datastore-api-iterators", 277 char *const argv[] = { "perf-datastore-api-iterators",
276 "-c", 278 "-c",
277 "test_datastore_api_data.conf", 279 "test_datastore_api_data.conf",
@@ -285,7 +287,7 @@ check ()
285 }; 287 };
286 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, 288 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
287 argv, "perf-datastore-api-iterators", "nohelp", 289 argv, "perf-datastore-api-iterators", "nohelp",
288 options, &run, &ok); 290 options, &run, NULL);
289 if (ok != 0) 291 if (ok != 0)
290 fprintf (stderr, "Missed some testcases: %u\n", ok); 292 fprintf (stderr, "Missed some testcases: %u\n", ok);
291 return ok; 293 return ok;
diff --git a/src/datastore/plugin_datastore_sqlite.c b/src/datastore/plugin_datastore_sqlite.c
index 5ae03b9bb..6abb08dd8 100644
--- a/src/datastore/plugin_datastore_sqlite.c
+++ b/src/datastore/plugin_datastore_sqlite.c
@@ -1,4 +1,4 @@
1/* 1 /*
2 This file is part of GNUnet 2 This file is part of GNUnet
3 (C) 2009 Christian Grothoff (and other contributing authors) 3 (C) 2009 Christian Grothoff (and other contributing authors)
4 4
@@ -63,11 +63,11 @@
63 "ORDER BY prio ASC, hash ASC LIMIT 1" 63 "ORDER BY prio ASC, hash ASC LIMIT 1"
64 64
65#define SELECT_IT_NON_ANONYMOUS_1 \ 65#define SELECT_IT_NON_ANONYMOUS_1 \
66 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (prio = ? AND hash < ? AND anonLevel = 0) "\ 66 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (prio = ? AND hash < ? AND anonLevel = 0 AND expire > %llu) "\
67 " ORDER BY hash DESC LIMIT 1" 67 " ORDER BY hash DESC LIMIT 1"
68 68
69#define SELECT_IT_NON_ANONYMOUS_2 \ 69#define SELECT_IT_NON_ANONYMOUS_2 \
70 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (prio < ? AND anonLevel = 0)"\ 70 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (prio < ? AND anonLevel = 0 AND expire > %llu)"\
71 " ORDER BY prio DESC, hash DESC LIMIT 1" 71 " ORDER BY prio DESC, hash DESC LIMIT 1"
72 72
73#define SELECT_IT_EXPIRATION_TIME_1 \ 73#define SELECT_IT_EXPIRATION_TIME_1 \
@@ -83,7 +83,7 @@
83 " ORDER BY hash DESC LIMIT 1" 83 " ORDER BY hash DESC LIMIT 1"
84 84
85#define SELECT_IT_MIGRATION_ORDER_2 \ 85#define SELECT_IT_MIGRATION_ORDER_2 \
86 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (expire < ?) "\ 86 "SELECT size,type,prio,anonLevel,expire,hash,value,_ROWID_ FROM gn080 WHERE (expire < ? AND expire > %llu) "\
87 " ORDER BY expire DESC, hash DESC LIMIT 1" 87 " ORDER BY expire DESC, hash DESC LIMIT 1"
88 88
89/** 89/**
@@ -220,7 +220,6 @@ database_setup (struct GNUNET_CONFIGURATION_Handle *cfg,
220 struct Plugin *plugin) 220 struct Plugin *plugin)
221{ 221{
222 sqlite3_stmt *stmt; 222 sqlite3_stmt *stmt;
223 char *dir;
224 char *afsdir; 223 char *afsdir;
225#if ENULL_DEFINED 224#if ENULL_DEFINED
226 char *e; 225 char *e;
@@ -228,33 +227,31 @@ database_setup (struct GNUNET_CONFIGURATION_Handle *cfg,
228 227
229 if (GNUNET_OK != 228 if (GNUNET_OK !=
230 GNUNET_CONFIGURATION_get_value_filename (cfg, 229 GNUNET_CONFIGURATION_get_value_filename (cfg,
231 "FS", 230 "datastore-sqlite",
232 "DIR", 231 "FILENAME",
233 &afsdir)) 232 &afsdir))
234 { 233 {
235 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, 234 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
236 "sqlite", 235 "sqlite",
237 _("Option `%s' in section `%s' missing in configuration!\n"), 236 _("Option `%s' in section `%s' missing in configuration!\n"),
238 "DIR", 237 "FILENAME",
239 "FS"); 238 "datastore-sqlite");
240 return GNUNET_SYSERR; 239 return GNUNET_SYSERR;
241 } 240 }
242 GNUNET_asprintf (&dir, "%s/content/gnunet.dat", afsdir); 241 if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (afsdir))
243 GNUNET_free (afsdir);
244 if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (dir))
245 { 242 {
246 GNUNET_break (0); 243 GNUNET_break (0);
247 GNUNET_free (dir); 244 GNUNET_free (afsdir);
248 return GNUNET_SYSERR; 245 return GNUNET_SYSERR;
249 } 246 }
250 plugin->fn = GNUNET_STRINGS_to_utf8 (dir, strlen (dir), 247 plugin->fn = GNUNET_STRINGS_to_utf8 (afsdir, strlen (afsdir),
251#ifdef ENABLE_NLS 248#ifdef ENABLE_NLS
252 nl_langinfo (CODESET) 249 nl_langinfo (CODESET)
253#else 250#else
254 "UTF-8" /* good luck */ 251 "UTF-8" /* good luck */
255#endif 252#endif
256 ); 253 );
257 GNUNET_free (dir); 254 GNUNET_free (afsdir);
258 255
259 /* Open database and precompile statements */ 256 /* Open database and precompile statements */
260 if (sqlite3_open (plugin->fn, &plugin->dbh) != SQLITE_OK) 257 if (sqlite3_open (plugin->fn, &plugin->dbh) != SQLITE_OK)
@@ -794,7 +791,7 @@ iter_next_prepare (void *cls,
794{ 791{
795 struct IterContext *ic = cls; 792 struct IterContext *ic = cls;
796 struct Plugin *plugin = nc->plugin; 793 struct Plugin *plugin = nc->plugin;
797 struct GNUNET_TIME_Absolute now; 794 int ret;
798 795
799 if (nc == NULL) 796 if (nc == NULL)
800 { 797 {
@@ -802,7 +799,6 @@ iter_next_prepare (void *cls,
802 sqlite3_finalize (ic->stmt_2); 799 sqlite3_finalize (ic->stmt_2);
803 return GNUNET_SYSERR; 800 return GNUNET_SYSERR;
804 } 801 }
805 now = GNUNET_TIME_absolute_get ();
806 if (ic->is_prio) 802 if (ic->is_prio)
807 { 803 {
808 sqlite3_bind_int (ic->stmt_1, 1, nc->lastPriority); 804 sqlite3_bind_int (ic->stmt_1, 1, nc->lastPriority);
@@ -817,13 +813,7 @@ iter_next_prepare (void *cls,
817 &ic->key, 813 &ic->key,
818 sizeof (GNUNET_HashCode), 814 sizeof (GNUNET_HashCode),
819 SQLITE_TRANSIENT); 815 SQLITE_TRANSIENT);
820 datum_1 = NULL; 816 if (SQLITE_ROW == (ret = sqlite3_step (ic->stmt_1)))
821 datum_2 = last_datum_2;
822 last_datum_2 = NULL;
823
824 if ( (SQLITE_ROW == (ret = sqlite3_step (stmt_1))) &&
825 ( (GNUNET_NO == ic->is_migr) ||
826 (sqlite3_column_int64 (stmt_1, 4) >= now.value) ) )
827 { 817 {
828 nc->stmt = ic->stmt_1; 818 nc->stmt = ic->stmt_1;
829 return GNUNET_OK; 819 return GNUNET_OK;
@@ -836,117 +826,30 @@ iter_next_prepare (void *cls,
836 "sqlite3_step"); 826 "sqlite3_step");
837 return GNUNET_SYSERR; 827 return GNUNET_SYSERR;
838 } 828 }
839 if (SQLITE_OK != sqlite3_reset (stmt_1)) 829 if (SQLITE_OK != sqlite3_reset (ic->stmt_1))
840 LOG_SQLITE (handle, NULL, 830 LOG_SQLITE (plugin, NULL,
841 GNUNET_ERROR_TYPE_ERROR | 831 GNUNET_ERROR_TYPE_ERROR |
842 GNUNET_ERROR_TYPE_BULK, 832 GNUNET_ERROR_TYPE_BULK,
843 "sqlite3_reset"); 833 "sqlite3_reset");
844 834 if (SQLITE_ROW == (ret = sqlite3_step (ic->stmt_2)))
845 if (datum_2 == NULL)
846 {
847 if ( (SQLITE_ROW == (ret = sqlite3_step (ic->stmt_2))) &&
848 ( (GNUNET_NO == ic->is_migr) ||
849 sqlite3_column_int64 (stmt_2, 4) >= now.value) )
850 {
851 nc->stmt = ic->stmt_2;
852 return GNUNET_OK;
853 }
854 if (ret != SQLITE_DONE)
855 {
856 LOG_SQLITE (plugin, NULL,
857 GNUNET_ERROR_TYPE_ERROR |
858 GNUNET_ERROR_TYPE_BULK,
859 "sqlite3_step");
860 return GNUNET_SYSERR;
861 }
862 if (SQLITE_OK != sqlite3_reset (stmt_2))
863 LOG_SQLITE (plugin, NULL,
864 GNUNET_ERROR_TYPE_ERROR |
865 GNUNET_ERROR_TYPE_BULK,
866 "sqlite3_reset");
867 }
868 datum = NULL;
869 if (datum_1 == NULL)
870 {
871 datum = datum_2;
872 rowid = rowid_2;
873 key = key_2;
874 }
875 else if (datum_2 == NULL)
876 { 835 {
877 datum = datum_1; 836 nc->stmt = ic->stmt_2;
878 rowid = rowid_1; 837 return GNUNET_OK;
879 key = key_1;
880 }
881 else
882 {
883 /* have to pick between 1 and 2 */
884 if (is_prio)
885 {
886 if ((ntohl (datum_1->priority) < ntohl (datum_2->priority)) ==
887 is_asc)
888 {
889 datum = datum_1;
890 rowid = rowid_1;
891 key = key_1;
892 last_datum_2 = datum_2;
893 }
894 else
895 {
896 datum = datum_2;
897 rowid = rowid_2;
898 key = key_2;
899 GNUNET_free (datum_1);
900 }
901 }
902 else
903 {
904 if ((GNUNET_ntohll (datum_1->expiration_time) <
905 GNUNET_ntohll (datum_2->expiration_time)) == is_asc)
906 {
907 datum = datum_1;
908 rowid = rowid_1;
909 key = key_1;
910 last_datum_2 = datum_2;
911 }
912 else
913 {
914 datum = datum_2;
915 rowid = rowid_2;
916 key = key_2;
917 GNUNET_free (datum_1);
918 }
919 }
920 } 838 }
921 if (datum == NULL) 839 if (ret != SQLITE_DONE)
922 break;
923#if 0
924 printf ("FOUND %4u prio %4u exp %20llu old: %4u, %20llu\n",
925 (ntohl (datum->size) - sizeof (GNUNET_DatastoreValue)),
926 ntohl (datum->priority),
927 GNUNET_ntohll (datum->expiration_time), lastPrio, lastExp);
928#endif
929 if (((GNUNET_NO == limit_nonanonymous) ||
930 (ntohl (datum->anonymity_level) == 0)) &&
931 ((type == GNUNET_ECRS_BLOCKTYPE_ANY) ||
932 (type == ntohl (datum->type))))
933 { 840 {
934 count++; 841 LOG_SQLITE (plugin, NULL,
935 if (iter != NULL) 842 GNUNET_ERROR_TYPE_ERROR |
936 { 843 GNUNET_ERROR_TYPE_BULK,
937 ret = iter (&key, datum, closure, rowid); 844 "sqlite3_step");
938 if (ret == GNUNET_SYSERR) 845 return GNUNET_SYSERR;
939 {
940 GNUNET_free (datum);
941 break;
942 }
943 if (ret == GNUNET_NO)
944 {
945 payload -= getContentDatastoreSize (datum);
946 delete_by_rowid (handle, rowid);
947 }
948 }
949 } 846 }
847 if (SQLITE_OK != sqlite3_reset (ic->stmt_2))
848 LOG_SQLITE (plugin, NULL,
849 GNUNET_ERROR_TYPE_ERROR |
850 GNUNET_ERROR_TYPE_BULK,
851 "sqlite3_reset");
852 return GNUNET_NO;
950} 853}
951 854
952 855
@@ -1070,8 +973,13 @@ sqlite_plugin_iter_zero_anonymity (void *cls,
1070 PluginIterator iter, 973 PluginIterator iter,
1071 void *iter_cls) 974 void *iter_cls)
1072{ 975{
1073 static struct GNUNET_TIME_Absolute zero; 976 basic_iter (cls,
1074 iter (iter_cls, NULL, NULL, 0, NULL, 0, 0, 0, zero, 0); 977 type,
978 GNUNET_NO, GNUNET_YES,
979 GNUNET_NO, GNUNET_YES,
980 SELECT_IT_NON_ANONYMOUS_1,
981 SELECT_IT_NON_ANONYMOUS_2,
982 iter, iter_cls);
1075} 983}
1076 984
1077 985
@@ -1092,10 +1000,24 @@ sqlite_plugin_iter_ascending_expiration (void *cls,
1092 PluginIterator iter, 1000 PluginIterator iter,
1093 void *iter_cls) 1001 void *iter_cls)
1094{ 1002{
1095 static struct GNUNET_TIME_Absolute zero; 1003 struct GNUNET_TIME_Absolute now;
1096 iter (iter_cls, NULL, NULL, 0, NULL, 0, 0, 0, zero, 0); 1004 char *q1;
1097} 1005 char *q2;
1098 1006
1007 now = GNUNET_TIME_absolute_get ();
1008 GNUNET_asprintf (&q1, SELECT_IT_EXPIRATION_TIME_1,
1009 now.value);
1010 GNUNET_asprintf (&q2, SELECT_IT_EXPIRATION_TIME_2,
1011 now.value);
1012 basic_iter (cls,
1013 type,
1014 GNUNET_YES, GNUNET_NO,
1015 GNUNET_NO, GNUNET_NO,
1016 q1, q2,
1017 iter, iter_cls);
1018 GNUNET_free (q1);
1019 GNUNET_free (q2);
1020}
1099 1021
1100 1022
1101/** 1023/**
@@ -1114,8 +1036,20 @@ sqlite_plugin_iter_migration_order (void *cls,
1114 PluginIterator iter, 1036 PluginIterator iter,
1115 void *iter_cls) 1037 void *iter_cls)
1116{ 1038{
1117 static struct GNUNET_TIME_Absolute zero; 1039 struct GNUNET_TIME_Absolute now;
1118 iter (iter_cls, NULL, NULL, 0, NULL, 0, 0, 0, zero, 0); 1040 char *q;
1041
1042 now = GNUNET_TIME_absolute_get ();
1043 GNUNET_asprintf (&q, SELECT_IT_MIGRATION_ORDER_2,
1044 now.value);
1045 basic_iter (cls,
1046 type,
1047 GNUNET_NO, GNUNET_NO,
1048 GNUNET_YES, GNUNET_NO,
1049 SELECT_IT_MIGRATION_ORDER_1,
1050 q,
1051 iter, iter_cls);
1052 GNUNET_free (q);
1119} 1053}
1120 1054
1121 1055
diff --git a/src/datastore/test_datastore_api.c b/src/datastore/test_datastore_api.c
index 0b08cfe8f..b4da05fda 100644
--- a/src/datastore/test_datastore_api.c
+++ b/src/datastore/test_datastore_api.c
@@ -37,6 +37,8 @@ static struct GNUNET_DATASTORE_Handle *datastore;
37 37
38static struct GNUNET_TIME_Absolute now; 38static struct GNUNET_TIME_Absolute now;
39 39
40static int ok;
41
40 42
41static size_t 43static size_t
42get_size (int i) 44get_size (int i)
@@ -84,13 +86,47 @@ get_expiration (int i)
84 return av; 86 return av;
85} 87}
86 88
89enum RunPhase
90 {
91 RP_DONE = 0,
92 RP_PUT,
93 RP_GET,
94 RP_DEL,
95 RP_DELVALIDATE
96 };
97
98
99struct CpsRunContext
100{
101 GNUNET_HashCode key;
102 int i;
103 int *iptr;
104 struct GNUNET_SCHEDULER_Handle *sched;
105 struct GNUNET_CONFIGURATION_Handle *cfg;
106 enum RunPhase phase;
107};
108
109
110static void
111run_continuation (void *cls,
112 const struct GNUNET_SCHEDULER_TaskContext *tc);
113
87 114
88static void 115static void
89check_success (void *cls, 116check_success (void *cls,
90 int success, 117 int success,
91 const char *msg) 118 const char *msg)
92{ 119{
120 struct CpsRunContext *crc = cls;
121 if (GNUNET_OK != success)
122 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
123 "%s\n", msg);
93 GNUNET_assert (GNUNET_OK == success); 124 GNUNET_assert (GNUNET_OK == success);
125 GNUNET_SCHEDULER_add_continuation (crc->sched,
126 GNUNET_NO,
127 &run_continuation,
128 crc,
129 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
94} 130}
95 131
96 132
@@ -99,8 +135,14 @@ check_failure (void *cls,
99 int success, 135 int success,
100 const char *msg) 136 const char *msg)
101{ 137{
138 struct CpsRunContext *crc = cls;
102 GNUNET_assert (GNUNET_OK != success); 139 GNUNET_assert (GNUNET_OK != success);
103 GNUNET_assert (NULL != msg); 140 GNUNET_assert (NULL != msg);
141 GNUNET_SCHEDULER_add_continuation (crc->sched,
142 GNUNET_NO,
143 &run_continuation,
144 crc,
145 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
104} 146}
105 147
106 148
@@ -115,18 +157,23 @@ check_value (void *cls,
115 struct GNUNET_TIME_Absolute 157 struct GNUNET_TIME_Absolute
116 expiration, uint64_t uid) 158 expiration, uint64_t uid)
117{ 159{
118 int *iptr = cls; 160 struct CpsRunContext *crc = cls;
119 int i; 161 int i;
120 162
121 if (key == NULL) 163 if (key == NULL)
122 return; 164 return;
123 i = *iptr; 165 i = crc->i;
124 GNUNET_assert (size == get_size (i)); 166 GNUNET_assert (size == get_size (i));
125 GNUNET_assert (0 == memcmp (data, get_data(i), size)); 167 GNUNET_assert (0 == memcmp (data, get_data(i), size));
126 GNUNET_assert (type == get_type (i)); 168 GNUNET_assert (type == get_type (i));
127 GNUNET_assert (priority == get_priority (i)); 169 GNUNET_assert (priority == get_priority (i));
128 GNUNET_assert (anonymity == get_anonymity(i)); 170 GNUNET_assert (anonymity == get_anonymity(i));
129 GNUNET_assert (expiration.value == get_expiration(i).value); 171 GNUNET_assert (expiration.value == get_expiration(i).value);
172 GNUNET_SCHEDULER_add_continuation (crc->sched,
173 GNUNET_NO,
174 &run_continuation,
175 crc,
176 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
130} 177}
131 178
132 179
@@ -141,6 +188,7 @@ delete_value (void *cls,
141 struct GNUNET_TIME_Absolute 188 struct GNUNET_TIME_Absolute
142 expiration, uint64_t uid) 189 expiration, uint64_t uid)
143{ 190{
191 struct CpsRunContext *crc = cls;
144 if (key == NULL) 192 if (key == NULL)
145 return; 193 return;
146 GNUNET_DATASTORE_remove (datastore, 194 GNUNET_DATASTORE_remove (datastore,
@@ -156,6 +204,11 @@ delete_value (void *cls,
156 data, 204 data,
157 &check_failure, 205 &check_failure,
158 NULL); 206 NULL);
207 GNUNET_SCHEDULER_add_continuation (crc->sched,
208 GNUNET_NO,
209 &run_continuation,
210 crc,
211 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
159} 212}
160 213
161 214
@@ -171,78 +224,112 @@ check_nothing (void *cls,
171 struct GNUNET_TIME_Absolute 224 struct GNUNET_TIME_Absolute
172 expiration, uint64_t uid) 225 expiration, uint64_t uid)
173{ 226{
227 struct CpsRunContext *crc = cls;
174 GNUNET_assert (key == NULL); 228 GNUNET_assert (key == NULL);
229 GNUNET_SCHEDULER_add_continuation (crc->sched,
230 GNUNET_NO,
231 &run_continuation,
232 crc,
233 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
175} 234}
176 235
177 236
178
179static void 237static void
180run (void *cls, 238run_continuation (void *cls,
181 struct GNUNET_SCHEDULER_Handle *sched, 239 const struct GNUNET_SCHEDULER_TaskContext *tc)
182 char *const *args,
183 const char *cfgfile, struct GNUNET_CONFIGURATION_Handle *cfg)
184{ 240{
185 GNUNET_HashCode key; 241 struct CpsRunContext *crc = cls;
186 int i; 242 ok = (int) crc->phase;
187 int *iptr; 243 switch (crc->phase)
188
189 datastore = GNUNET_DATASTORE_connect (cfg, sched);
190 now.value = 1000000;
191 for (i = 0; i < 256; i++)
192 { 244 {
193 memset (&key, 256 - i, sizeof (GNUNET_HashCode)); 245 case RP_PUT:
246 memset (&crc->key, 256 - crc->i, sizeof (GNUNET_HashCode));
194 GNUNET_DATASTORE_put (datastore, 247 GNUNET_DATASTORE_put (datastore,
195 0, 248 0,
196 &key, 249 &crc->key,
197 get_size (i), 250 get_size (crc->i),
198 get_data (i), 251 get_data (crc->i),
199 get_type (i), 252 get_type (crc->i),
200 get_priority (i), 253 get_priority (crc->i),
201 get_anonymity (i), 254 get_anonymity (crc->i),
202 get_expiration (i), 255 get_expiration (crc->i),
203 &check_success, 256 &check_success,
204 NULL); 257 crc);
205 } 258 crc->i++;
206 for (i = 255; i >= 0; i--) 259 if (crc->i == 256)
207 { 260 crc->phase = RP_GET;
208 memset (&key, 256 - i, sizeof (GNUNET_HashCode)); 261 break;
209 iptr = GNUNET_malloc(sizeof(int)); 262 case RP_GET:
210 *iptr = i; 263 crc->i--;
264 memset (&crc->key, 256 - crc->i, sizeof (GNUNET_HashCode));
211 GNUNET_DATASTORE_get (datastore, 265 GNUNET_DATASTORE_get (datastore,
212 &key, 266 &crc->key,
213 get_type (i), 267 get_type (crc->i),
214 &check_value, 268 &check_value,
215 iptr); 269 crc);
216 } 270 if (crc->i == 0)
217 for (i = 255; i >= 0; i--) 271 {
218 { 272 crc->phase = RP_DEL;
219 memset (&key, 256 - i, sizeof (GNUNET_HashCode)); 273 crc->i = 256;
220 iptr = GNUNET_malloc(sizeof(int)); 274 }
221 *iptr = i; 275 break;
276 case RP_DEL:
277 crc->i--;
278 memset (&crc->key, 256 - crc->i, sizeof (GNUNET_HashCode));
222 GNUNET_DATASTORE_get (datastore, 279 GNUNET_DATASTORE_get (datastore,
223 &key, 280 &crc->key,
224 get_type (i), 281 get_type (crc->i),
225 &delete_value, 282 &delete_value,
226 iptr); 283 crc);
227 } 284 if (crc->i == 0)
228 for (i = 255; i >= 0; i--) 285 {
229 { 286 crc->phase = RP_DELVALIDATE;
230 memset (&key, 256 - i, sizeof (GNUNET_HashCode)); 287 crc->i = 256;
231 iptr = GNUNET_malloc(sizeof(int)); 288 }
232 *iptr = i; 289 break;
290 case RP_DELVALIDATE:
291 crc->i--;
292 memset (&crc->key, 256 - crc->i, sizeof (GNUNET_HashCode));
233 GNUNET_DATASTORE_get (datastore, 293 GNUNET_DATASTORE_get (datastore,
234 &key, 294 &crc->key,
235 get_type (i), 295 get_type (crc->i),
236 &check_nothing, 296 &check_nothing,
237 iptr); 297 crc);
238 } 298 if (crc->i == 0)
299 {
300 crc->phase = RP_DONE;
301 }
302 break;
239 /* check reservations */ 303 /* check reservations */
240
241 /* check update */ 304 /* check update */
242
243 /* test multiple results */ 305 /* test multiple results */
306 case RP_DONE:
307 GNUNET_DATASTORE_disconnect (datastore, GNUNET_YES);
308 ok = 0;
309 }
310}
311
312
313static void
314run (void *cls,
315 struct GNUNET_SCHEDULER_Handle *sched,
316 char *const *args,
317 const char *cfgfile, struct GNUNET_CONFIGURATION_Handle *cfg)
318{
319 struct CpsRunContext *crc;
320
321 crc = GNUNET_malloc(sizeof(struct CpsRunContext));
322 crc->sched = sched;
323 crc->cfg = cfg;
324 crc->phase = RP_PUT;
325 now.value = 1000000;
326 datastore = GNUNET_DATASTORE_connect (cfg, sched);
327 GNUNET_SCHEDULER_add_continuation (crc->sched,
328 GNUNET_NO,
329 &run_continuation,
330 crc,
331 GNUNET_SCHEDULER_REASON_PREREQ_DONE);
244 332
245 GNUNET_DATASTORE_disconnect (datastore, GNUNET_YES);
246} 333}
247 334
248 335
@@ -250,7 +337,6 @@ run (void *cls,
250static int 337static int
251check () 338check ()
252{ 339{
253 int ok = 1 + 2 + 4 + 8;
254 pid_t pid; 340 pid_t pid;
255 char *const argv[] = { "test-datastore-api", 341 char *const argv[] = { "test-datastore-api",
256 "-c", 342 "-c",
@@ -272,7 +358,7 @@ check ()
272 sleep (1); 358 sleep (1);
273 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, 359 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
274 argv, "test-datastore-api", "nohelp", 360 argv, "test-datastore-api", "nohelp",
275 options, &run, &ok); 361 options, &run, NULL);
276 if (0 != PLIBC_KILL (pid, SIGTERM)) 362 if (0 != PLIBC_KILL (pid, SIGTERM))
277 { 363 {
278 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); 364 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
diff --git a/src/include/gnunet_datastore_service.h b/src/include/gnunet_datastore_service.h
index 10b2157d3..2dcc153e6 100644
--- a/src/include/gnunet_datastore_service.h
+++ b/src/include/gnunet_datastore_service.h
@@ -122,6 +122,7 @@ GNUNET_DATASTORE_reserve (struct GNUNET_DATASTORE_Handle *h,
122 * @param priority priority of the content 122 * @param priority priority of the content
123 * @param anonymity anonymity-level for the content 123 * @param anonymity anonymity-level for the content
124 * @param expiration expiration time for the content 124 * @param expiration expiration time for the content
125 * @param timeout timeout for the operation
125 * @param cont continuation to call when done 126 * @param cont continuation to call when done
126 * @param cont_cls closure for cont 127 * @param cont_cls closure for cont
127 */ 128 */
@@ -135,6 +136,7 @@ GNUNET_DATASTORE_put (struct GNUNET_DATASTORE_Handle *h,
135 uint32_t priority, 136 uint32_t priority,
136 uint32_t anonymity, 137 uint32_t anonymity,
137 struct GNUNET_TIME_Absolute expiration, 138 struct GNUNET_TIME_Absolute expiration,
139 struct GNUNET_TIME_Relative timeout,
138 GNUNET_DATASTORE_ContinuationWithStatus cont, 140 GNUNET_DATASTORE_ContinuationWithStatus cont,
139 void *cont_cls); 141 void *cont_cls);
140 142
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c
index 792f777ed..629e355ad 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -1683,7 +1683,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
1683 unsigned long long aport; 1683 unsigned long long aport;
1684 unsigned long long bport; 1684 unsigned long long bport;
1685 1685
1686 service = GNUNET_SERVICE_start ("tcp", env->sched, env->cfg); 1686 service = GNUNET_SERVICE_start ("transport-tcp", env->sched, env->cfg);
1687 if (service == NULL) 1687 if (service == NULL)
1688 { 1688 {
1689 GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, 1689 GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
@@ -1696,13 +1696,13 @@ libgnunet_plugin_transport_tcp_init (void *cls)
1696 aport = 0; 1696 aport = 0;
1697 if ((GNUNET_OK != 1697 if ((GNUNET_OK !=
1698 GNUNET_CONFIGURATION_get_value_number (env->cfg, 1698 GNUNET_CONFIGURATION_get_value_number (env->cfg,
1699 "tcp", 1699 "transport-tcp",
1700 "PORT", 1700 "PORT",
1701 &bport)) || 1701 &bport)) ||
1702 (bport > 65535) || 1702 (bport > 65535) ||
1703 ((GNUNET_OK == 1703 ((GNUNET_OK ==
1704 GNUNET_CONFIGURATION_get_value_number (env->cfg, 1704 GNUNET_CONFIGURATION_get_value_number (env->cfg,
1705 "tcp", 1705 "transport-tcp",
1706 "ADVERTISED-PORT", 1706 "ADVERTISED-PORT",
1707 &aport)) && (aport > 65535))) 1707 &aport)) && (aport > 65535)))
1708 { 1708 {
@@ -1710,7 +1710,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
1710 "tcp", 1710 "tcp",
1711 _ 1711 _
1712 ("Require valid port number for service `%s' in configuration!\n"), 1712 ("Require valid port number for service `%s' in configuration!\n"),
1713 "tcp"); 1713 "transport-tcp");
1714 GNUNET_SERVICE_stop (service); 1714 GNUNET_SERVICE_stop (service);
1715 return NULL; 1715 return NULL;
1716 } 1716 }
diff --git a/src/transport/test_transport_api_data.conf b/src/transport/test_transport_api_data.conf
index 0fa611350..518f0d09d 100644
--- a/src/transport/test_transport_api_data.conf
+++ b/src/transport/test_transport_api_data.conf
@@ -14,7 +14,7 @@ PORT = 2366
14[statistics] 14[statistics]
15PORT = 2367 15PORT = 2367
16 16
17[tcp] 17[transport-tcp]
18PORT = 2368 18PORT = 2368
19 19
20[peerinfo] 20[peerinfo]
diff --git a/src/transport/test_transport_api_peer1.conf b/src/transport/test_transport_api_peer1.conf
index dcc0ab4cf..46d7ceec9 100644
--- a/src/transport/test_transport_api_peer1.conf
+++ b/src/transport/test_transport_api_peer1.conf
@@ -15,7 +15,7 @@ PORT = 12366
15[statistics] 15[statistics]
16PORT = 12367 16PORT = 12367
17 17
18[tcp] 18[transport-tcp]
19PORT = 12368 19PORT = 12368
20 20
21[peerinfo] 21[peerinfo]
diff --git a/src/transport/test_transport_api_peer2.conf b/src/transport/test_transport_api_peer2.conf
index 8567c6ac8..f980fbe1b 100644
--- a/src/transport/test_transport_api_peer2.conf
+++ b/src/transport/test_transport_api_peer2.conf
@@ -15,7 +15,7 @@ PORT = 22366
15[statistics] 15[statistics]
16PORT = 22367 16PORT = 22367
17 17
18[tcp] 18[transport-tcp]
19PORT = 22368 19PORT = 22368
20 20
21[peerinfo] 21[peerinfo]
diff --git a/src/util/disk.c b/src/util/disk.c
index df6e5df8a..a7e4a0865 100644
--- a/src/util/disk.c
+++ b/src/util/disk.c
@@ -981,16 +981,19 @@ GNUNET_DISK_file_open (const char *fn, int flags, ...)
981 char *expfn; 981 char *expfn;
982 struct GNUNET_IO_Handle *ret; 982 struct GNUNET_IO_Handle *ret;
983#ifdef MINGW 983#ifdef MINGW
984 DWORD access, disp; 984 DWORD access;
985 DWORD disp;
985 HANDLE h; 986 HANDLE h;
986#else 987#else
987 int oflags, mode; 988 int oflags;
989 int mode;
988 int fd; 990 int fd;
989#endif 991#endif
990 992
991 expfn = GNUNET_STRINGS_filename_expand (fn); 993 expfn = GNUNET_STRINGS_filename_expand (fn);
992 994
993#ifndef MINGW 995#ifndef MINGW
996 mode = 0;
994 oflags = 0; 997 oflags = 0;
995 if (GNUNET_DISK_OPEN_READWRITE == (flags & GNUNET_DISK_OPEN_READWRITE)) 998 if (GNUNET_DISK_OPEN_READWRITE == (flags & GNUNET_DISK_OPEN_READWRITE))
996 oflags = O_RDWR; /* note: O_RDWR is NOT always O_RDONLY | O_WRONLY */ 999 oflags = O_RDWR; /* note: O_RDWR is NOT always O_RDONLY | O_WRONLY */
@@ -1020,7 +1023,6 @@ GNUNET_DISK_file_open (const char *fn, int flags, ...)
1020 perm = va_arg (arg, int); 1023 perm = va_arg (arg, int);
1021 va_end (arg); 1024 va_end (arg);
1022 1025
1023 mode = 0;
1024 if (perm & GNUNET_DISK_PERM_USER_READ) 1026 if (perm & GNUNET_DISK_PERM_USER_READ)
1025 mode |= S_IRUSR; 1027 mode |= S_IRUSR;
1026 if (perm & GNUNET_DISK_PERM_USER_WRITE) 1028 if (perm & GNUNET_DISK_PERM_USER_WRITE)