You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by GitBox <gi...@apache.org> on 2018/05/04 19:02:26 UTC

[GitHub] andrzej-kaczmarek closed pull request #995: sys/log: Updates to handle CBOR entries via nmgr

andrzej-kaczmarek closed pull request #995: sys/log: Updates to handle CBOR entries via nmgr
URL: https://github.com/apache/mynewt-core/pull/995
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/sys/log/full/src/log_nmgr.c b/sys/log/full/src/log_nmgr.c
index e0f569227..44430e0ac 100644
--- a/sys/log/full/src/log_nmgr.c
+++ b/sys/log/full/src/log_nmgr.c
@@ -52,6 +52,11 @@ static struct mgmt_handler log_nmgr_group_handlers[] = {
     [LOGS_NMGR_OP_LOGS_LIST] = {log_nmgr_logs_list, NULL}
 };
 
+struct log_encode_data {
+    uint32_t counter;
+    CborEncoder *enc;
+};
+
 /**
  * Log encode entry
  * @param log structure, log_offset, dataptr, len
@@ -67,10 +72,13 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
     int rc;
     int rsp_len;
     CborError g_err = CborNoError;
-    CborEncoder *penc = (CborEncoder*)log_offset->lo_arg;
+    struct log_encode_data *ed = log_offset->lo_arg;
     CborEncoder rsp;
     struct CborCntWriter cnt_writer;
     CborEncoder cnt_encoder;
+#if MYNEWT_VAL(LOG_VERSION) > 2
+    int off;
+#endif
 
     rc = log_read(log, dptr, &ueh, 0, sizeof(ueh));
     if (rc != sizeof(ueh)) {
@@ -99,6 +107,35 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
         goto err;
     }
 
+#if MYNEWT_VAL(LOG_VERSION) > 2
+    switch (ueh.ue_etype) {
+    case LOG_ETYPE_STRING:
+        /* Trim string data to 128 characters to keep it consistent with v2 */
+        dlen = min(len-sizeof(ueh), 128);
+
+        rc = log_read(log, dptr, data, sizeof(ueh), dlen);
+        if (rc < 0) {
+            rc = OS_ENOENT;
+            goto err;
+        }
+        data[rc] = 0;
+        break;
+    case LOG_ETYPE_CBOR:
+        /* We can't trim CBOR stream - need to put it complete */
+        dlen = len - sizeof(ueh);
+        break;
+    case LOG_ETYPE_BINARY:
+        /* XXX just some placeholder for now, perhaps should be base64 encoded? */
+        strcpy(data, "<binary>");
+        dlen = strlen(data);
+        break;
+    default:
+        assert(0);
+        strcpy(data, "<??\?>");
+        dlen = strlen(data);
+        break;
+    }
+#else
     dlen = min(len-sizeof(ueh), 128);
 
     rc = log_read(log, dptr, data, sizeof(ueh), dlen);
@@ -107,6 +144,7 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
         goto err;
     }
     data[rc] = 0;
+#endif
 
     /*calculate whether this would fit */
     /* create a counting encoder for cbor */
@@ -114,9 +152,29 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
     cbor_encoder_init(&cnt_encoder, &cnt_writer.enc, 0);
 
     /* NOTE This code should exactly match what is below */
+    rsp_len = log_offset->lo_data_len;
     g_err |= cbor_encoder_create_map(&cnt_encoder, &rsp, CborIndefiniteLength);
+#if MYNEWT_VAL(LOG_VERSION) > 2
+    switch (ueh.ue_etype) {
+    case LOG_ETYPE_CBOR:
+        g_err |= cbor_encode_text_stringz(&rsp, "type");
+        g_err |= cbor_encode_text_stringz(&rsp, "cbor");
+        /* Just encode something short and CBOR stream will be inserted here later */
+        g_err |= cbor_encode_text_stringz(&rsp, "msg");
+        g_err |= cbor_encode_undefined(&rsp);
+        rsp_len += dlen;
+        break;
+    case LOG_ETYPE_STRING:
+    case LOG_ETYPE_BINARY:
+    default:
+        g_err |= cbor_encode_text_stringz(&rsp, "msg");
+        g_err |= cbor_encode_text_stringz(&rsp, data);
+        break;
+    }
+#else
     g_err |= cbor_encode_text_stringz(&rsp, "msg");
     g_err |= cbor_encode_text_stringz(&rsp, data);
+#endif
     g_err |= cbor_encode_text_stringz(&rsp, "ts");
     g_err |= cbor_encode_int(&rsp, ueh.ue_ts);
     g_err |= cbor_encode_text_stringz(&rsp, "level");
@@ -126,17 +184,52 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
     g_err |= cbor_encode_text_stringz(&rsp, "module");
     g_err |= cbor_encode_uint(&rsp,  ueh.ue_module);
     g_err |= cbor_encoder_close_container(&cnt_encoder, &rsp);
-    rsp_len = log_offset->lo_data_len;
     rsp_len += cbor_encode_bytes_written(&cnt_encoder);
-    if (rsp_len > 400) {
+    /*
+     * Make sure that at least single entry is returned, even in case response
+     * exceeds this magic value. This is to make sure we can read long log
+     * entries, even if they have to be read one by one.
+     */
+    if ((rsp_len > 400) && (ed->counter > 0)) {
         rc = OS_ENOMEM;
         goto err;
     }
     log_offset->lo_data_len = rsp_len;
 
-    g_err |= cbor_encoder_create_map(penc, &rsp, CborIndefiniteLength);
+    g_err |= cbor_encoder_create_map(ed->enc, &rsp, CborIndefiniteLength);
+#if MYNEWT_VAL(LOG_VERSION) > 2
+    switch (ueh.ue_etype) {
+    case LOG_ETYPE_CBOR:
+        g_err |= cbor_encode_text_stringz(&rsp, "type");
+        g_err |= cbor_encode_text_stringz(&rsp, "cbor");
+        g_err |= cbor_encode_text_stringz(&rsp, "msg");
+        /*
+         * Write CBOR data from log entry directly to CBOR encoder. This will
+         * for a valid CBOR stream assuming log entry is either a primitive
+         * or a container.
+         */
+        for (off = sizeof(ueh); (off < len) && !g_err; ) {
+            rc = log_read(log, dptr, data, off, sizeof(data));
+            if (rc < 0) {
+                g_err |= 1;
+                break;
+            }
+            g_err |= rsp.writer->write(rsp.writer, data, rc);
+
+            off += rc;
+        }
+        break;
+    case LOG_ETYPE_STRING:
+    case LOG_ETYPE_BINARY:
+    default:
+        g_err |= cbor_encode_text_stringz(&rsp, "msg");
+        g_err |= cbor_encode_text_stringz(&rsp, data);
+        break;
+    }
+#else
     g_err |= cbor_encode_text_stringz(&rsp, "msg");
     g_err |= cbor_encode_text_stringz(&rsp, data);
+#endif
     g_err |= cbor_encode_text_stringz(&rsp, "ts");
     g_err |= cbor_encode_int(&rsp, ueh.ue_ts);
     g_err |= cbor_encode_text_stringz(&rsp, "level");
@@ -145,13 +238,16 @@ log_nmgr_encode_entry(struct log *log, struct log_offset *log_offset,
     g_err |= cbor_encode_uint(&rsp,  ueh.ue_index);
     g_err |= cbor_encode_text_stringz(&rsp, "module");
     g_err |= cbor_encode_uint(&rsp,  ueh.ue_module);
-    g_err |= cbor_encoder_close_container(penc, &rsp);
+    g_err |= cbor_encoder_close_container(ed->enc, &rsp);
+
+    ed->counter++;
 
     if (g_err) {
         return MGMT_ERR_ENOMEM;
     }
     return (0);
 err:
+    ed->counter++;
     return (rc);
 }
 
@@ -171,6 +267,7 @@ log_encode_entries(struct log *log, CborEncoder *cb,
     CborError g_err = CborNoError;
     struct CborCntWriter cnt_writer;
     CborEncoder cnt_encoder;
+    struct log_encode_data ed;
 
     memset(&log_offset, 0, sizeof(log_offset));
 
@@ -192,7 +289,10 @@ log_encode_entries(struct log *log, CborEncoder *cb,
     g_err |= cbor_encode_text_stringz(cb, "entries");
     g_err |= cbor_encoder_create_array(cb, &entries, CborIndefiniteLength);
 
-    log_offset.lo_arg       = &entries;
+    ed.counter = 0;
+    ed.enc = &entries;
+
+    log_offset.lo_arg       = &ed;
     log_offset.lo_index     = index;
     log_offset.lo_ts        = ts;
     log_offset.lo_data_len  = rsp_len;


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services