diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-12-19 17:15:51 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-12-19 17:15:51 +0000 |
commit | 1b9a6fa6063c79120be8e9cf4bd42863751f04db (patch) | |
tree | 0511a203fd1dc0ddb9536a930cb7595e27fa807f | |
parent | b10b45c398e1da19723c368d6ddd3641e2a97a79 (diff) | |
download | gnunet-1b9a6fa6063c79120be8e9cf4bd42863751f04db.tar.gz gnunet-1b9a6fa6063c79120be8e9cf4bd42863751f04db.zip |
improving results seen communication to consider which exact keywords a particular result has been seen for so far
-rw-r--r-- | src/fs/fs_api.c | 13 | ||||
-rw-r--r-- | src/fs/fs_api.h | 5 | ||||
-rw-r--r-- | src/fs/fs_search.c | 27 |
3 files changed, 34 insertions, 11 deletions
diff --git a/src/fs/fs_api.c b/src/fs/fs_api.c index f1ba4a5b1..cd854cf5e 100644 --- a/src/fs/fs_api.c +++ b/src/fs/fs_api.c | |||
@@ -1793,7 +1793,10 @@ GNUNET_FS_search_result_sync_ (struct GNUNET_FS_SearchResult *sr) | |||
1793 | || (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->mandatory_missing)) || | 1793 | || (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->mandatory_missing)) || |
1794 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->optional_support)) || | 1794 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->optional_support)) || |
1795 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->availability_success)) || | 1795 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->availability_success)) || |
1796 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->availability_trials))) | 1796 | (GNUNET_OK != GNUNET_BIO_write_int32 (wh, sr->availability_trials)) || |
1797 | (GNUNET_OK != GNUNET_BIO_write (wh, sr->keyword_bitmap, | ||
1798 | (sr->uri->data.ksk.keywordCount + 7) / 8)) ) | ||
1799 | |||
1797 | { | 1800 | { |
1798 | GNUNET_break (0); | 1801 | GNUNET_break (0); |
1799 | goto cleanup; | 1802 | goto cleanup; |
@@ -2095,6 +2098,14 @@ deserialize_search_result (void *cls, const char *filename) | |||
2095 | GNUNET_break (0); | 2098 | GNUNET_break (0); |
2096 | goto cleanup; | 2099 | goto cleanup; |
2097 | } | 2100 | } |
2101 | sr->keyword_bitmap = GNUNET_malloc ((sr->uri->data.ksk.keywordCount + 7) / 8); /* round up, count bits */ | ||
2102 | if (GNUNET_OK != GNUNET_BIO_read (rh, "keyword-bitmap", | ||
2103 | sr->keyword_bitmap, | ||
2104 | (sr->uri->data.ksk.keywordCount + 7) / 8)) | ||
2105 | { | ||
2106 | GNUNET_break (0); | ||
2107 | goto cleanup; | ||
2108 | } | ||
2098 | GNUNET_free (uris); | 2109 | GNUNET_free (uris); |
2099 | if (download != NULL) | 2110 | if (download != NULL) |
2100 | { | 2111 | { |
diff --git a/src/fs/fs_api.h b/src/fs/fs_api.h index f358047aa..66ccda1f2 100644 --- a/src/fs/fs_api.h +++ b/src/fs/fs_api.h | |||
@@ -538,6 +538,11 @@ struct GNUNET_FS_SearchResult | |||
538 | char *serialization; | 538 | char *serialization; |
539 | 539 | ||
540 | /** | 540 | /** |
541 | * Bitmap that specifies precisely which keywords have been matched already. | ||
542 | */ | ||
543 | uint8_t *keyword_bitmap; | ||
544 | |||
545 | /** | ||
541 | * Key for the search result | 546 | * Key for the search result |
542 | */ | 547 | */ |
543 | GNUNET_HashCode key; | 548 | GNUNET_HashCode key; |
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index d016d320e..5c19835f5 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c | |||
@@ -387,6 +387,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc, | |||
387 | struct GNUNET_FS_SearchResult *sr; | 387 | struct GNUNET_FS_SearchResult *sr; |
388 | struct GetResultContext grc; | 388 | struct GetResultContext grc; |
389 | int is_new; | 389 | int is_new; |
390 | unsigned int koff; | ||
390 | 391 | ||
391 | /* check if new */ | 392 | /* check if new */ |
392 | GNUNET_assert (NULL != sc); | 393 | GNUNET_assert (NULL != sc); |
@@ -411,6 +412,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc, | |||
411 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); | 412 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); |
412 | sr->mandatory_missing = sc->mandatory_count; | 413 | sr->mandatory_missing = sc->mandatory_count; |
413 | sr->key = key; | 414 | sr->key = key; |
415 | sr->keyword_bitmap = GNUNET_malloc ((sc->uri->data.ksk.keywordCount + 7) / 8); /* round up, count bits */ | ||
414 | GNUNET_CONTAINER_multihashmap_put (sc->master_result_map, &key, sr, | 416 | GNUNET_CONTAINER_multihashmap_put (sc->master_result_map, &key, sr, |
415 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | 417 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); |
416 | } | 418 | } |
@@ -418,6 +420,9 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc, | |||
418 | { | 420 | { |
419 | GNUNET_CONTAINER_meta_data_merge (sr->meta, meta); | 421 | GNUNET_CONTAINER_meta_data_merge (sr->meta, meta); |
420 | } | 422 | } |
423 | koff = ent - sc->requests; | ||
424 | GNUNET_assert ( (koff >= 0) && (koff < sc->uri->data.ksk.keywordCount)); | ||
425 | sr->keyword_bitmap[koff / 8] |= (1 << (koff % 8)); | ||
421 | /* check if mandatory satisfied */ | 426 | /* check if mandatory satisfied */ |
422 | if (ent->mandatory) | 427 | if (ent->mandatory) |
423 | sr->mandatory_missing--; | 428 | sr->mandatory_missing--; |
@@ -888,9 +893,9 @@ struct MessageBuilderContext | |||
888 | struct GNUNET_FS_SearchContext *sc; | 893 | struct GNUNET_FS_SearchContext *sc; |
889 | 894 | ||
890 | /** | 895 | /** |
891 | * URI the search result must match, NULL for any | 896 | * Keyword offset the search result must match (0 for SKS) |
892 | */ | 897 | */ |
893 | struct GNUNET_FS_Uri *uri; | 898 | unsigned int keyword_offset; |
894 | }; | 899 | }; |
895 | 900 | ||
896 | 901 | ||
@@ -909,9 +914,9 @@ build_result_set (void *cls, const GNUNET_HashCode * key, void *value) | |||
909 | struct MessageBuilderContext *mbc = cls; | 914 | struct MessageBuilderContext *mbc = cls; |
910 | struct GNUNET_FS_SearchResult *sr = value; | 915 | struct GNUNET_FS_SearchResult *sr = value; |
911 | 916 | ||
912 | if ((mbc->uri != NULL) && | 917 | if ( (sr->keyword_bitmap != NULL) && |
913 | (GNUNET_YES != GNUNET_FS_uri_test_equal (mbc->uri, sr->uri))) | 918 | (0 == (sr->keyword_bitmap[mbc->keyword_offset / 8] & (1 << (mbc->keyword_offset % 8)))) ) |
914 | return GNUNET_OK; | 919 | return GNUNET_OK; /* have no match for this keyword yet */ |
915 | if (mbc->skip_cnt > 0) | 920 | if (mbc->skip_cnt > 0) |
916 | { | 921 | { |
917 | mbc->skip_cnt--; | 922 | mbc->skip_cnt--; |
@@ -941,9 +946,9 @@ find_result_set (void *cls, const GNUNET_HashCode * key, void *value) | |||
941 | struct MessageBuilderContext *mbc = cls; | 946 | struct MessageBuilderContext *mbc = cls; |
942 | struct GNUNET_FS_SearchResult *sr = value; | 947 | struct GNUNET_FS_SearchResult *sr = value; |
943 | 948 | ||
944 | if ((mbc->uri != NULL) && | 949 | if ( (sr->keyword_bitmap != NULL) && |
945 | (GNUNET_YES != GNUNET_FS_uri_test_equal (mbc->uri, sr->uri))) | 950 | (0 == (sr->keyword_bitmap[mbc->keyword_offset / 8] & (1 << (mbc->keyword_offset % 8)))) ) |
946 | return GNUNET_OK; | 951 | return GNUNET_OK; /* have no match for this keyword yet */ |
947 | mbc->put_cnt++; | 952 | mbc->put_cnt++; |
948 | return GNUNET_OK; | 953 | return GNUNET_OK; |
949 | } | 954 | } |
@@ -988,7 +993,7 @@ transmit_search_request (void *cls, size_t size, void *buf) | |||
988 | { | 993 | { |
989 | msize = sizeof (struct SearchMessage); | 994 | msize = sizeof (struct SearchMessage); |
990 | GNUNET_assert (size >= msize); | 995 | GNUNET_assert (size >= msize); |
991 | mbc.uri = NULL; | 996 | mbc.keyword_offset = sc->keyword_offset; |
992 | mbc.put_cnt = 0; | 997 | mbc.put_cnt = 0; |
993 | GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, | 998 | GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, |
994 | &find_result_set, &mbc); | 999 | &find_result_set, &mbc); |
@@ -1038,7 +1043,7 @@ transmit_search_request (void *cls, size_t size, void *buf) | |||
1038 | mbc.put_cnt = (size - msize) / sizeof (GNUNET_HashCode); | 1043 | mbc.put_cnt = (size - msize) / sizeof (GNUNET_HashCode); |
1039 | sqms = GNUNET_CONTAINER_multihashmap_size (sc->master_result_map); | 1044 | sqms = GNUNET_CONTAINER_multihashmap_size (sc->master_result_map); |
1040 | mbc.put_cnt = GNUNET_MIN (mbc.put_cnt, sqms - mbc.skip_cnt); | 1045 | mbc.put_cnt = GNUNET_MIN (mbc.put_cnt, sqms - mbc.skip_cnt); |
1041 | mbc.uri = NULL; | 1046 | mbc.keyword_offset = 0; |
1042 | if (sc->search_request_map_offset < sqms) | 1047 | if (sc->search_request_map_offset < sqms) |
1043 | GNUNET_assert (mbc.put_cnt > 0); | 1048 | GNUNET_assert (mbc.put_cnt > 0); |
1044 | msize += sizeof (GNUNET_HashCode) * mbc.put_cnt; | 1049 | msize += sizeof (GNUNET_HashCode) * mbc.put_cnt; |
@@ -1315,6 +1320,7 @@ search_result_suspend (void *cls, const GNUNET_HashCode * key, void *value) | |||
1315 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 1320 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
1316 | if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) | 1321 | if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) |
1317 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 1322 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
1323 | GNUNET_free_non_null (sr->keyword_bitmap); | ||
1318 | GNUNET_free (sr); | 1324 | GNUNET_free (sr); |
1319 | return GNUNET_OK; | 1325 | return GNUNET_OK; |
1320 | } | 1326 | } |
@@ -1480,6 +1486,7 @@ search_result_free (void *cls, const GNUNET_HashCode * key, void *value) | |||
1480 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 1486 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
1481 | if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) | 1487 | if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) |
1482 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | 1488 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); |
1489 | GNUNET_free_non_null (sr->keyword_bitmap); | ||
1483 | GNUNET_free (sr); | 1490 | GNUNET_free (sr); |
1484 | return GNUNET_OK; | 1491 | return GNUNET_OK; |
1485 | } | 1492 | } |