[rrd-developers] [PATCH] [BUG] better time stamp checking in handle_request_update

Tobias Oetiker tobi at oetiker.ch
Fri Nov 7 14:52:00 CET 2008


thanks
tobi

Yesterday kevin brintnall wrote:

> Much simpler handling of timestamp errors.  Return an error to the user
> when any of the time stamp values are invalid.  This is similar to
> RRDTool's normal behavior.  Removed the complex logic previously used to
> return error codes to the user.
>
> This solves a bug where non-advancing timestamps could have produced
> incorrect error output during "BATCH" mode.  The bug was cause by using
> the sock->wbuf pointer for the error output.
> ---
>  src/rrd_daemon.c |   34 +++++++++-------------------------
>  1 files changed, 9 insertions(+), 25 deletions(-)
>
> diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c
> index c6211a6..52e9f12 100644
> --- a/src/rrd_daemon.c
> +++ b/src/rrd_daemon.c
> @@ -1384,7 +1384,6 @@ static int handle_request_update (listen_socket_t *sock, /* {{{ */
>  {
>    char *file, file_tmp[PATH_MAX];
>    int values_num = 0;
> -  int bad_timestamps = 0;
>    int status;
>    char orig_buf[CMD_MAX];
>
> @@ -1488,18 +1487,17 @@ static int handle_request_update (listen_socket_t *sock, /* {{{ */
>      stamp = strtol(value, &eostamp, 10);
>      if (eostamp == value || eostamp == NULL || *eostamp != ':')
>      {
> -      ++bad_timestamps;
> -      add_response_info(sock, "Cannot find timestamp in '%s'!\n", value);
> -      continue;
> +      pthread_mutex_unlock(&cache_lock);
> +      return send_response(sock, RESP_ERR,
> +                           "Cannot find timestamp in '%s'!\n", value);
>      }
>      else if (stamp <= ci->last_update_stamp)
>      {
> -      ++bad_timestamps;
> -      add_response_info(sock,
> -                        "illegal attempt to update using time %ld when"
> -                        " last update time is %ld (minimum one second step)\n",
> -                        stamp, ci->last_update_stamp);
> -      continue;
> +      pthread_mutex_unlock(&cache_lock);
> +      return send_response(sock, RESP_ERR,
> +                           "illegal attempt to update using time %ld when last"
> +                           " update time is %ld (minimum one second step)\n",
> +                           stamp, ci->last_update_stamp);
>      }
>      else
>        ci->last_update_stamp = stamp;
> @@ -1534,21 +1532,7 @@ static int handle_request_update (listen_socket_t *sock, /* {{{ */
>    pthread_mutex_unlock (&cache_lock);
>
>    if (values_num < 1)
> -  {
> -    /* journal replay mode */
> -    if (sock == NULL) return RESP_ERR;
> -
> -    /* if we had only one update attempt, then return the full
> -       error message... try to get the most information out
> -       of the limited error space allowed by the protocol
> -    */
> -    if (bad_timestamps == 1)
> -      return send_response(sock, RESP_ERR, "%s", sock->wbuf);
> -    else
> -      return send_response(sock, RESP_ERR,
> -                           "No values updated (%d bad timestamps).\n",
> -                           bad_timestamps);
> -  }
> +    return send_response(sock, RESP_ERR, "No values updated.\n");
>    else
>      return send_response(sock, RESP_OK,
>                           "errors, enqueued %i value(s).\n", values_num);
>

-- 
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland
http://it.oetiker.ch tobi at oetiker.ch ++41 62 775 9902 / sb: -9900



More information about the rrd-developers mailing list