X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ffs%2Ffs_api.c;h=f539c7910f1f5f7c220ef82fd0e223c766b132bc;hb=ed51bc86aad5044b88ce4fc3641cc920c8186863;hp=7b800c1f104697f5dd391081b2ed907027c2260b;hpb=227051c5e556655c4daf1be900fa3307ab6efe88;p=oweals%2Fgnunet.git diff --git a/src/fs/fs_api.c b/src/fs/fs_api.c index 7b800c1f1..f539c7910 100644 --- a/src/fs/fs_api.c +++ b/src/fs/fs_api.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2001--2012 Christian Grothoff (and other contributing authors) + Copyright (C) 2001--2012 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -65,9 +65,13 @@ start_job (struct GNUNET_FS_QueueEntry *qe) "Starting job %p (%u active)\n", qe, qe->h->active_downloads); - GNUNET_CONTAINER_DLL_remove (qe->h->pending_head, qe->h->pending_tail, qe); - GNUNET_CONTAINER_DLL_insert_after (qe->h->running_head, qe->h->running_tail, - qe->h->running_tail, qe); + GNUNET_CONTAINER_DLL_remove (qe->h->pending_head, + qe->h->pending_tail, + qe); + GNUNET_CONTAINER_DLL_insert_after (qe->h->running_head, + qe->h->running_tail, + qe->h->running_tail, + qe); } @@ -127,7 +131,7 @@ process_job_queue (void *cls, int num_downloads_change; int block_limit_hit; - h->queue_job = GNUNET_SCHEDULER_NO_TASK; + h->queue_job = NULL; /* restart_at will be set to the time when it makes sense to re-evaluate the job queue (unless, of course, jobs complete or are added, then we'll be triggered immediately */ @@ -198,6 +202,8 @@ process_job_queue (void *cls, break; } } + GNUNET_break (h->active_downloads == + num_downloads_active + num_probes_active); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "PA: %u, PE: %u, PW: %u; DA: %u, DE: %u, DW: %u\n", num_probes_active, @@ -206,26 +212,36 @@ process_job_queue (void *cls, num_downloads_active, num_downloads_expired, num_downloads_waiting); + GNUNET_break (h->active_downloads + num_probes_active <= + h->max_parallel_downloads); /* calculate start/stop decisions */ - if (h->active_downloads + num_downloads_waiting > h->max_parallel_requests) + if (h->active_downloads + num_downloads_waiting > h->max_parallel_downloads) { - /* stop probes if possible */ - num_probes_change = - num_probes_active; - num_downloads_change = h->max_parallel_requests - h->active_downloads; + /* stop as many probes as there are downloads and probes */ + num_probes_change = - GNUNET_MIN (num_probes_active, + num_downloads_waiting); + /* start as many downloads as there are free slots, including those + we just opened up */ + num_downloads_change = h->max_parallel_downloads - h->active_downloads - num_probes_change; } else { - /* start all downloads */ + /* start all downloads (we can) */ num_downloads_change = num_downloads_waiting; - /* start as many probes as we can */ - num_probes_change = GNUNET_MIN (num_probes_waiting, - h->max_parallel_requests - (h->active_downloads + num_downloads_waiting)); - } - + /* also start probes if there is room, but use a lower cap of (mpd/4) + 1 */ + if (1 + h->max_parallel_downloads / 4 >= (h->active_downloads + num_downloads_change)) + num_probes_change = GNUNET_MIN (num_probes_waiting, + (1 + h->max_parallel_downloads / 4) - (h->active_downloads + num_downloads_change)); + else + num_probes_change = 0; + } + GNUNET_break (num_downloads_change <= num_downloads_waiting); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Changing %d probes and %d downloads\n", + "Changing %d probes and %d/%u/%u downloads\n", num_probes_change, - num_downloads_change); + num_downloads_change, + (unsigned int) h->active_downloads, + (unsigned int) h->max_parallel_downloads); /* actually stop probes */ next = h->running_head; while (NULL != (qe = next)) @@ -279,7 +295,8 @@ process_job_queue (void *cls, break; } } - GNUNET_break ( (0 == num_downloads_change) || (GNUNET_YES == block_limit_hit) ); + GNUNET_break ( (0 == num_downloads_change) || + (GNUNET_YES == block_limit_hit) ); GNUNET_break (0 == num_probes_change); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -326,7 +343,7 @@ GNUNET_FS_queue_ (struct GNUNET_FS_Handle *h, qe->priority = priority; GNUNET_CONTAINER_DLL_insert_after (h->pending_head, h->pending_tail, h->pending_tail, qe); - if (h->queue_job != GNUNET_SCHEDULER_NO_TASK) + if (h->queue_job != NULL) GNUNET_SCHEDULER_cancel (h->queue_job); h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -354,7 +371,7 @@ GNUNET_FS_dequeue_ (struct GNUNET_FS_QueueEntry *qe) stop_job (qe); GNUNET_CONTAINER_DLL_remove (h->pending_head, h->pending_tail, qe); GNUNET_free (qe); - if (h->queue_job != GNUNET_SCHEDULER_NO_TASK) + if (h->queue_job != NULL) GNUNET_SCHEDULER_cancel (h->queue_job); h->queue_job = GNUNET_SCHEDULER_add_now (&process_job_queue, h); } @@ -873,6 +890,7 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h, char b; char *ksks; char *chks; + char *skss; char *filename; uint32_t dsize; @@ -885,6 +903,7 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h, ret->h = h; ksks = NULL; chks = NULL; + skss = NULL; filename = NULL; if ((GNUNET_OK != GNUNET_BIO_read_meta_data (rh, "metadata", &ret->meta)) || (GNUNET_OK != GNUNET_BIO_read_string (rh, "ksk-uri", &ksks, 32 * 1024)) || @@ -895,6 +914,10 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h, ( (NULL != chks) && ( (NULL == (ret->chk_uri = GNUNET_FS_uri_parse (chks, NULL))) || (GNUNET_YES != GNUNET_FS_uri_test_chk (ret->chk_uri))) ) || + (GNUNET_OK != GNUNET_BIO_read_string (rh, "sks-uri", &skss, 1024)) || + ( (NULL != skss) && + ( (NULL == (ret->sks_uri = GNUNET_FS_uri_parse (skss, NULL))) || + (GNUNET_YES != GNUNET_FS_uri_test_sks (ret->sks_uri))) ) || (GNUNET_OK != read_start_time (rh, &ret->start_time)) || (GNUNET_OK != GNUNET_BIO_read_string (rh, "emsg", &ret->emsg, 16 * 1024)) || (GNUNET_OK != @@ -1054,11 +1077,13 @@ deserialize_fi_node (struct GNUNET_FS_Handle *h, filename = NULL; } GNUNET_free_non_null (ksks); + GNUNET_free_non_null (skss); GNUNET_free_non_null (chks); return ret; cleanup: GNUNET_free_non_null (ksks); GNUNET_free_non_null (chks); + GNUNET_free_non_null (skss); GNUNET_free_non_null (filename); GNUNET_FS_file_information_destroy (ret, NULL, NULL); return NULL; @@ -1267,6 +1292,7 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi) char b; char *ksks; char *chks; + char *skss; if (NULL == fi->serialization) fi->serialization = @@ -1299,10 +1325,15 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi) chks = GNUNET_FS_uri_to_string (fi->chk_uri); else chks = NULL; + if (NULL != fi->sks_uri) + skss = GNUNET_FS_uri_to_string (fi->sks_uri); + else + skss = NULL; if ((GNUNET_OK != GNUNET_BIO_write (wh, &b, sizeof (b))) || (GNUNET_OK != GNUNET_BIO_write_meta_data (wh, fi->meta)) || (GNUNET_OK != GNUNET_BIO_write_string (wh, ksks)) || (GNUNET_OK != GNUNET_BIO_write_string (wh, chks)) || + (GNUNET_OK != GNUNET_BIO_write_string (wh, skss)) || (GNUNET_OK != write_start_time (wh, fi->start_time)) || (GNUNET_OK != GNUNET_BIO_write_string (wh, fi->emsg)) || (GNUNET_OK != GNUNET_BIO_write_string (wh, fi->filename)) || @@ -1319,6 +1350,8 @@ GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *fi) chks = NULL; GNUNET_free_non_null (ksks); ksks = NULL; + GNUNET_free_non_null (skss); + skss = NULL; switch (b) { @@ -1410,6 +1443,7 @@ cleanup: (void) GNUNET_BIO_write_close (wh); GNUNET_free_non_null (chks); GNUNET_free_non_null (ksks); + GNUNET_free_non_null (skss); fn = get_serialization_file_name (fi->h, GNUNET_FS_SYNC_PATH_FILE_INFO, fi->serialization); if (NULL != fn) @@ -1592,7 +1626,7 @@ deserialize_publish_file (void *cls, /* re-start publishing (if needed)... */ if (GNUNET_YES != pc->all_done) { - GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == pc->upload_task); + GNUNET_assert (NULL == pc->upload_task); pc->upload_task = GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_BACKGROUND, @@ -2113,7 +2147,7 @@ GNUNET_FS_search_sync_ (struct GNUNET_FS_SearchContext *sc) GNUNET_assert ((GNUNET_YES == GNUNET_FS_uri_test_ksk (sc->uri)) || (GNUNET_YES == GNUNET_FS_uri_test_sks (sc->uri))); uris = GNUNET_FS_uri_to_string (sc->uri); - in_pause = (sc->task != GNUNET_SCHEDULER_NO_TASK) ? 'r' : '\0'; + in_pause = (sc->task != NULL) ? 'r' : '\0'; if ((GNUNET_OK != GNUNET_BIO_write_string (wh, uris)) || (GNUNET_OK != write_start_time (wh, sc->start_time)) || (GNUNET_OK != GNUNET_BIO_write_string (wh, sc->emsg)) || @@ -2865,8 +2899,9 @@ deserialize_search (struct GNUNET_FS_Handle *h, } sc->h = h; sc->serialization = GNUNET_strdup (serialization); - if ((GNUNET_OK != GNUNET_BIO_read_string (rh, "search-uri", &uris, 10 * 1024)) - || (NULL == (sc->uri = GNUNET_FS_uri_parse (uris, &emsg))) || + if ((GNUNET_OK != + GNUNET_BIO_read_string (rh, "search-uri", &uris, 10 * 1024)) || + (NULL == (sc->uri = GNUNET_FS_uri_parse (uris, &emsg))) || ((GNUNET_YES != GNUNET_FS_uri_test_ksk (sc->uri)) && (GNUNET_YES != GNUNET_FS_uri_test_sks (sc->uri))) || (GNUNET_OK != read_start_time (rh, &sc->start_time)) || @@ -2883,8 +2918,7 @@ deserialize_search (struct GNUNET_FS_Handle *h, sc->options = (enum GNUNET_FS_SearchOptions) options; sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO); dn = get_serialization_file_name_in_dir (h, - (sc->psearch_result == - NULL) ? + (NULL == sc->psearch_result) ? GNUNET_FS_SYNC_PATH_MASTER_SEARCH : GNUNET_FS_SYNC_PATH_CHILD_SEARCH, sc->serialization, ""); @@ -3103,7 +3137,7 @@ GNUNET_FS_stop (struct GNUNET_FS_Handle *h) { while (h->top_head != NULL) h->top_head->ssf (h->top_head->ssf_cls); - if (h->queue_job != GNUNET_SCHEDULER_NO_TASK) + if (h->queue_job != NULL) GNUNET_SCHEDULER_cancel (h->queue_job); GNUNET_free (h->client_name); GNUNET_free (h);