aboutsummaryrefslogtreecommitdiff
path: root/src/ats-tests/ats-testing-log.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2014-01-23 14:56:59 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2014-01-23 14:56:59 +0000
commitee1c5c74a2409a52af706e613bd86a26341abba8 (patch)
treeef18e73357f63737c7560cc3a3ca7fb211bcd468 /src/ats-tests/ats-testing-log.c
parent65b732a465152cf0769651397ff9d2c0980e1727 (diff)
downloadgnunet-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.c135
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 */
75static GNUNET_SCHEDULER_TaskIdentifier log_task;
76
77/**
78 * Reference to perf_ats' masters
79 */
80static int num_peers;
81static int running;
82static char *name;
83static 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 */
88struct PartnerLoggingTimestep 75struct PartnerLoggingTimestep
@@ -238,10 +225,28 @@ struct LoggingPeer
238 struct PeerLoggingTimestep *tail; 225 struct PeerLoggingTimestep *tail;
239}; 226};
240 227
241/** 228struct LoggingHandle
242 * Log structure of length num_peers 229{
243 */ 230 /**
244static 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
247static void 252static void
@@ -397,8 +402,8 @@ write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp)
397} 402}
398 403
399 404
400static void 405void
401write_to_file () 406GNUNET_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
495void 500void
496GNUNET_ATS_TEST_logging_now (void) 501GNUNET_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)
639static void 644static void
640collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 645collect_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
654void 660void
655GNUNET_ATS_TEST_logging_stop (void) 661GNUNET_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
688void 694struct LoggingHandle *
689GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency, 695GNUNET_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