aboutsummaryrefslogtreecommitdiff
path: root/src/sensor
diff options
context:
space:
mode:
authorOmar Tarabai <tarabai@devegypt.com>2014-05-02 21:01:37 +0000
committerOmar Tarabai <tarabai@devegypt.com>2014-05-02 21:01:37 +0000
commit0e8b6f07503810a220e500fa20e05a3ce33bce7d (patch)
tree4ff767bea9113bb95e6e8ee0e0b306749124e3d3 /src/sensor
parent2295fa452abce952d02074af06bc08e265e8ed7c (diff)
downloadgnunet-0e8b6f07503810a220e500fa20e05a3ce33bce7d.tar.gz
gnunet-0e8b6f07503810a220e500fa20e05a3ce33bce7d.zip
fix in sensor scheduling
Diffstat (limited to 'src/sensor')
-rw-r--r--src/sensor/gnunet-service-sensor.c57
-rw-r--r--src/sensor/sensors/averagepingrtt2
-rw-r--r--src/sensor/sensors/connectedpeers2
3 files changed, 49 insertions, 12 deletions
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c
index 23601c50f..31dcf515d 100644
--- a/src/sensor/gnunet-service-sensor.c
+++ b/src/sensor/gnunet-service-sensor.c
@@ -82,7 +82,7 @@ struct SensorInfo
82 /* 82 /*
83 * Time interval to collect sensor information (e.g. every 1 min) 83 * Time interval to collect sensor information (e.g. every 1 min)
84 */ 84 */
85 struct GNUNET_TIME_Relative *interval; 85 struct GNUNET_TIME_Relative interval;
86 86
87 /* 87 /*
88 * Lifetime of an information sample after which it is deleted from storage 88 * Lifetime of an information sample after which it is deleted from storage
@@ -144,6 +144,11 @@ struct SensorInfo
144 */ 144 */
145 struct GNUNET_TIME_Relative *p2p_interval; 145 struct GNUNET_TIME_Relative *p2p_interval;
146 146
147 /**
148 * Execution task (OR GNUNET_SCHEDULER_NO_TASK)
149 */
150 GNUNET_SCHEDULER_TaskIdentifier execution_task;
151
147}; 152};
148 153
149/** 154/**
@@ -157,6 +162,29 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
157struct GNUNET_CONTAINER_MultiHashMap *sensors; 162struct GNUNET_CONTAINER_MultiHashMap *sensors;
158 163
159/** 164/**
165 * Remove sensor execution from scheduler
166 *
167 * @param cls unused
168 * @param key hash of sensor name, key to hashmap
169 * @param value a 'struct SensorInfo *'
170 * @return #GNUNET_YES if we should continue to
171 * iterate,
172 * #GNUNET_NO if not.
173 */
174int unschedule_sensor(void *cls,
175 const struct GNUNET_HashCode *key, void *value)
176{
177 struct SensorInfo *sensorinfo = value;
178
179 if(GNUNET_SCHEDULER_NO_TASK != sensorinfo->execution_task)
180 {
181 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unscheduling sensor `%s'\n", sensorinfo->name);
182 GNUNET_SCHEDULER_cancel(sensorinfo->execution_task);
183 }
184 return GNUNET_YES;
185}
186
187/**
160 * Task run during shutdown. 188 * Task run during shutdown.
161 * 189 *
162 * @param cls unused 190 * @param cls unused
@@ -166,6 +194,7 @@ static void
166shutdown_task (void *cls, 194shutdown_task (void *cls,
167 const struct GNUNET_SCHEDULER_TaskContext *tc) 195 const struct GNUNET_SCHEDULER_TaskContext *tc)
168{ 196{
197 GNUNET_CONTAINER_multihashmap_iterate(sensors, &unschedule_sensor, NULL);
169 GNUNET_SCHEDULER_shutdown(); 198 GNUNET_SCHEDULER_shutdown();
170} 199}
171 200
@@ -232,7 +261,6 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
232 char *starttime_str; 261 char *starttime_str;
233 char *endtime_str; 262 char *endtime_str;
234 unsigned long long interval_sec; 263 unsigned long long interval_sec;
235 struct GNUNET_TIME_Relative interval;
236 264
237 sensor = GNUNET_new(struct SensorInfo); 265 sensor = GNUNET_new(struct SensorInfo);
238 //name 266 //name
@@ -290,9 +318,10 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
290 GNUNET_free(sensor); 318 GNUNET_free(sensor);
291 return NULL; 319 return NULL;
292 } 320 }
293 interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, interval_sec); 321 sensor->interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, interval_sec);
294 sensor->interval = &interval; 322 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval.rel_value_us);
295 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval->rel_value_us); 323 //execution task
324 sensor->execution_task = GNUNET_SCHEDULER_NO_TASK;
296 325
297 return sensor; 326 return sensor;
298} 327}
@@ -591,20 +620,20 @@ should_run_sensor(struct SensorInfo *sensorinfo)
591 620
592 if(GNUNET_NO == sensorinfo->enabled) 621 if(GNUNET_NO == sensorinfo->enabled)
593 { 622 {
594 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Sensor `%s' is disabled, will not run\n"); 623 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Sensor `%s' is disabled, will not run\n", sensorinfo->name);
595 return GNUNET_NO; 624 return GNUNET_NO;
596 } 625 }
597 now = GNUNET_TIME_absolute_get(); 626 now = GNUNET_TIME_absolute_get();
598 if(NULL != sensorinfo->start_time 627 if(NULL != sensorinfo->start_time
599 && now.abs_value_us < sensorinfo->start_time->abs_value_us) 628 && now.abs_value_us < sensorinfo->start_time->abs_value_us)
600 { 629 {
601 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Start time for sensor `%s' not reached yet, will not run\n"); 630 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Start time for sensor `%s' not reached yet, will not run\n", sensorinfo->name);
602 return GNUNET_NO; 631 return GNUNET_NO;
603 } 632 }
604 if(NULL != sensorinfo->end_time 633 if(NULL != sensorinfo->end_time
605 && now.abs_value_us >= sensorinfo->end_time->abs_value_us) 634 && now.abs_value_us >= sensorinfo->end_time->abs_value_us)
606 { 635 {
607 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "End time for sensor `%s' passed, will not run\n"); 636 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "End time for sensor `%s' passed, will not run\n", sensorinfo->name);
608 return GNUNET_NO; 637 return GNUNET_NO;
609 } 638 }
610 return GNUNET_YES; 639 return GNUNET_YES;
@@ -622,9 +651,10 @@ run_sensor (void *cls,
622{ 651{
623 struct SensorInfo *sensorinfo = cls; 652 struct SensorInfo *sensorinfo = cls;
624 653
654 sensorinfo->execution_task = GNUNET_SCHEDULER_NO_TASK;
625 if(GNUNET_NO == should_run_sensor(sensorinfo)) 655 if(GNUNET_NO == should_run_sensor(sensorinfo))
626 return; 656 return;
627 //GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo); 657 sensorinfo->execution_task = 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); 658 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting the execution of sensor `%s'\n", sensorinfo->name);
629} 659}
630 660
@@ -645,7 +675,14 @@ int schedule_sensor(void *cls,
645 675
646 if(GNUNET_NO == should_run_sensor(sensorinfo)) 676 if(GNUNET_NO == should_run_sensor(sensorinfo))
647 return GNUNET_YES; 677 return GNUNET_YES;
648 GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo); 678 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Scheduling sensor `%s' to run after %" PRIu64 " microseconds\n",
679 sensorinfo->name, sensorinfo->interval.rel_value_us);
680 if(GNUNET_SCHEDULER_NO_TASK != sensorinfo->execution_task)
681 {
682 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Sensor `%s' execution task already set, this should not happen\n", sensorinfo->name);
683 return GNUNET_NO;
684 }
685 sensorinfo->execution_task = GNUNET_SCHEDULER_add_delayed(sensorinfo->interval, &run_sensor, sensorinfo);
649 return GNUNET_YES; 686 return GNUNET_YES;
650} 687}
651 688
diff --git a/src/sensor/sensors/averagepingrtt b/src/sensor/sensors/averagepingrtt
index b7e714912..2012f555e 100644
--- a/src/sensor/sensors/averagepingrtt
+++ b/src/sensor/sensors/averagepingrtt
@@ -3,7 +3,7 @@
3VERSION = 1.0 3VERSION = 1.0
4DESCRIPTION = Calculate average ping latency to gnunet.org 4DESCRIPTION = Calculate average ping latency to gnunet.org
5CATEGORY = Internet-Connectivity 5CATEGORY = Internet-Connectivity
6ENABLED = YES 6ENABLED = NO
7 7
8# Start and end time format: %Y-%m-%d %H:%M:%S 8# Start and end time format: %Y-%m-%d %H:%M:%S
9#START_TIME = 9#START_TIME =
diff --git a/src/sensor/sensors/connectedpeers b/src/sensor/sensors/connectedpeers
index 1b4e6a986..2e9bc53d7 100644
--- a/src/sensor/sensors/connectedpeers
+++ b/src/sensor/sensors/connectedpeers
@@ -3,7 +3,7 @@
3VERSION = 1.0 3VERSION = 1.0
4DESCRIPTION = Gets the number of connected peers from core 4DESCRIPTION = Gets the number of connected peers from core
5CATEGORY = P2P-Connectivity 5CATEGORY = P2P-Connectivity
6ENABLED = NO 6ENABLED = YES
7 7
8# Start and end time format: %Y-%m-%d %H:%M:%S 8# Start and end time format: %Y-%m-%d %H:%M:%S
9#START_TIME = 9#START_TIME =