[ovs-dev] [worker v2 14/14] system-stats: Run as part of worker process.

Ethan Jackson ethan at nicira.com
Wed Jul 11 22:34:56 UTC 2012


> +    /* We can end up in these states is */

This sentence doesn't make a lot of sense to me.

Otherwise looks good, thanks.

Ethan


> +    S_REQUEST_SENT,             /* Sent a request to worker. */
> +    S_REPLY_RECEIVED            /* Received a reply from worker. */
> +} state;
> +
> +/* In S_WAITING state: the next time to wake up.
> + * In other states: not meaningful. */
> +static long long int next_refresh;
> +
> +/* In S_REPLY_RECEIVED: the stats that have just been received.
> + * In other states: not meaningful. */
> +static struct smap *received_stats;
> +
> +static worker_request_func system_stats_request_cb;
> +static worker_reply_func system_stats_reply_cb;
> +
> +/* Enables or disables system stats collection, according to 'new_enable'.
> + *
> + * Even if system stats are disabled, the caller should still periodically call
> + * system_stats_run(). */
> +void
> +system_stats_enable(bool new_enable)
> +{
> +    if (new_enable != enabled) {
> +        if (new_enable) {
> +            if (state == S_DISABLED) {
> +                state = S_WAITING;
> +                next_refresh = time_msec();
> +            }
> +        } else {
> +            if (state == S_WAITING) {
> +                state = S_DISABLED;
> +            }
> +        }
> +        enabled = new_enable;
> +    }
> +}
> +
> +/* Tries to obtain a new snapshot of system stats every SYSTEM_STATS_INTERVAL
> + * milliseconds.
> + *
> + * When a new snapshot is available (which only occurs if system stats are
> + * enabled), returns it as an smap owned by the caller.  The caller must use
> + * both smap_destroy() and free() to complete free the returned data.
> + *
> + * When no new snapshot is available, returns NULL. */
> +struct smap *
> +system_stats_run(void)
> +{
> +    switch (state) {
> +    case S_DISABLED:
> +        break;
> +
> +    case S_WAITING:
> +        if (time_msec() >= next_refresh) {
> +            worker_request(NULL, 0, NULL, 0, system_stats_request_cb,
> +                           system_stats_reply_cb, NULL);
> +            state = S_REQUEST_SENT;
> +        }
> +        break;
> +
> +    case S_REQUEST_SENT:
> +        break;
> +
> +    case S_REPLY_RECEIVED:
> +        if (enabled) {
> +            state = S_WAITING;
> +            next_refresh = time_msec() + SYSTEM_STATS_INTERVAL;
> +            return received_stats;
> +        } else {
> +            smap_destroy(received_stats);
> +            free(received_stats);
> +            state = S_DISABLED;
> +        }
> +        break;
> +    }
> +
> +    return NULL;
> +}
> +
> +/* Causes poll_block() to wake up when system_stats_run() needs to be
> + * called. */
>  void
> -get_system_stats(struct smap *stats)
> +system_stats_wait(void)
> +{
> +    switch (state) {
> +    case S_DISABLED:
> +        break;
> +
> +    case S_WAITING:
> +        poll_timer_wait_until(next_refresh);
> +        break;
> +
> +    case S_REQUEST_SENT:
> +        /* Someone else should be calling worker_wait() to wake up when the
> +         * reply arrives, otherwise there's a bug. */
> +        break;
> +
> +    case S_REPLY_RECEIVED:
> +        poll_immediate_wake();
> +        break;
> +    }
> +}
> +
> +static void
> +system_stats_request_cb(struct ofpbuf *request OVS_UNUSED,
> +                        const int fds[] OVS_UNUSED, size_t n_fds OVS_UNUSED)
>  {
> -    get_cpu_cores(stats);
> -    get_load_average(stats);
> -    get_memory_stats(stats);
> -    get_process_stats(stats);
> -    get_filesys_stats(stats);
> +    struct smap stats;
> +    struct json *json;
> +    char *s;
> +
> +    smap_init(&stats);
> +    get_cpu_cores(&stats);
> +    get_load_average(&stats);
> +    get_memory_stats(&stats);
> +    get_process_stats(&stats);
> +    get_filesys_stats(&stats);
> +
> +    json = smap_to_json(&stats);
> +    s = json_to_string(json, 0);
> +    worker_reply(s, strlen(s) + 1, NULL, 0);
> +
> +    free(s);
> +    json_destroy(json);
> +    smap_destroy(&stats);
> +}
> +
> +static void
> +system_stats_reply_cb(struct ofpbuf *reply,
> +                      const int fds[] OVS_UNUSED, size_t n_fds OVS_UNUSED,
> +                      void *aux OVS_UNUSED)
> +{
> +    struct json *json = json_from_string(reply->data);
> +
> +    received_stats = xmalloc(sizeof *received_stats);
> +    smap_init(received_stats);
> +    smap_from_json(received_stats, json);
> +
> +    assert(state == S_REQUEST_SENT);
> +    state = S_REPLY_RECEIVED;
> +
> +    json_destroy(json);
>  }
> diff --git a/vswitchd/system-stats.h b/vswitchd/system-stats.h
> index 9f965c6..83b4bcb 100644
> --- a/vswitchd/system-stats.h
> +++ b/vswitchd/system-stats.h
> @@ -16,8 +16,10 @@
>  #ifndef VSWITCHD_SYSTEM_STATS
>  #define VSWITCHD_SYSTEM_STATS 1
>
> -struct smap;
> +#include <stdbool.h>
>
> -void get_system_stats(struct smap *);
> +void system_stats_enable(bool enable);
> +struct smap *system_stats_run(void);
> +void system_stats_wait(void);
>
>  #endif /* vswitchd/system-stats.h */
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list