diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2014-01-23 14:56:59 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2014-01-23 14:56:59 +0000 |
commit | ee1c5c74a2409a52af706e613bd86a26341abba8 (patch) | |
tree | ef18e73357f63737c7560cc3a3ca7fb211bcd468 /src/ats-tests/ats-testing-log.c | |
parent | 65b732a465152cf0769651397ff9d2c0980e1727 (diff) | |
download | gnunet-ee1c5c74a2409a52af706e613bd86a26341abba8.tar.gz gnunet-ee1c5c74a2409a52af706e613bd86a26341abba8.zip |
new logging functionality
Diffstat (limited to 'src/ats-tests/ats-testing-log.c')
-rw-r--r-- | src/ats-tests/ats-testing-log.c | 135 |
1 files changed, 72 insertions, 63 deletions
diff --git a/src/ats-tests/ats-testing-log.c b/src/ats-tests/ats-testing-log.c index 68caf15b6..2e3a89e5a 100644 --- a/src/ats-tests/ats-testing-log.c +++ b/src/ats-tests/ats-testing-log.c | |||
@@ -18,14 +18,14 @@ | |||
18 | Boston, MA 02111-1307, USA. | 18 | Boston, MA 02111-1307, USA. |
19 | */ | 19 | */ |
20 | /** | 20 | /** |
21 | * @file ats/perf_ats_logging.c | 21 | * @file ats-tests/ats-testing-log.c |
22 | * @brief ats benchmark: logging for performance tests | 22 | * @brief ats benchmark: logging for performance tests |
23 | * @author Christian Grothoff | 23 | * @author Christian Grothoff |
24 | * @author Matthias Wachs | 24 | * @author Matthias Wachs |
25 | */ | 25 | */ |
26 | #include "platform.h" | 26 | #include "platform.h" |
27 | #include "gnunet_util_lib.h" | 27 | #include "gnunet_util_lib.h" |
28 | #include "perf_ats.h" | 28 | #include "ats-testing.h" |
29 | 29 | ||
30 | #define THROUGHPUT_TEMPLATE "#!/usr/bin/gnuplot \n" \ | 30 | #define THROUGHPUT_TEMPLATE "#!/usr/bin/gnuplot \n" \ |
31 | "set datafile separator ';' \n" \ | 31 | "set datafile separator ';' \n" \ |
@@ -70,19 +70,6 @@ | |||
70 | #define LOG_ITEM_ATS_UTIL_DOWN 17 | 70 | #define LOG_ITEM_ATS_UTIL_DOWN 17 |
71 | 71 | ||
72 | /** | 72 | /** |
73 | * Logging task | ||
74 | */ | ||
75 | static GNUNET_SCHEDULER_TaskIdentifier log_task; | ||
76 | |||
77 | /** | ||
78 | * Reference to perf_ats' masters | ||
79 | */ | ||
80 | static int num_peers; | ||
81 | static int running; | ||
82 | static char *name; | ||
83 | static struct GNUNET_TIME_Relative frequency; | ||
84 | |||
85 | /** | ||
86 | * A single logging time step for a partner | 73 | * A single logging time step for a partner |
87 | */ | 74 | */ |
88 | struct PartnerLoggingTimestep | 75 | struct PartnerLoggingTimestep |
@@ -238,10 +225,28 @@ struct LoggingPeer | |||
238 | struct PeerLoggingTimestep *tail; | 225 | struct PeerLoggingTimestep *tail; |
239 | }; | 226 | }; |
240 | 227 | ||
241 | /** | 228 | struct LoggingHandle |
242 | * Log structure of length num_peers | 229 | { |
243 | */ | 230 | /** |
244 | static struct LoggingPeer *lp; | 231 | * Logging task |
232 | */ | ||
233 | GNUNET_SCHEDULER_TaskIdentifier log_task; | ||
234 | |||
235 | /** | ||
236 | * Reference to perf_ats' masters | ||
237 | */ | ||
238 | int num_peers; | ||
239 | int running; | ||
240 | char *name; | ||
241 | struct GNUNET_TIME_Relative frequency; | ||
242 | |||
243 | /** | ||
244 | * Log structure of length num_peers | ||
245 | */ | ||
246 | struct LoggingPeer *lp; | ||
247 | |||
248 | }; | ||
249 | |||
245 | 250 | ||
246 | 251 | ||
247 | static void | 252 | static void |
@@ -397,8 +402,8 @@ write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp) | |||
397 | } | 402 | } |
398 | 403 | ||
399 | 404 | ||
400 | static void | 405 | void |
401 | write_to_file () | 406 | GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, char *test) |
402 | { | 407 | { |
403 | struct GNUNET_DISK_FileHandle *f; | 408 | struct GNUNET_DISK_FileHandle *f; |
404 | 409 | ||
@@ -411,10 +416,10 @@ write_to_file () | |||
411 | int c_m; | 416 | int c_m; |
412 | int c_s; | 417 | int c_s; |
413 | 418 | ||
414 | for (c_m = 0; c_m < num_peers; c_m++) | 419 | for (c_m = 0; c_m < l->num_peers; c_m++) |
415 | { | 420 | { |
416 | GNUNET_asprintf (&filename, "%llu_master_%u_%s_%s.data", GNUNET_TIME_absolute_get().abs_value_us, | 421 | GNUNET_asprintf (&filename, "%s_%llu_master_%u_%s_%s.data", test, GNUNET_TIME_absolute_get().abs_value_us, |
417 | lp[c_m].peer->no, GNUNET_i2s(&lp[c_m].peer->id), name); | 422 | l->lp[c_m].peer->no, GNUNET_i2s(&l->lp[c_m].peer->id), l->name); |
418 | 423 | ||
419 | f = GNUNET_DISK_file_open (filename, | 424 | f = GNUNET_DISK_file_open (filename, |
420 | GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE, | 425 | GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE, |
@@ -426,16 +431,16 @@ write_to_file () | |||
426 | return; | 431 | return; |
427 | } | 432 | } |
428 | 433 | ||
429 | for (cur_lt = lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next) | 434 | for (cur_lt = l->lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next) |
430 | { | 435 | { |
431 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, | 436 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
432 | "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n", lp[c_m].peer->no, | 437 | "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n", l->lp[c_m].peer->no, |
433 | cur_lt->timestamp, GNUNET_TIME_absolute_get_difference(lp[c_m].start,cur_lt->timestamp).rel_value_us / 1000, | 438 | cur_lt->timestamp, GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,cur_lt->timestamp).rel_value_us / 1000, |
434 | cur_lt->total_messages_sent, cur_lt->total_bytes_sent, cur_lt->total_throughput_send, | 439 | cur_lt->total_messages_sent, cur_lt->total_bytes_sent, cur_lt->total_throughput_send, |
435 | cur_lt->total_messages_received, cur_lt->total_bytes_received, cur_lt->total_throughput_recv); | 440 | cur_lt->total_messages_received, cur_lt->total_bytes_received, cur_lt->total_throughput_recv); |
436 | 441 | ||
437 | slave_string = GNUNET_strdup (";"); | 442 | slave_string = GNUNET_strdup (";"); |
438 | for (c_s = 0; c_s < lp[c_m].peer->num_partners; c_s++) | 443 | for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++) |
439 | { | 444 | { |
440 | plt = &cur_lt->slaves_log[c_s]; | 445 | plt = &cur_lt->slaves_log[c_s]; |
441 | /* Log partners */ | 446 | /* Log partners */ |
@@ -465,7 +470,7 @@ write_to_file () | |||
465 | 470 | ||
466 | GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;;;;;;;;;;;%s\n", | 471 | GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;;;;;;;;;;;%s\n", |
467 | cur_lt->timestamp, | 472 | cur_lt->timestamp, |
468 | GNUNET_TIME_absolute_get_difference(lp[c_m].start,cur_lt->timestamp).rel_value_us / 1000, | 473 | GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,cur_lt->timestamp).rel_value_us / 1000, |
469 | cur_lt->total_messages_sent, cur_lt->total_bytes_sent, cur_lt->total_throughput_send, | 474 | cur_lt->total_messages_sent, cur_lt->total_bytes_sent, cur_lt->total_throughput_send, |
470 | cur_lt->total_messages_received, cur_lt->total_bytes_received, cur_lt->total_throughput_recv, | 475 | cur_lt->total_messages_received, cur_lt->total_bytes_received, cur_lt->total_throughput_recv, |
471 | slave_string); | 476 | slave_string); |
@@ -482,9 +487,9 @@ write_to_file () | |||
482 | return; | 487 | return; |
483 | } | 488 | } |
484 | 489 | ||
485 | write_throughput_gnuplot_script (filename, lp); | 490 | write_throughput_gnuplot_script (filename, l->lp); |
486 | write_rtt_gnuplot_script (filename, lp); | 491 | write_rtt_gnuplot_script (filename, l->lp); |
487 | write_bw_gnuplot_script (filename, lp); | 492 | write_bw_gnuplot_script (filename, l->lp); |
488 | 493 | ||
489 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Data file successfully written to log file `%s'\n", filename); | 494 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Data file successfully written to log file `%s'\n", filename); |
490 | GNUNET_free (filename); | 495 | GNUNET_free (filename); |
@@ -493,7 +498,7 @@ write_to_file () | |||
493 | 498 | ||
494 | 499 | ||
495 | void | 500 | void |
496 | GNUNET_ATS_TEST_logging_now (void) | 501 | GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l) |
497 | { | 502 | { |
498 | struct LoggingPeer *bp; | 503 | struct LoggingPeer *bp; |
499 | struct PeerLoggingTimestep *mlt; | 504 | struct PeerLoggingTimestep *mlt; |
@@ -507,12 +512,12 @@ GNUNET_ATS_TEST_logging_now (void) | |||
507 | unsigned int app_rtt; | 512 | unsigned int app_rtt; |
508 | double mult; | 513 | double mult; |
509 | 514 | ||
510 | if (GNUNET_YES != running) | 515 | if (GNUNET_YES != l->running) |
511 | return; | 516 | return; |
512 | 517 | ||
513 | for (c_m = 0; c_m < num_peers; c_m++) | 518 | for (c_m = 0; c_m < l->num_peers; c_m++) |
514 | { | 519 | { |
515 | bp = &lp[c_m]; | 520 | bp = &l->lp[c_m]; |
516 | mlt = GNUNET_new (struct PeerLoggingTimestep); | 521 | mlt = GNUNET_new (struct PeerLoggingTimestep); |
517 | GNUNET_CONTAINER_DLL_insert_tail(bp->head, bp->tail, mlt); | 522 | GNUNET_CONTAINER_DLL_insert_tail(bp->head, bp->tail, mlt); |
518 | prev_log_mlt = mlt->prev; | 523 | prev_log_mlt = mlt->prev; |
@@ -530,7 +535,7 @@ GNUNET_ATS_TEST_logging_now (void) | |||
530 | if (NULL == prev_log_mlt) | 535 | if (NULL == prev_log_mlt) |
531 | { | 536 | { |
532 | /* Get difference to start */ | 537 | /* Get difference to start */ |
533 | delta = GNUNET_TIME_absolute_get_difference (lp[c_m].start, mlt->timestamp); | 538 | delta = GNUNET_TIME_absolute_get_difference (l->lp[c_m].start, mlt->timestamp); |
534 | } | 539 | } |
535 | else | 540 | else |
536 | { | 541 | { |
@@ -639,75 +644,79 @@ GNUNET_ATS_TEST_logging_now (void) | |||
639 | static void | 644 | static void |
640 | collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 645 | collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
641 | { | 646 | { |
642 | log_task = GNUNET_SCHEDULER_NO_TASK; | 647 | struct LoggingHandle *l = cls; |
648 | l->log_task = GNUNET_SCHEDULER_NO_TASK; | ||
643 | 649 | ||
644 | GNUNET_ATS_TEST_logging_now(); | 650 | GNUNET_ATS_TEST_logging_now (l); |
645 | 651 | ||
646 | if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN) | 652 | if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN) |
647 | return; | 653 | return; |
648 | 654 | ||
649 | log_task = GNUNET_SCHEDULER_add_delayed (frequency, | 655 | l->log_task = GNUNET_SCHEDULER_add_delayed (l->frequency, |
650 | &collect_log_task, NULL); | 656 | &collect_log_task, l); |
651 | } | 657 | } |
652 | 658 | ||
653 | 659 | ||
654 | void | 660 | void |
655 | GNUNET_ATS_TEST_logging_stop (void) | 661 | GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *l) |
656 | { | 662 | { |
657 | int c_m; | 663 | int c_m; |
658 | struct GNUNET_SCHEDULER_TaskContext tc; | 664 | struct GNUNET_SCHEDULER_TaskContext tc; |
659 | struct PeerLoggingTimestep *cur; | 665 | struct PeerLoggingTimestep *cur; |
660 | 666 | ||
661 | if (GNUNET_YES!= running) | 667 | if (GNUNET_YES!= l->running) |
662 | return; | 668 | return; |
663 | 669 | ||
664 | if (GNUNET_SCHEDULER_NO_TASK != log_task) | 670 | if (GNUNET_SCHEDULER_NO_TASK != l->log_task) |
665 | GNUNET_SCHEDULER_cancel (log_task); | 671 | GNUNET_SCHEDULER_cancel (l->log_task); |
666 | log_task = GNUNET_SCHEDULER_NO_TASK; | 672 | l->log_task = GNUNET_SCHEDULER_NO_TASK; |
667 | tc.reason = GNUNET_SCHEDULER_REASON_SHUTDOWN; | 673 | tc.reason = GNUNET_SCHEDULER_REASON_SHUTDOWN; |
668 | collect_log_task (NULL, &tc); | 674 | collect_log_task (l, &tc); |
669 | 675 | ||
670 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, | 676 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
671 | _("Stop logging\n")); | 677 | _("Stop logging\n")); |
672 | 678 | ||
673 | write_to_file (); | ||
674 | 679 | ||
675 | for (c_m = 0; c_m < num_peers; c_m++) | 680 | for (c_m = 0; c_m < l->num_peers; c_m++) |
676 | { | 681 | { |
677 | while (NULL != (cur = lp[c_m].head)) | 682 | while (NULL != (cur = l->lp[c_m].head)) |
678 | { | 683 | { |
679 | GNUNET_CONTAINER_DLL_remove (lp[c_m].head, lp[c_m].tail, cur); | 684 | GNUNET_CONTAINER_DLL_remove (l->lp[c_m].head, l->lp[c_m].tail, cur); |
680 | GNUNET_free (cur->slaves_log); | 685 | GNUNET_free (cur->slaves_log); |
681 | GNUNET_free (cur); | 686 | GNUNET_free (cur); |
682 | } | 687 | } |
683 | } | 688 | } |
684 | 689 | ||
685 | GNUNET_free (lp); | 690 | GNUNET_free (l->lp); |
691 | GNUNET_free (l); | ||
686 | } | 692 | } |
687 | 693 | ||
688 | void | 694 | struct LoggingHandle * |
689 | GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency, | 695 | GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency, |
690 | char * testname, struct BenchmarkPeer *masters, int num_masters) | 696 | char * testname, struct BenchmarkPeer *masters, int num_masters) |
691 | { | 697 | { |
698 | struct LoggingHandle *l; | ||
692 | int c_m; | 699 | int c_m; |
693 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, | 700 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
694 | _("Start logging `%s'\n"), testname); | 701 | _("Start logging `%s'\n"), testname); |
695 | 702 | ||
696 | num_peers = num_masters; | 703 | l = GNUNET_new (struct LoggingHandle); |
697 | name = testname; | 704 | l->num_peers = num_masters; |
698 | frequency = log_frequency; | 705 | l->name = testname; |
699 | 706 | l->frequency = log_frequency; | |
700 | lp = GNUNET_malloc (num_masters * sizeof (struct LoggingPeer)); | 707 | l->lp = GNUNET_malloc (num_masters * sizeof (struct LoggingPeer)); |
701 | 708 | ||
702 | for (c_m = 0; c_m < num_masters; c_m ++) | 709 | for (c_m = 0; c_m < num_masters; c_m ++) |
703 | { | 710 | { |
704 | lp[c_m].peer = &masters[c_m]; | 711 | l->lp[c_m].peer = &masters[c_m]; |
705 | lp[c_m].start = GNUNET_TIME_absolute_get(); | 712 | l->lp[c_m].start = GNUNET_TIME_absolute_get(); |
706 | } | 713 | } |
707 | 714 | ||
708 | /* Schedule logging task */ | 715 | /* Schedule logging task */ |
709 | log_task = GNUNET_SCHEDULER_add_now (&collect_log_task, NULL); | 716 | l->log_task = GNUNET_SCHEDULER_add_now (&collect_log_task, l); |
710 | running = GNUNET_YES; | 717 | l->running = GNUNET_YES; |
718 | |||
719 | return l; | ||
711 | } | 720 | } |
712 | /* end of file perf_ats_logging.c */ | 721 | /* end of file ats-testing-log.c */ |
713 | 722 | ||