diff options
author | Omar Tarabai <tarabai@devegypt.com> | 2014-05-02 18:18:00 +0000 |
---|---|---|
committer | Omar Tarabai <tarabai@devegypt.com> | 2014-05-02 18:18:00 +0000 |
commit | 2295fa452abce952d02074af06bc08e265e8ed7c (patch) | |
tree | 9c50b7470d49c6d1f9654695a1942f9f0049db78 /src | |
parent | 8fb2088b5105c48353a4b92fb54d6abdf75de45c (diff) | |
download | gnunet-2295fa452abce952d02074af06bc08e265e8ed7c.tar.gz gnunet-2295fa452abce952d02074af06bc08e265e8ed7c.zip |
towards sensor scheduling
Diffstat (limited to 'src')
-rw-r--r-- | src/sensor/gnunet-service-sensor.c | 133 | ||||
-rw-r--r-- | src/sensor/sensors/averagepingrtt | 2 | ||||
-rw-r--r-- | src/sensor/sensors/connectedpeers | 2 | ||||
-rw-r--r-- | src/sensor/sensors/gnunetversion | 2 |
4 files changed, 135 insertions, 4 deletions
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c index 38099b172..23601c50f 100644 --- a/src/sensor/gnunet-service-sensor.c +++ b/src/sensor/gnunet-service-sensor.c | |||
@@ -23,6 +23,7 @@ | |||
23 | * @brief sensor service implementation | 23 | * @brief sensor service implementation |
24 | * @author Omar Tarabai | 24 | * @author Omar Tarabai |
25 | */ | 25 | */ |
26 | #include <inttypes.h> | ||
26 | #include "platform.h" | 27 | #include "platform.h" |
27 | #include "gnunet_util_lib.h" | 28 | #include "gnunet_util_lib.h" |
28 | #include "sensor.h" | 29 | #include "sensor.h" |
@@ -59,6 +60,11 @@ struct SensorInfo | |||
59 | char *description; | 60 | char *description; |
60 | 61 | ||
61 | /* | 62 | /* |
63 | * Sensor currently enabled | ||
64 | */ | ||
65 | int enabled; | ||
66 | |||
67 | /* | ||
62 | * Category under which the sensor falls (e.g. tcp, datastore) | 68 | * Category under which the sensor falls (e.g. tcp, datastore) |
63 | */ | 69 | */ |
64 | char *category; | 70 | char *category; |
@@ -160,6 +166,7 @@ static void | |||
160 | shutdown_task (void *cls, | 166 | shutdown_task (void *cls, |
161 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 167 | const struct GNUNET_SCHEDULER_TaskContext *tc) |
162 | { | 168 | { |
169 | GNUNET_SCHEDULER_shutdown(); | ||
163 | } | 170 | } |
164 | 171 | ||
165 | 172 | ||
@@ -221,25 +228,30 @@ static struct SensorInfo * | |||
221 | load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectionname) | 228 | load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectionname) |
222 | { | 229 | { |
223 | struct SensorInfo *sensor; | 230 | struct SensorInfo *sensor; |
224 | char *versionstr; | 231 | char *version_str; |
232 | char *starttime_str; | ||
233 | char *endtime_str; | ||
234 | unsigned long long interval_sec; | ||
235 | struct GNUNET_TIME_Relative interval; | ||
225 | 236 | ||
226 | sensor = GNUNET_new(struct SensorInfo); | 237 | sensor = GNUNET_new(struct SensorInfo); |
227 | //name | 238 | //name |
228 | sensor->name = GNUNET_strdup(sectionname); | 239 | sensor->name = GNUNET_strdup(sectionname); |
229 | //version | 240 | //version |
230 | if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "VERSION", &versionstr) || | 241 | if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "VERSION", &version_str)) |
231 | NULL == versionstr) | ||
232 | { | 242 | { |
233 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor version\n")); | 243 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor version\n")); |
234 | GNUNET_free(sensor); | 244 | GNUNET_free(sensor); |
235 | return NULL; | 245 | return NULL; |
236 | } | 246 | } |
237 | if(GNUNET_OK != version_parse(versionstr, &(sensor->version_major), &(sensor->version_minor))) | 247 | if(GNUNET_OK != version_parse(version_str, &(sensor->version_major), &(sensor->version_minor))) |
238 | { | 248 | { |
239 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Invalid sensor version number, format should be major.minor\n")); | 249 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Invalid sensor version number, format should be major.minor\n")); |
240 | GNUNET_free(sensor); | 250 | GNUNET_free(sensor); |
251 | GNUNET_free(version_str); | ||
241 | return NULL; | 252 | return NULL; |
242 | } | 253 | } |
254 | GNUNET_free(version_str); | ||
243 | //description | 255 | //description |
244 | GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "DESCRIPTION", &sensor->description); | 256 | GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "DESCRIPTION", &sensor->description); |
245 | //category | 257 | //category |
@@ -250,6 +262,37 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio | |||
250 | GNUNET_free(sensor); | 262 | GNUNET_free(sensor); |
251 | return NULL; | 263 | return NULL; |
252 | } | 264 | } |
265 | //enabled | ||
266 | if(GNUNET_NO == GNUNET_CONFIGURATION_get_value_yesno(cfg, sectionname, "ENABLED")) | ||
267 | sensor->enabled = GNUNET_NO; | ||
268 | else | ||
269 | sensor->enabled = GNUNET_YES; | ||
270 | //start time | ||
271 | sensor->start_time = NULL; | ||
272 | if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "START_TIME", &starttime_str)) | ||
273 | { | ||
274 | GNUNET_STRINGS_fancy_time_to_absolute(starttime_str, sensor->start_time); | ||
275 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Start time loaded: `%s'. Parsed: %d\n", starttime_str, (NULL != sensor->start_time)); | ||
276 | GNUNET_free(starttime_str); | ||
277 | } | ||
278 | //end time | ||
279 | sensor->end_time = NULL; | ||
280 | if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "END_TIME", &endtime_str)) | ||
281 | { | ||
282 | GNUNET_STRINGS_fancy_time_to_absolute(endtime_str, sensor->end_time); | ||
283 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "End time loaded: `%s'. Parsed: %d\n", endtime_str, (NULL != sensor->end_time)); | ||
284 | GNUNET_free(endtime_str); | ||
285 | } | ||
286 | //interval | ||
287 | if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "INTERVAL", &interval_sec)) | ||
288 | { | ||
289 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor run interval\n")); | ||
290 | GNUNET_free(sensor); | ||
291 | return NULL; | ||
292 | } | ||
293 | interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, interval_sec); | ||
294 | sensor->interval = &interval; | ||
295 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval->rel_value_us); | ||
253 | 296 | ||
254 | return sensor; | 297 | return sensor; |
255 | } | 298 | } |
@@ -332,6 +375,7 @@ add_sensor_to_hashmap(struct SensorInfo *sensor, struct GNUNET_CONTAINER_MultiHa | |||
332 | else | 375 | else |
333 | { | 376 | { |
334 | GNUNET_CONTAINER_multihashmap_remove(map, &key, existing); //remove the old version | 377 | GNUNET_CONTAINER_multihashmap_remove(map, &key, existing); //remove the old version |
378 | GNUNET_free(existing); | ||
335 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Upgrading sensor `%s' to a newer version\n"), sensor->name); | 379 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Upgrading sensor `%s' to a newer version\n"), sensor->name); |
336 | } | 380 | } |
337 | } | 381 | } |
@@ -536,6 +580,86 @@ handle_get_all_sensors (void *cls, struct GNUNET_SERVER_Client *client, | |||
536 | } | 580 | } |
537 | 581 | ||
538 | /** | 582 | /** |
583 | * Do a series of checks to determine if sensor should execute | ||
584 | * | ||
585 | * @return #GNUNET_YES / #GNUNET_NO | ||
586 | */ | ||
587 | static int | ||
588 | should_run_sensor(struct SensorInfo *sensorinfo) | ||
589 | { | ||
590 | struct GNUNET_TIME_Absolute now; | ||
591 | |||
592 | if(GNUNET_NO == sensorinfo->enabled) | ||
593 | { | ||
594 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Sensor `%s' is disabled, will not run\n"); | ||
595 | return GNUNET_NO; | ||
596 | } | ||
597 | now = GNUNET_TIME_absolute_get(); | ||
598 | if(NULL != sensorinfo->start_time | ||
599 | && now.abs_value_us < sensorinfo->start_time->abs_value_us) | ||
600 | { | ||
601 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Start time for sensor `%s' not reached yet, will not run\n"); | ||
602 | return GNUNET_NO; | ||
603 | } | ||
604 | if(NULL != sensorinfo->end_time | ||
605 | && now.abs_value_us >= sensorinfo->end_time->abs_value_us) | ||
606 | { | ||
607 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "End time for sensor `%s' passed, will not run\n"); | ||
608 | return GNUNET_NO; | ||
609 | } | ||
610 | return GNUNET_YES; | ||
611 | } | ||
612 | |||
613 | /** | ||
614 | * Actual execution of a sensor | ||
615 | * | ||
616 | * @param cls 'struct SensorInfo' | ||
617 | * @param tc unsed | ||
618 | */ | ||
619 | void | ||
620 | run_sensor (void *cls, | ||
621 | const struct GNUNET_SCHEDULER_TaskContext * tc) | ||
622 | { | ||
623 | struct SensorInfo *sensorinfo = cls; | ||
624 | |||
625 | if(GNUNET_NO == should_run_sensor(sensorinfo)) | ||
626 | return; | ||
627 | //GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo); | ||
628 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting the execution of sensor `%s'\n", sensorinfo->name); | ||
629 | } | ||
630 | |||
631 | /** | ||
632 | * Starts the execution of a sensor | ||
633 | * | ||
634 | * @param cls unused | ||
635 | * @param key hash of sensor name, key to hashmap | ||
636 | * @param value a 'struct SensorInfo *' | ||
637 | * @return #GNUNET_YES if we should continue to | ||
638 | * iterate, | ||
639 | * #GNUNET_NO if not. | ||
640 | */ | ||
641 | int schedule_sensor(void *cls, | ||
642 | const struct GNUNET_HashCode *key, void *value) | ||
643 | { | ||
644 | struct SensorInfo *sensorinfo = value; | ||
645 | |||
646 | if(GNUNET_NO == should_run_sensor(sensorinfo)) | ||
647 | return GNUNET_YES; | ||
648 | GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo); | ||
649 | return GNUNET_YES; | ||
650 | } | ||
651 | |||
652 | /** | ||
653 | * Starts the execution of all enabled sensors | ||
654 | * | ||
655 | */ | ||
656 | static void | ||
657 | schedule_all_sensors() | ||
658 | { | ||
659 | GNUNET_CONTAINER_multihashmap_iterate(sensors, &schedule_sensor, NULL); | ||
660 | } | ||
661 | |||
662 | /** | ||
539 | * Process statistics requests. | 663 | * Process statistics requests. |
540 | * | 664 | * |
541 | * @param cls closure | 665 | * @param cls closure |
@@ -558,6 +682,7 @@ run (void *cls, | |||
558 | cfg = c; | 682 | cfg = c; |
559 | sensors = GNUNET_CONTAINER_multihashmap_create(10, GNUNET_NO); | 683 | sensors = GNUNET_CONTAINER_multihashmap_create(10, GNUNET_NO); |
560 | reload_sensors(); | 684 | reload_sensors(); |
685 | schedule_all_sensors(); | ||
561 | GNUNET_SERVER_add_handlers (server, handlers); | 686 | GNUNET_SERVER_add_handlers (server, handlers); |
562 | GNUNET_SERVER_disconnect_notify (server, | 687 | GNUNET_SERVER_disconnect_notify (server, |
563 | &handle_client_disconnect, | 688 | &handle_client_disconnect, |
diff --git a/src/sensor/sensors/averagepingrtt b/src/sensor/sensors/averagepingrtt index 83e66c6e3..b7e714912 100644 --- a/src/sensor/sensors/averagepingrtt +++ b/src/sensor/sensors/averagepingrtt | |||
@@ -3,10 +3,12 @@ | |||
3 | VERSION = 1.0 | 3 | VERSION = 1.0 |
4 | DESCRIPTION = Calculate average ping latency to gnunet.org | 4 | DESCRIPTION = Calculate average ping latency to gnunet.org |
5 | CATEGORY = Internet-Connectivity | 5 | CATEGORY = Internet-Connectivity |
6 | ENABLED = YES | ||
6 | 7 | ||
7 | # Start and end time format: %Y-%m-%d %H:%M:%S | 8 | # Start and end time format: %Y-%m-%d %H:%M:%S |
8 | #START_TIME = | 9 | #START_TIME = |
9 | #END_TIME = | 10 | #END_TIME = |
11 | #Interval in seconds | ||
10 | INTERVAL = 3600 | 12 | INTERVAL = 3600 |
11 | #LIFETIME = | 13 | #LIFETIME = |
12 | 14 | ||
diff --git a/src/sensor/sensors/connectedpeers b/src/sensor/sensors/connectedpeers index 5c3c4bb01..1b4e6a986 100644 --- a/src/sensor/sensors/connectedpeers +++ b/src/sensor/sensors/connectedpeers | |||
@@ -3,10 +3,12 @@ | |||
3 | VERSION = 1.0 | 3 | VERSION = 1.0 |
4 | DESCRIPTION = Gets the number of connected peers from core | 4 | DESCRIPTION = Gets the number of connected peers from core |
5 | CATEGORY = P2P-Connectivity | 5 | CATEGORY = P2P-Connectivity |
6 | ENABLED = NO | ||
6 | 7 | ||
7 | # Start and end time format: %Y-%m-%d %H:%M:%S | 8 | # Start and end time format: %Y-%m-%d %H:%M:%S |
8 | #START_TIME = | 9 | #START_TIME = |
9 | #END_TIME = | 10 | #END_TIME = |
11 | #Interval in seconds | ||
10 | INTERVAL = 60 | 12 | INTERVAL = 60 |
11 | #LIFETIME = | 13 | #LIFETIME = |
12 | 14 | ||
diff --git a/src/sensor/sensors/gnunetversion b/src/sensor/sensors/gnunetversion index 0a8aff48c..7aee046e3 100644 --- a/src/sensor/sensors/gnunetversion +++ b/src/sensor/sensors/gnunetversion | |||
@@ -3,10 +3,12 @@ | |||
3 | VERSION = 1.0 | 3 | VERSION = 1.0 |
4 | DESCRIPTION = Gets gnunet version number | 4 | DESCRIPTION = Gets gnunet version number |
5 | CATEGORY = P2P-Software | 5 | CATEGORY = P2P-Software |
6 | ENABLED = YES | ||
6 | 7 | ||
7 | # Start and end time format: %Y-%m-%d %H:%M:%S | 8 | # Start and end time format: %Y-%m-%d %H:%M:%S |
8 | #START_TIME = | 9 | #START_TIME = |
9 | #END_TIME = | 10 | #END_TIME = |
11 | #Interval in seconds | ||
10 | INTERVAL = 86400 | 12 | INTERVAL = 86400 |
11 | #LIFETIME = | 13 | #LIFETIME = |
12 | 14 | ||