diff mbox

[LEDE-DEV,ubox] Fix logger starvation and Add feature log priority filtering

Message ID CAPZm7uXwQ_38-oEZEXaQ5PkVS-Uvbuwfi8J3AAqDb-+TwG=+jA@mail.gmail.com
State Changes Requested
Headers show

Commit Message

Ron Brash July 4, 2017, 6:33 p.m. UTC
Hello all,

We had an issue with a customer's recent deployment and needed to
perform the following:
* Add a syslog filtering functionality into the logger
* Fix a condition where ubox's logd would continue running, but needed
to be restarted after it stopped responding after several hours (or
after a large number of logs were sent to it)

The inline patch is following the signature.

Ron Brash
CTO  & Co-founder of Atlants Embedded Inc.
www.atlantsembedded.com
------------------------------------------------------------------

Cell +1 438 880 6441
Email  ron.brash@gmail.com
LinkedIn ca.linkedin.com/in/ronbrash/



This communication is intended for the use of the recipient to which it is
addressed, and may contain confidential, personal, and or privileged
information. Please contact the sender immediately if you are not the
intended recipient of this communication, and do not copy, distribute, or
take action relying on it. Any communication received in error, or
subsequent reply, should be deleted or destroyed.


------------------------------------------------------------------


Fix for silent logging error:
* There was a condition on a custom at91 board where the
logreader/logd would starve

Add functionality to add priority parsing into the log daemon
* Previously had no way to do this with a customer's setup
---
 log/logd.c    | 14 +++++++++++++-
 log/logread.c | 27 +++++++++++++++++++++++----
 2 files changed, 36 insertions(+), 5 deletions(-)

  ustream_consume(s, cur_len);
@@ -240,14 +242,28 @@ static void logread_fd_data_cb(struct ustream
*s, int bytes)
  uloop_end();
 }

+static void notify_fd_remove_cb();
+
 static void logread_fd_cb(struct ubus_request *req, int fd)
 {
  static struct ustream_fd test_fd;
-
+ uloop_register_notify_fd_remove(fd, notify_fd_remove_cb);
  test_fd.stream.notify_read = logread_fd_data_cb;
  ustream_fd_init(&test_fd, fd);
 }

+struct ubus_context *context;
+uint32_t ctx_id;
+struct blob_buf * bb;
+struct ubus_request request;
+
+static void notify_fd_remove_cb() {
+ ubus_lookup_id(context, "log", &ctx_id);
+ ubus_invoke_async(context, ctx_id, "read", bb->head, &request);
+ request.fd_cb = logread_fd_cb;
+ ubus_complete_request_async(context, &request);
+}
+
 int main(int argc, char **argv)
 {
  static struct ubus_request req;
@@ -361,11 +377,14 @@ int main(int argc, char **argv)
  } else {
  sender.fd = STDOUT_FILENO;
  }
-
+
+ context = ctx;
+ bb = &b;
+
  ubus_invoke_async(ctx, id, "read", b.head, &req);
  req.fd_cb = logread_fd_cb;
  ubus_complete_request_async(ctx, &req);
-
+
  uloop_run();
  ubus_free(ctx);
  uloop_done();
--

Comments

Hans Dedecker July 5, 2017, 7:38 a.m. UTC | #1
On Tue, Jul 4, 2017 at 8:33 PM, Ron Brash <ron.brash@gmail.com> wrote:
> Hello all,
>
> We had an issue with a customer's recent deployment and needed to
> perform the following:
> * Add a syslog filtering functionality into the logger
> * Fix a condition where ubox's logd would continue running, but needed
> to be restarted after it stopped responding after several hours (or
> after a large number of logs were sent to it)
Hi,

Thank you for the patch but split the patch into two patches; one
patch adding syslog filtering functionality and the other patch fixing
the described error condition. Each patch must have a SoB which is
missing in this patch; see also
https://lede-project.org/submitting-patches for submitting patches

Hans
>
> The inline patch is following the signature.
>
> Ron Brash
> CTO  & Co-founder of Atlants Embedded Inc.
> www.atlantsembedded.com
> ------------------------------------------------------------------
>
> Cell +1 438 880 6441
> Email  ron.brash@gmail.com
> LinkedIn ca.linkedin.com/in/ronbrash/
>
>
>
> This communication is intended for the use of the recipient to which it is
> addressed, and may contain confidential, personal, and or privileged
> information. Please contact the sender immediately if you are not the
> intended recipient of this communication, and do not copy, distribute, or
> take action relying on it. Any communication received in error, or
> subsequent reply, should be deleted or destroyed.
>
>
> ------------------------------------------------------------------
>
>
> Fix for silent logging error:
> * There was a condition on a custom at91 board where the
> logreader/logd would starve
>
> Add functionality to add priority parsing into the log daemon
> * Previously had no way to do this with a customer's setup
> ---
>  log/logd.c    | 14 +++++++++++++-
>  log/logread.c | 27 +++++++++++++++++++++++----
>  2 files changed, 36 insertions(+), 5 deletions(-)
>
> diff --git a/log/logd.c b/log/logd.c
> index 07aee2b..a60cb8f 100644
> --- a/log/logd.c
> +++ b/log/logd.c
> @@ -27,6 +27,7 @@
>  #include "syslog.h"
>
>  int debug = 0;
> +int priority = 7;
>  static struct blob_buf b;
>  static struct ubus_auto_conn conn;
>  static LIST_HEAD(clients);
> @@ -182,6 +183,9 @@ ubus_notify_log(struct log_head *l)
>   if (list_empty(&clients))
>   return;
>
> + if((l->priority & 7) > priority) {
> + return; // skip if greater (logger level filtering)
> + }
>   blob_buf_init(&b, 0);
>   blobmsg_add_string(&b, "msg", l->data);
>   blobmsg_add_u32(&b, "id", l->id);
> @@ -214,13 +218,21 @@ main(int argc, char **argv)
>   int ch, log_size = 16;
>
>   signal(SIGPIPE, SIG_IGN);
> - while ((ch = getopt(argc, argv, "S:")) != -1) {
> + while ((ch = getopt(argc, argv, "P:S:")) != -1) {
>   switch (ch) {
>   case 'S':
>   log_size = atoi(optarg);
>   if (log_size < 1)
>   log_size = 16;
>   break;
> + case 'P':
> + priority = atoi(optarg);
> + if (priority < 0)
> + priority = 0;
> + else if(priority > 7) {
> + priority = 7; // bounds check
> + }
> + break;
>   }
>   }
>   log_size *= 1024;
> diff --git a/log/logread.c b/log/logread.c
> index edac1d9..2032819 100644
> --- a/log/logread.c
> +++ b/log/logread.c
> @@ -230,8 +230,10 @@ static void logread_fd_data_cb(struct ustream *s,
> int bytes)
>   break;
>
>   cur_len = blob_len(a) + sizeof(*a);
> - if (len < cur_len)
> + if (len < cur_len) {
> + ustream_consume(s, len);
>   break;
> + }
>
>   log_notify(a);
>   ustream_consume(s, cur_len);
> @@ -240,14 +242,28 @@ static void logread_fd_data_cb(struct ustream
> *s, int bytes)
>   uloop_end();
>  }
>
> +static void notify_fd_remove_cb();
> +
>  static void logread_fd_cb(struct ubus_request *req, int fd)
>  {
>   static struct ustream_fd test_fd;
> -
> + uloop_register_notify_fd_remove(fd, notify_fd_remove_cb);
>   test_fd.stream.notify_read = logread_fd_data_cb;
>   ustream_fd_init(&test_fd, fd);
>  }
>
> +struct ubus_context *context;
> +uint32_t ctx_id;
> +struct blob_buf * bb;
> +struct ubus_request request;
> +
> +static void notify_fd_remove_cb() {
> + ubus_lookup_id(context, "log", &ctx_id);
> + ubus_invoke_async(context, ctx_id, "read", bb->head, &request);
> + request.fd_cb = logread_fd_cb;
> + ubus_complete_request_async(context, &request);
> +}
> +
>  int main(int argc, char **argv)
>  {
>   static struct ubus_request req;
> @@ -361,11 +377,14 @@ int main(int argc, char **argv)
>   } else {
>   sender.fd = STDOUT_FILENO;
>   }
> -
> +
> + context = ctx;
> + bb = &b;
> +
>   ubus_invoke_async(ctx, id, "read", b.head, &req);
>   req.fd_cb = logread_fd_cb;
>   ubus_complete_request_async(ctx, &req);
> -
> +
>   uloop_run();
>   ubus_free(ctx);
>   uloop_done();
> --
>
> _______________________________________________
> Lede-dev mailing list
> Lede-dev@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev
Rafał Miłecki July 5, 2017, 11:30 a.m. UTC | #2
On 4 July 2017 at 20:33, Ron Brash <ron.brash@gmail.com> wrote:
> This communication is intended for the use of the recipient to which it is
> addressed, and may contain confidential, personal, and or privileged
> information. Please contact the sender immediately if you are not the
> intended recipient of this communication, and do not copy, distribute, or
> take action relying on it. Any communication received in error, or
> subsequent reply, should be deleted or destroyed.

Please resend with changes suggested by Hans included and without that
above scary text. You're writing to the public mailing list after all!


> @@ -27,6 +27,7 @@
>  #include "syslog.h"
>
>  int debug = 0;
> +int priority = 7;
>  static struct blob_buf b;
>  static struct ubus_auto_conn conn;
>  static LIST_HEAD(clients);

All your patch is white space mangled. You will need to use some
better e-mail client or maybe just git send-email tool.
diff mbox

Patch

diff --git a/log/logd.c b/log/logd.c
index 07aee2b..a60cb8f 100644
--- a/log/logd.c
+++ b/log/logd.c
@@ -27,6 +27,7 @@ 
 #include "syslog.h"

 int debug = 0;
+int priority = 7;
 static struct blob_buf b;
 static struct ubus_auto_conn conn;
 static LIST_HEAD(clients);
@@ -182,6 +183,9 @@  ubus_notify_log(struct log_head *l)
  if (list_empty(&clients))
  return;

+ if((l->priority & 7) > priority) {
+ return; // skip if greater (logger level filtering)
+ }
  blob_buf_init(&b, 0);
  blobmsg_add_string(&b, "msg", l->data);
  blobmsg_add_u32(&b, "id", l->id);
@@ -214,13 +218,21 @@  main(int argc, char **argv)
  int ch, log_size = 16;

  signal(SIGPIPE, SIG_IGN);
- while ((ch = getopt(argc, argv, "S:")) != -1) {
+ while ((ch = getopt(argc, argv, "P:S:")) != -1) {
  switch (ch) {
  case 'S':
  log_size = atoi(optarg);
  if (log_size < 1)
  log_size = 16;
  break;
+ case 'P':
+ priority = atoi(optarg);
+ if (priority < 0)
+ priority = 0;
+ else if(priority > 7) {
+ priority = 7; // bounds check
+ }
+ break;
  }
  }
  log_size *= 1024;
diff --git a/log/logread.c b/log/logread.c
index edac1d9..2032819 100644
--- a/log/logread.c
+++ b/log/logread.c
@@ -230,8 +230,10 @@  static void logread_fd_data_cb(struct ustream *s,
int bytes)
  break;

  cur_len = blob_len(a) + sizeof(*a);
- if (len < cur_len)
+ if (len < cur_len) {
+ ustream_consume(s, len);
  break;
+ }

  log_notify(a);