You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2015/08/28 06:00:01 UTC

[3/3] trafficserver git commit: TS-3815: traffic_ctl should separate config and metric records

TS-3815: traffic_ctl should separate config and metric records

Send the record class in response to management record queries.
This lets us filter the response depending on whether the caller
wanted configuration records or statistics records. We can also
format configuration records correctly depending on whether they
are local or not.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/244b78e5
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/244b78e5
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/244b78e5

Branch: refs/heads/master
Commit: 244b78e56576c86e1d511314ed7db4c27c42249a
Parents: 080bcaa
Author: James Peach <jp...@apache.org>
Authored: Fri Jul 31 15:41:12 2015 -0700
Committer: James Peach <jp...@apache.org>
Committed: Thu Aug 27 20:53:54 2015 -0700

----------------------------------------------------------------------
 cmd/traffic_ctl/config.cc             |  25 ++++-
 cmd/traffic_ctl/metric.cc             |  11 ++-
 cmd/traffic_ctl/traffic_ctl.cc        |   6 ++
 cmd/traffic_ctl/traffic_ctl.h         |   1 +
 lib/perl/lib/Apache/TS/AdminClient.pm |   3 +-
 lib/records/I_RecCore.h               |   6 +-
 lib/records/RecCore.cc                |  24 +++++
 mgmt/api/CoreAPIRemote.cc             |   4 +-
 mgmt/api/NetworkMessage.cc            |  12 ++-
 mgmt/api/TSControlMain.cc             | 143 +++++++++++++++--------------
 mgmt/api/include/mgmtapi.h            |   1 +
 11 files changed, 151 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/cmd/traffic_ctl/config.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/config.cc b/cmd/traffic_ctl/config.cc
index 9efda2a..44b6e82 100644
--- a/cmd/traffic_ctl/config.cc
+++ b/cmd/traffic_ctl/config.cc
@@ -24,6 +24,7 @@
 #include "traffic_ctl.h"
 #include <time.h>
 #include <I_RecDefs.h>
+#include <P_RecUtils.h>
 
 // Record data type names, indexed by TSRecordT.
 static const char *
@@ -145,8 +146,20 @@ format_record(const CtrlMgmtRecord &record, bool recfmt)
   CtrlMgmtRecordValue value(record);
 
   if (recfmt) {
-    // XXX Detect CONFIG or LOCAL ...
-    printf("CONFIG %s %s %s\n", record.name(), rec_typeof(record.type()), value.c_str());
+    const char *label;
+
+    switch (record.rclass()) {
+    case RECT_CONFIG:
+      label = "CONFIG ";
+      break;
+    case RECT_LOCAL:
+      label = "LOCAL ";
+      break;
+    default:
+      label = "";
+    }
+
+    printf("%s%s %s %s\n", label, record.name(), rec_typeof(record.type()), value.c_str());
   } else {
     printf("%s: %s\n", record.name(), value.c_str());
   }
@@ -174,7 +187,9 @@ config_get(unsigned argc, const char **argv)
       return CTRL_EX_ERROR;
     }
 
-    format_record(record, recfmt);
+    if (REC_TYPE_IS_CONFIG(record.rclass())) {
+      format_record(record, recfmt);
+    }
   }
 
   return CTRL_EX_OK;
@@ -285,7 +300,9 @@ config_match(unsigned argc, const char **argv)
 
     while (!reclist.empty()) {
       CtrlMgmtRecord record(reclist.next());
-      format_record(record, recfmt);
+      if (REC_TYPE_IS_CONFIG(record.rclass())) {
+        format_record(record, recfmt);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/cmd/traffic_ctl/metric.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/metric.cc b/cmd/traffic_ctl/metric.cc
index 36a8b6e..26d70d1 100644
--- a/cmd/traffic_ctl/metric.cc
+++ b/cmd/traffic_ctl/metric.cc
@@ -22,6 +22,7 @@
  */
 
 #include "traffic_ctl.h"
+#include <P_RecUtils.h>
 
 static int
 metric_get(unsigned argc, const char **argv)
@@ -40,7 +41,9 @@ metric_get(unsigned argc, const char **argv)
       return CTRL_EX_ERROR;
     }
 
-    printf("%s %s\n", record.name(), CtrlMgmtRecordValue(record).c_str());
+    if (REC_TYPE_IS_STAT(record.rclass())) {
+      printf("%s %s\n", record.name(), CtrlMgmtRecordValue(record).c_str());
+    }
   }
 
   return CTRL_EX_OK;
@@ -57,8 +60,6 @@ metric_match(unsigned argc, const char **argv)
     CtrlMgmtRecordList reclist;
     TSMgmtError error;
 
-    // XXX filter the results to only match metric records.
-
     error = reclist.match(file_arguments[i]);
     if (error != TS_ERR_OKAY) {
       CtrlMgmtError(error, "failed to fetch %s", file_arguments[i]);
@@ -67,7 +68,9 @@ metric_match(unsigned argc, const char **argv)
 
     while (!reclist.empty()) {
       CtrlMgmtRecord record(reclist.next());
-      printf("%s %s\n", record.name(), CtrlMgmtRecordValue(record).c_str());
+      if (REC_TYPE_IS_STAT(record.rclass())) {
+        printf("%s %s\n", record.name(), CtrlMgmtRecordValue(record).c_str());
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/cmd/traffic_ctl/traffic_ctl.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/traffic_ctl.cc b/cmd/traffic_ctl/traffic_ctl.cc
index aff4a42..c1e11f2 100644
--- a/cmd/traffic_ctl/traffic_ctl.cc
+++ b/cmd/traffic_ctl/traffic_ctl.cc
@@ -37,6 +37,12 @@ CtrlMgmtRecord::type() const
   return this->ele->rec_type;
 }
 
+int
+CtrlMgmtRecord::rclass() const
+{
+  return this->ele->rec_class;
+}
+
 int64_t
 CtrlMgmtRecord::as_int() const
 {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/cmd/traffic_ctl/traffic_ctl.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/traffic_ctl.h b/cmd/traffic_ctl/traffic_ctl.h
index aa1a51e..bc0847a 100644
--- a/cmd/traffic_ctl/traffic_ctl.h
+++ b/cmd/traffic_ctl/traffic_ctl.h
@@ -79,6 +79,7 @@ struct CtrlMgmtRecord {
 
   const char *name() const;
   TSRecordT type() const;
+  int rclass() const;
   int64_t as_int() const;
 
 private:

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/lib/perl/lib/Apache/TS/AdminClient.pm
----------------------------------------------------------------------
diff --git a/lib/perl/lib/Apache/TS/AdminClient.pm b/lib/perl/lib/Apache/TS/AdminClient.pm
index 9159e3e..e378303 100644
--- a/lib/perl/lib/Apache/TS/AdminClient.pm
+++ b/lib/perl/lib/Apache/TS/AdminClient.pm
@@ -214,11 +214,12 @@ sub get_stat {
     # The response format is:
     #   MGMT_MARSHALL_INT: message length
     #   MGMT_MARSHALL_INT: error code
+    #   MGMT_MARSHALL_INT: record class
     #   MGMT_MARSHALL_INT: record type
     #   MGMT_MARSHALL_STRING: record name
     #   MGMT_MARSHALL_DATA: record data
     ($msg) = unpack("l/a", $res);
-    my ($ecode, $type, $name, $value) = unpack("l l l/Z l/a", $msg);
+    my ($ecode, $rclass, $type, $name, $value) = unpack("l l l l/Z l/a", $msg);
 
     if ($ecode == TS_ERR_OKAY) {
         if ($type == TS_REC_INT || $type == TS_REC_COUNTER) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/lib/records/I_RecCore.h
----------------------------------------------------------------------
diff --git a/lib/records/I_RecCore.h b/lib/records/I_RecCore.h
index 719021f..1d8ab52 100644
--- a/lib/records/I_RecCore.h
+++ b/lib/records/I_RecCore.h
@@ -166,7 +166,10 @@ int RecGetRecordBool(const char *name, RecBool *rec_byte, bool lock = true);
 // Record Attributes Reading
 //------------------------------------------------------------------------
 
-int RecLookupRecord(const char *name, void (*callback)(const RecRecord *, void *), void *data, bool lock = true);
+typedef void (*RecLookupCallback)(const RecRecord *, void *);
+
+int RecLookupRecord(const char *name, RecLookupCallback callback, void *data, bool lock = true);
+int RecLookupMatchingRecords(const char *match, RecLookupCallback callback, void *data, bool lock = true);
 
 int RecGetRecordType(const char *name, RecT *rec_type, bool lock = true);
 int RecGetRecordDataType(const char *name, RecDataT *data_type, bool lock = true);
@@ -184,7 +187,6 @@ int RecSetRecordAccessType(const char *name, RecAccessT secure, bool lock = true
 
 int RecGetRecordPrefix_Xmalloc(char *prefix, char **result, int *result_len);
 
-
 //------------------------------------------------------------------------
 // Signal and Alarms
 //------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/lib/records/RecCore.cc
----------------------------------------------------------------------
diff --git a/lib/records/RecCore.cc b/lib/records/RecCore.cc
index 6ad0db8..041a218 100644
--- a/lib/records/RecCore.cc
+++ b/lib/records/RecCore.cc
@@ -455,6 +455,29 @@ RecLookupRecord(const char *name, void (*callback)(const RecRecord *, void *), v
 }
 
 int
+RecLookupMatchingRecords(const char *match, void (*callback)(const RecRecord *, void *), void *data, bool lock)
+{
+  int num_records;
+  DFA regex;
+
+  if (regex.compile(match, RE_CASE_INSENSITIVE | RE_UNANCHORED) != 0) {
+    return REC_ERR_FAIL;
+  }
+
+  num_records = g_num_records;
+  for (int i = 0; i < num_records; i++) {
+    RecRecord *r = &(g_records[i]);
+    if (regex.match(r->name) >= 0) {
+      rec_mutex_acquire(&(r->lock));
+      callback(r, data);
+      rec_mutex_release(&(r->lock));
+    }
+  }
+
+  return REC_ERR_OKAY;
+}
+
+int
 RecGetRecordType(const char *name, RecT *rec_type, bool lock)
 {
   int err = REC_ERR_FAIL;
@@ -928,6 +951,7 @@ debug_record_callback(RecT /* rec_type */, void * /* edata */, int registered, c
     break;
   }
 }
+
 void
 RecDumpRecords(RecT rec_type, RecDumpEntryCb callback, void *edata)
 {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/mgmt/api/CoreAPIRemote.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/CoreAPIRemote.cc b/mgmt/api/CoreAPIRemote.cc
index 2626880..4ce8cae 100644
--- a/mgmt/api/CoreAPIRemote.cc
+++ b/mgmt/api/CoreAPIRemote.cc
@@ -498,6 +498,7 @@ mgmt_record_get_reply(OpType op, TSRecordEle *rec_ele)
 
   MgmtMarshallData reply = {NULL, 0};
   MgmtMarshallInt err;
+  MgmtMarshallInt rclass;
   MgmtMarshallInt type;
   MgmtMarshallString name = NULL;
   MgmtMarshallData value = {NULL, 0};
@@ -511,7 +512,7 @@ mgmt_record_get_reply(OpType op, TSRecordEle *rec_ele)
     return ret;
   }
 
-  ret = recv_mgmt_response(reply.ptr, reply.len, op, &err, &type, &name, &value);
+  ret = recv_mgmt_response(reply.ptr, reply.len, op, &err, &rclass, &type, &name, &value);
   ats_free(reply.ptr);
   if (ret != TS_ERR_OKAY) {
     goto done;
@@ -522,6 +523,7 @@ mgmt_record_get_reply(OpType op, TSRecordEle *rec_ele)
     goto done;
   }
 
+  rec_ele->rec_class = (TSInt)rclass;
   rec_ele->rec_type = (TSRecordT)type;
   rec_ele->rec_name = ats_strdup(name);
   mgmt_record_convert_value(rec_ele->rec_type, value, rec_ele->valueT);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/mgmt/api/NetworkMessage.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkMessage.cc b/mgmt/api/NetworkMessage.cc
index 9fb5e21..c4b96ca 100644
--- a/mgmt/api/NetworkMessage.cc
+++ b/mgmt/api/NetworkMessage.cc
@@ -74,7 +74,9 @@ static const struct NetCmdOperation responses[] = {
   /* FILE_READ                  */ {3, {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_DATA}},
   /* FILE_WRITE                 */ {1, {MGMT_MARSHALL_INT}},
   /* RECORD_SET                 */ {2, {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT}},
-  /* RECORD_GET                 */ {4, {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_STRING, MGMT_MARSHALL_DATA}},
+  /* RECORD_GET                 */ {5,
+                                    {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_STRING,
+                                     MGMT_MARSHALL_DATA}},
   /* PROXY_STATE_GET            */ {2, {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT}},
   /* PROXY_STATE_SET            */ {1, {MGMT_MARSHALL_INT}},
   /* RECONFIGURE                */ {1, {MGMT_MARSHALL_INT}},
@@ -94,7 +96,9 @@ static const struct NetCmdOperation responses[] = {
   /* STATS_RESET_NODE           */ {1, {MGMT_MARSHALL_INT}},
   /* STATS_RESET_CLUSTER        */ {1, {MGMT_MARSHALL_INT}},
   /* STORAGE_DEVICE_CMD_OFFLINE */ {1, {MGMT_MARSHALL_INT}},
-  /* RECORD_MATCH_GET           */ {4, {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_STRING, MGMT_MARSHALL_DATA}},
+  /* RECORD_MATCH_GET           */ {5,
+                                    {MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_INT, MGMT_MARSHALL_STRING,
+                                     MGMT_MARSHALL_DATA}},
   /* API_PING                   */ {0, {}}, // no reply
   /* SERVER_BACKTRACE           */ {2, {MGMT_MARSHALL_INT, MGMT_MARSHALL_STRING}},
   /* RECORD_DESCRIBE_CONFIG     */ {15,
@@ -232,8 +236,8 @@ send_mgmt_error(int fd, OpType optype, TSMgmtError error)
 
   case RECORD_GET:
   case RECORD_MATCH_GET:
-    ink_release_assert(responses[optype].nfields == 4);
-    return send_mgmt_response(fd, optype, &ecode, &intval, &strval, &dataval);
+    ink_release_assert(responses[optype].nfields == 5);
+    return send_mgmt_response(fd, optype, &ecode, &intval, &intval, &strval, &dataval);
 
   case RECORD_DESCRIBE_CONFIG:
     ink_release_assert(responses[optype].nfields == 15);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/mgmt/api/TSControlMain.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/TSControlMain.cc b/mgmt/api/TSControlMain.cc
index 0673b29..1f22a52 100644
--- a/mgmt/api/TSControlMain.cc
+++ b/mgmt/api/TSControlMain.cc
@@ -297,14 +297,58 @@ marshall_rec_data(RecDataT rec_type, const RecData &rec_data, MgmtMarshallData &
 }
 
 static TSMgmtError
-send_record_get_response(int fd, TSRecordT rec_type, const char *rec_name, const void *rec_data, size_t data_len)
+send_record_get_response(int fd, const RecRecord *rec)
 {
   MgmtMarshallInt err = TS_ERR_OKAY;
-  MgmtMarshallInt type = rec_type;
-  MgmtMarshallString name = const_cast<MgmtMarshallString>(rec_name);
-  MgmtMarshallData value = {const_cast<void *>(rec_data), data_len};
+  MgmtMarshallInt type;
+  MgmtMarshallInt rclass;
+  MgmtMarshallString name;
+  MgmtMarshallData value = {NULL, 0};
+
+  if (rec) {
+    type = rec->data_type;
+    rclass = rec->rec_type;
+    name = const_cast<MgmtMarshallString>(rec->name);
+  } else {
+    type = RECD_NULL;
+    rclass = RECT_NULL;
+    name = NULL;
+  }
+
+  switch (type) {
+  case RECD_INT:
+    type = TS_REC_INT;
+    value.ptr = (void *)&rec->data.rec_int;
+    value.len = sizeof(RecInt);
+    break;
+  case RECD_COUNTER:
+    type = TS_REC_COUNTER;
+    value.ptr = (void *)&rec->data.rec_counter;
+    value.len = sizeof(RecCounter);
+    break;
+  case RECD_FLOAT:
+    type = TS_REC_FLOAT;
+    value.ptr = (void *)&rec->data.rec_float;
+    value.len = sizeof(RecFloat);
+    break;
+  case RECD_STRING:
+    // For NULL string parameters, send the literal "NULL" to match the behavior of MgmtRecordGet(). Make sure to send
+    // the trailing NULL.
+    type = TS_REC_STRING;
+    if (rec->data.rec_string) {
+      value.ptr = rec->data.rec_string;
+      value.len = strlen(rec->data.rec_string) + 1;
+    } else {
+      value.ptr = const_cast<char *>("NULL");
+      value.len = countof("NULL");
+    }
+    break;
+  default:
+    type = TS_REC_UNDEFINED;
+    break; // skip it
+  }
 
-  return send_mgmt_response(fd, RECORD_GET, &err, &type, &name, &value);
+  return send_mgmt_response(fd, RECORD_GET, &err, &rclass, &type, &name, &value);
 }
 
 /**************************************************************************
@@ -317,69 +361,55 @@ send_record_get_response(int fd, TSRecordT rec_type, const char *rec_name, const
  * output: SUCC or ERR
  * note:
  *************************************************************************/
+static void
+send_record_get(const RecRecord *rec, void *edata)
+{
+  int *fd = (int *)edata;
+  *fd = send_record_get_response(*fd, rec);
+}
+
 static TSMgmtError
 handle_record_get(int fd, void *req, size_t reqlen)
 {
   TSMgmtError ret;
-  TSRecordEle *ele;
   MgmtMarshallInt optype;
   MgmtMarshallString name;
 
+  int fderr = fd; // [in,out] variable for the fd and error
+
   ret = recv_mgmt_request(req, reqlen, RECORD_GET, &optype, &name);
   if (ret != TS_ERR_OKAY) {
     return ret;
   }
 
   if (strlen(name) == 0) {
-    ats_free(name);
-    return ret;
+    ret = TS_ERR_PARAMS;
+    goto done;
   }
 
-  // call CoreAPI call on Traffic Manager side
-  ele = TSRecordEleCreate();
-  ret = MgmtRecordGet(name, ele);
-  ats_free(name);
-
-  if (ret != TS_ERR_OKAY) {
+  fderr = fd;
+  if (RecLookupRecord(name, send_record_get, &fderr) != REC_ERR_OKAY) {
+    ret = TS_ERR_PARAMS;
     goto done;
   }
 
-  // create and send reply back to client
-  switch (ele->rec_type) {
-  case TS_REC_INT:
-    ret = send_record_get_response(fd, ele->rec_type, ele->rec_name, &(ele->valueT.int_val), sizeof(TSInt));
-    break;
-  case TS_REC_COUNTER:
-    ret = send_record_get_response(fd, ele->rec_type, ele->rec_name, &(ele->valueT.counter_val), sizeof(TSCounter));
-    break;
-  case TS_REC_FLOAT:
-    ret = send_record_get_response(fd, ele->rec_type, ele->rec_name, &(ele->valueT.float_val), sizeof(TSFloat));
-    break;
-  case TS_REC_STRING:
-    // Make sure to send the NULL in the string value response.
-    if (ele->valueT.string_val) {
-      ret = send_record_get_response(fd, ele->rec_type, ele->rec_name, ele->valueT.string_val, strlen(ele->valueT.string_val) + 1);
-    } else {
-      ret = send_record_get_response(fd, ele->rec_type, ele->rec_name, "NULL", countof("NULL"));
-    }
-    break;
-  default: // invalid record type
-    ret = TS_ERR_FAIL;
+  // If the lookup succeeded, the final error is in "fderr".
+  if (ret == TS_ERR_OKAY) {
+    ret = (TSMgmtError)fderr;
   }
 
 done:
-  TSRecordEleDestroy(ele);
+  ats_free(name);
   return ret;
 }
 
 struct record_match_state {
   TSMgmtError err;
   int fd;
-  DFA regex;
 };
 
 static void
-send_record_match(RecT /* rec_type */, void *edata, int /* registered */, const char *name, int data_type, RecData *rec_val)
+send_record_match(const RecRecord *rec, void *edata)
 {
   record_match_state *match = (record_match_state *)edata;
 
@@ -387,30 +417,7 @@ send_record_match(RecT /* rec_type */, void *edata, int /* registered */, const
     return;
   }
 
-  if (match->regex.match(name) >= 0) {
-    switch (data_type) {
-    case RECD_INT:
-      match->err = send_record_get_response(match->fd, TS_REC_INT, name, &(rec_val->rec_int), sizeof(TSInt));
-      break;
-    case RECD_COUNTER:
-      match->err = send_record_get_response(match->fd, TS_REC_COUNTER, name, &(rec_val->rec_counter), sizeof(TSCounter));
-      break;
-    case RECD_STRING:
-      // For NULL string parameters, end the literal "NULL" to match the behavior of MgmtRecordGet(). Make sure to send
-      // the trailing NULL.
-      if (rec_val->rec_string) {
-        match->err = send_record_get_response(match->fd, TS_REC_STRING, name, rec_val->rec_string, strlen(rec_val->rec_string) + 1);
-      } else {
-        match->err = send_record_get_response(match->fd, TS_REC_STRING, name, "NULL", countof("NULL"));
-      }
-      break;
-    case RECD_FLOAT:
-      match->err = send_record_get_response(match->fd, TS_REC_FLOAT, name, &(rec_val->rec_float), sizeof(TSFloat));
-      break;
-    default:
-      break; // skip it
-    }
-  }
+  match->err = send_record_get_response(match->fd, rec);
 }
 
 static TSMgmtError
@@ -431,21 +438,19 @@ handle_record_match(int fd, void *req, size_t reqlen)
     return TS_ERR_FAIL;
   }
 
-  if (match.regex.compile(name, RE_CASE_INSENSITIVE | RE_UNANCHORED) != 0) {
+  match.err = TS_ERR_OKAY;
+  match.fd = fd;
+
+  if (RecLookupMatchingRecords(name, send_record_match, &match) != REC_ERR_OKAY) {
     ats_free(name);
     return TS_ERR_FAIL;
   }
 
   ats_free(name);
 
-  match.err = TS_ERR_OKAY;
-  match.fd = fd;
-
-  RecDumpRecords(RECT_NULL, send_record_match, &match);
-
   // If successful, send a list terminator.
   if (match.err == TS_ERR_OKAY) {
-    return send_record_get_response(fd, TS_REC_UNDEFINED, NULL, NULL, 0);
+    return send_record_get_response(fd, NULL);
   }
 
   return match.err;

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/244b78e5/mgmt/api/include/mgmtapi.h
----------------------------------------------------------------------
diff --git a/mgmt/api/include/mgmtapi.h b/mgmt/api/include/mgmtapi.h
index aba1293..65ff981 100644
--- a/mgmt/api/include/mgmtapi.h
+++ b/mgmt/api/include/mgmtapi.h
@@ -397,6 +397,7 @@ typedef union {/* record value */
 
 typedef struct {
   char *rec_name;        /* record name */
+  TSInt rec_class;       /* record class (RecT) */
   TSRecordT rec_type;    /* record type {TS_REC_INT...} */
   TSRecordValueT valueT; /* record value */
 } TSRecordEle;