You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/09/22 22:30:14 UTC

svn commit: r1000197 - in /trafficserver/traffic/trunk: ./ librecords/ proxy/ proxy/api/ts/ proxy/mgmt2/cluster/ proxy/mgmt2/web2/

Author: zwoop
Date: Wed Sep 22 20:30:13 2010
New Revision: 1000197

URL: http://svn.apache.org/viewvc?rev=1000197&view=rev
Log:
TS-390: Dynamic sized librecords containers.

This adds some support for dynamically resizing the librecords
containers, based on proxy.config.stat_api.max_stats_allowed. This
eliminates (what I think is) a premature optimization that only
would "help" clustering (slightly), at the expense of complicating
the code a lot.

However, the dynamic resizing is currently disabled, since it
doesn't work 100%. Will fix for v2.1.4 (or remove).

Modified:
    trafficserver/traffic/trunk/CHANGES
    trafficserver/traffic/trunk/librecords/I_RecCore.h
    trafficserver/traffic/trunk/librecords/I_RecDefs.h
    trafficserver/traffic/trunk/librecords/I_RecProcess.h
    trafficserver/traffic/trunk/librecords/P_RecCore.h
    trafficserver/traffic/trunk/librecords/P_RecDefs.h
    trafficserver/traffic/trunk/librecords/RecCore.cc
    trafficserver/traffic/trunk/librecords/RecLocal.cc
    trafficserver/traffic/trunk/librecords/RecProcess.cc
    trafficserver/traffic/trunk/librecords/RecUtils.cc
    trafficserver/traffic/trunk/proxy/InkAPI.cc
    trafficserver/traffic/trunk/proxy/api/ts/ts.h
    trafficserver/traffic/trunk/proxy/mgmt2/cluster/ClusterCom.cc
    trafficserver/traffic/trunk/proxy/mgmt2/web2/WebOverview.cc

Modified: trafficserver/traffic/trunk/CHANGES
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/CHANGES?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/CHANGES (original)
+++ trafficserver/traffic/trunk/CHANGES Wed Sep 22 20:30:13 2010
@@ -2,6 +2,11 @@
 
 Changes with Apache Traffic Server 2.1.3
 
+  *) New plugin APIs for stats, and making the "v2" (incomplete) stats
+  experimental (no longer built by default) [TS-390]. See
+  https://cwiki.apache.org/confluence/display/TS/NewStatsAPI  for more
+  details.
+
   *) Cleanup in duplicated configs, and obsoleted configs [TS-447] and
    [TS-451].
 

Modified: trafficserver/traffic/trunk/librecords/I_RecCore.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/I_RecCore.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/I_RecCore.h (original)
+++ trafficserver/traffic/trunk/librecords/I_RecCore.h Wed Sep 22 20:30:13 2010
@@ -32,24 +32,22 @@
 #include "I_RecSignals.h"
 #include "I_RecEvents.h"
 
+
 //-------------------------------------------------------------------------
 // Diagnostic Output
 //-------------------------------------------------------------------------
-
 int RecSetDiags(Diags * diags);
 
+
 //-------------------------------------------------------------------------
 // Stat Registration
 //-------------------------------------------------------------------------
-
 int RecRegisterStatInt(RecT rec_type, const char *name, RecInt data_default, RecPersistT persist_type);
-
 int RecRegisterStatFloat(RecT rec_type, const char *name, RecFloat data_default, RecPersistT persist_type);
-
 int RecRegisterStatString(RecT rec_type, const char *name, RecString data_default, RecPersistT persist_type);
-
 int RecRegisterStatCounter(RecT rec_type, const char *name, RecCounter data_default, RecPersistT persist_type);
 
+
 //-------------------------------------------------------------------------
 // Config Registration
 //-------------------------------------------------------------------------
@@ -82,8 +80,8 @@ int RecLinkConfigCounter(const char *nam
 int RecLinkConfigString(const char *name, RecString * rec_string);
 
 int RecRegisterConfigUpdateCb(const char *name, RecConfigUpdateCb update_cb, void *cookie);
-int RecRegisterRawStatUpdateFunc(const char *name, RecRawStatBlock * rsb,
-                                 int id, RecStatUpdateFunc update_func, void *cookie);
+int RecRegisterRawStatUpdateFunc(const char *name, RecRawStatBlock * rsb, int id, RecStatUpdateFunc update_func, void *cookie);
+
 
 //-------------------------------------------------------------------------
 // Record Reading/Writing
@@ -109,13 +107,14 @@ int RecGetRecordString_Xmalloc(const cha
 int RecGetRecordCounter(const char *name, RecCounter * rec_counter, bool lock = true);
 int RecGetRecordGeneric_Xmalloc(const char *name, RecString * rec_string, bool lock = true);
 
+
 //------------------------------------------------------------------------
 // Record Attributes Reading
 //------------------------------------------------------------------------
 int RecGetRecordType(const char *name, RecT * rec_type, bool lock = true);
 int RecGetRecordDataType(const char *name, RecDataT * data_type, bool lock = true);
 int RecGetRecordUpdateCount(RecT data_type);
-int RecGetRecordRelativeOrder(const char *name, int *order, bool lock = true);
+int RecGetRecordOrderAndId(const char *name, int *order, int *id, bool lock = true);
 
 int RecGetRecordUpdateType(const char *name, RecUpdateT * update_type, bool lock = true);
 int RecGetRecordCheckType(const char *name, RecCheckT * check_type, bool lock = true);
@@ -129,16 +128,17 @@ void RecGetRecordTree(char *subtree = NU
 void RecGetRecordList(char *, char ***, int *);
 int RecGetRecordPrefix_Xmalloc(char *prefix, char **result, int *result_len);
 
+
 //------------------------------------------------------------------------
 // Signal and Alarms
 //------------------------------------------------------------------------
 void RecSignalManager(int, const char *);
 void RecSignalAlarm(int, const char *);
 
+
 //-------------------------------------------------------------------------
 // Backwards Compatibility Items (REC_ prefix)
 //-------------------------------------------------------------------------
-
 #define REC_ReadConfigInt32(_var,_config_var_name) do { \
   RecInt tmp = 0; \
   RecGetRecordInt(_config_var_name, (RecInt*) &tmp); \
@@ -212,17 +212,20 @@ bool REC_setFloat(const char *name, floa
 bool REC_setCounter(const char *name, int64 value, bool dirty = true);
 bool REC_setString(const char *name, char *value, bool dirty = true);
 
+
 //------------------------------------------------------------------------
 // Clear Statistics
 //------------------------------------------------------------------------
 int RecResetStatRecord(char *name);
 int RecResetStatRecord(RecT type = RECT_NULL);
 
+
 //------------------------------------------------------------------------
 // Set RecRecord attributes
 //------------------------------------------------------------------------
 int RecSetSyncRequired(char *name, bool lock = true);
 
+
 //------------------------------------------------------------------------
 // Signal Alarm/Warning
 //------------------------------------------------------------------------
@@ -230,10 +233,13 @@ int RecSetSyncRequired(char *name, bool 
 #define REC_SignalAlarm          RecSignalAlarm
 #define REC_SignalWarning(_n,_d) { Warning(_d); RecSignalManager(_n,_d); }
 
+
 //------------------------------------------------------------------------
 // Manager Callback
 //------------------------------------------------------------------------
 typedef void *(*RecManagerCb) (void *opaque_cb_data, char *data_raw, int data_len);
 int RecRegisterManagerCb(int _signal, RecManagerCb _fn, void *_data = NULL);
 
+void RecResizeAdditional(int add);
+
 #endif

Modified: trafficserver/traffic/trunk/librecords/I_RecDefs.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/I_RecDefs.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/I_RecDefs.h (original)
+++ trafficserver/traffic/trunk/librecords/I_RecDefs.h Wed Sep 22 20:30:13 2010
@@ -152,9 +152,9 @@ struct RecRawStat
 struct RecRawStatBlock
 {
   off_t ethr_stat_offset;   // thread local raw-stat storage
-  RecRawStat **global;          // global raw-stat storage (ptr to RecRecord)
-  int num_stats;                // number of stats in this block
-  int max_stats;                // maximum number of stats for this block
+  RecRawStat **global;      // global raw-stat storage (ptr to RecRecord)
+  int num_stats;            // number of stats in this block
+  int max_stats;            // maximum number of stats for this block
   ink_mutex mutex;
 };
 

Modified: trafficserver/traffic/trunk/librecords/I_RecProcess.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/I_RecProcess.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/I_RecProcess.h (original)
+++ trafficserver/traffic/trunk/librecords/I_RecProcess.h Wed Sep 22 20:30:13 2010
@@ -112,16 +112,13 @@ int64 *RecGetGlobalRawStatCountPtr(RecRa
 inline RecRawStat *
 raw_stat_get_tlp(RecRawStatBlock * rsb, int id, EThread * ethread)
 {
-
   ink_debug_assert((id >= 0) && (id < rsb->max_stats));
   if (ethread == NULL) {
     ethread = this_ethread();
   }
   return (((RecRawStat *) ((char *) (ethread) + rsb->ethr_stat_offset)) + id);
-
 }
 
-
 inline int
 RecIncrRawStat(RecRawStatBlock * rsb, EThread * ethread, int id, int64 incr)
 {
@@ -159,4 +156,4 @@ RecIncrRawStatCount(RecRawStatBlock * rs
   return REC_ERR_OKAY;
 }
 
-#endif
+#endif /* !_I_REC_PROCESS_H_ */

Modified: trafficserver/traffic/trunk/librecords/P_RecCore.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/P_RecCore.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/P_RecCore.h (original)
+++ trafficserver/traffic/trunk/librecords/P_RecCore.h Wed Sep 22 20:30:13 2010
@@ -39,6 +39,7 @@ extern RecRecord *g_records;
 extern InkHashTable *g_records_ht;
 extern ink_rwlock g_records_rwlock;
 extern int g_num_records;
+extern int g_max_records;
 extern int g_num_update[];
 extern RecTree *g_records_tree;
 
@@ -51,9 +52,6 @@ extern ink_mutex g_rec_config_lock;
 // stats.snap items
 extern const char *g_stats_snap_fpath;
 
-extern int g_type_records[][REC_MAX_RECORDS];
-extern int g_type_num_records[];
-
 //-------------------------------------------------------------------------
 // Initialization
 //-------------------------------------------------------------------------

Modified: trafficserver/traffic/trunk/librecords/P_RecDefs.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/P_RecDefs.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/P_RecDefs.h (original)
+++ trafficserver/traffic/trunk/librecords/P_RecDefs.h Wed Sep 22 20:30:13 2010
@@ -35,11 +35,10 @@
 
 #define REC_MESSAGE_ELE_MAGIC           0xF00DF00D
 
-// TODO: We really need to try to make this setting dynamic, based
-// on proxy.config.stat_api.max_stats_allowed (since it's the only
-// variable piece). XXX
-// This allocates 5k for InkAPI stats, 3k for "core" (2x what we use)
-#define REC_MAX_RECORDS                 8000
+// This is for the internal stats and configs, API stats are additional (records.config)
+// TODO: For now, also allow for 1500 plugin stats, later this needs to be dynamically
+// resized, but not working right now.
+#define REC_MAX_RECORDS                 3000
 
 #define REC_CONFIG_UPDATE_INTERVAL_SEC  3
 #define REC_REMOTE_SYNC_INTERVAL_SEC    5
@@ -123,7 +122,8 @@ struct RecRecord
     RecStatMeta stat_meta;
     RecConfigMeta config_meta;
   };
-  int relative_order;
+  int order;
+  int rsb_id;
 };
 
 // Used for cluster

Modified: trafficserver/traffic/trunk/librecords/RecCore.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/RecCore.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/RecCore.cc (original)
+++ trafficserver/traffic/trunk/librecords/RecCore.cc Wed Sep 22 20:30:13 2010
@@ -37,6 +37,7 @@ RecRecord *g_records = NULL;
 InkHashTable *g_records_ht = NULL;
 ink_rwlock g_records_rwlock;
 int g_num_records = 0;
+int g_max_records = 0;
 
 const char *g_rec_config_fpath = NULL;
 LLQ *g_rec_config_contents_llq = NULL;
@@ -48,12 +49,6 @@ int g_num_update[RECT_MAX];
 
 RecTree *g_records_tree = NULL;
 
-// TODO: This is hugely wasteful, since we most likely don't need all
-// REC_MAX_RECORDS_SLOT for every RECT_MAX "type". XXX
-int g_type_records[RECT_MAX][REC_MAX_RECORDS];
-int g_type_num_records[RECT_MAX];
-
-
 //-------------------------------------------------------------------------
 // register_record
 //-------------------------------------------------------------------------
@@ -181,16 +176,18 @@ RecCoreInit(RecModeT mode_type, Diags *_
   if (g_initialized) {
     return REC_ERR_OKAY;
   }
+
   // set our diags
   ink_atomic_swap_ptr(&g_diags, _diags);
 
   g_records_tree = new RecTree(NULL);
-
-  // initialize record array
-  g_records = (RecRecord *) xmalloc(REC_MAX_RECORDS * sizeof(RecRecord));
-  memset(g_records, 0, REC_MAX_RECORDS * sizeof(RecRecord));
+  g_max_records = REC_MAX_RECORDS;
   g_num_records = 0;
 
+  // initialize record array for our internal stats (this can be reallocated later)
+  g_records = (RecRecord *) xmalloc(g_max_records * sizeof(RecRecord));
+  memset(g_records, 0, g_max_records * sizeof(RecRecord));
+
   // initialize record hash index
   g_records_ht = ink_hash_table_create(InkHashTableKeyType_String);
   ink_rwlock_init(&g_records_rwlock);
@@ -230,10 +227,6 @@ RecCoreInit(RecModeT mode_type, Diags *_
 
   for (int i = 0; i < RECT_MAX; i++) {
     g_num_update[i] = 0;
-    g_type_num_records[i] = 0;
-    for (int j = 0; j < REC_MAX_RECORDS; j++) {
-      g_type_records[i][j] = -1;
-    }
   }
 
   g_initialized = true;
@@ -243,6 +236,29 @@ RecCoreInit(RecModeT mode_type, Diags *_
 
 
 //-------------------------------------------------------------------------
+// RecResizeAdditional: Add more storage space
+//-------------------------------------------------------------------------
+#if 0
+void
+RecResizeAdditional(int add)
+{
+  // TODO: Hmmm, why couldn't I get xrealloc() to work here?
+  // TODO: This doesn't seem to work well at all ... *sigh*
+  void *tmp = xmalloc((g_max_records + add) * sizeof(RecRecord));
+
+  if (NULL != tmp) {
+    memset(tmp, 0, (g_max_records + add) * sizeof(RecRecord)); // Little unoptimal, ENOCARE
+    memcpy(tmp, g_records, g_max_records * sizeof(RecRecord));
+    g_records = (RecRecord *)tmp;
+    g_max_records += add;
+  } else {
+    ink_fatal(1, "can't reallocate for librecords API stats (adding %d records)", add);
+  }
+}
+#endif
+
+
+//-------------------------------------------------------------------------
 // RecSetDiags
 //-------------------------------------------------------------------------
 int
@@ -537,7 +553,7 @@ RecGetRecordUpdateCount(RecT data_type)
 }
 
 int
-RecGetRecordRelativeOrder(const char *name, int *order, bool lock)
+RecGetRecordOrderAndId(const char *name, int* order, int* id, bool lock)
 {
   int err = REC_ERR_FAIL;
   RecRecord *r = NULL;
@@ -548,7 +564,10 @@ RecGetRecordRelativeOrder(const char *na
 
   if (ink_hash_table_lookup(g_records_ht, name, (void **) &r)) {
     rec_mutex_acquire(&(r->lock));
-    *order = r->relative_order;
+    if (order)
+      *order = r->order;
+    if (id)
+      *id = r->rsb_id;
     err = REC_ERR_OKAY;
     rec_mutex_release(&(r->lock));
   }
@@ -749,6 +768,7 @@ RecRecord *
 RecRegisterStat(RecT rec_type, const char *name, RecDataT data_type, RecData data_default, RecPersistT persist_type)
 {
   RecRecord *r = NULL;
+
   ink_rwlock_wrlock(&g_records_rwlock);
   if ((r = register_record(rec_type, name, data_type, data_default, false)) != NULL) {
     r->stat_meta.persist_type = persist_type;

Modified: trafficserver/traffic/trunk/librecords/RecLocal.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/RecLocal.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/RecLocal.cc (original)
+++ trafficserver/traffic/trunk/librecords/RecLocal.cc Wed Sep 22 20:30:13 2010
@@ -43,10 +43,10 @@ static RecModeT g_mode_type = RECM_NULL;
 //-------------------------------------------------------------------------
 #if defined (REC_BUILD_STAND_ALONE)
 
+
 //-------------------------------------------------------------------------
 // sync_thr
 //-------------------------------------------------------------------------
-
 static void *
 sync_thr(void *data)
 {
@@ -67,6 +67,7 @@ sync_thr(void *data)
   return NULL;
 }
 
+
 //-------------------------------------------------------------------------
 //
 // REC_BUILD_MGMT2 IMPLEMENTATION
@@ -76,16 +77,17 @@ sync_thr(void *data)
 
 #include "Main.h"
 
+
 //-------------------------------------------------------------------------
 // sync_thr
 //-------------------------------------------------------------------------
-
 static void *
 sync_thr(void *data)
 {
   REC_NOWARN_UNUSED(data);
   textBuffer *tb = NEW(new textBuffer(65536));
   Rollback *rb;
+
   while (1) {
     send_push_message();
     RecSyncStatsFile();
@@ -111,10 +113,10 @@ sync_thr(void *data)
 
 #endif
 
+
 //-------------------------------------------------------------------------
 // config_update_thr
 //-------------------------------------------------------------------------
-
 static void *
 config_update_thr(void *data)
 {
@@ -126,20 +128,18 @@ config_update_thr(void *data)
   return NULL;
 }
 
+
 //-------------------------------------------------------------------------
 // RecLocalInit
 //-------------------------------------------------------------------------
-
 int
 RecLocalInit(Diags * _diags)
 {
-
   if (g_initialized) {
     return REC_ERR_OKAY;
   }
 
   g_records_tree = new RecTree(NULL);
-
   g_mode_type = RECM_SERVER;
 
   if (RecCoreInit(RECM_SERVER, _diags) == REC_ERR_FAIL) {
@@ -155,22 +155,18 @@ RecLocalInit(Diags * _diags)
      return REC_ERR_FAIL;
      }
    */
-
   g_initialized = true;
 
   return REC_ERR_OKAY;
-
 }
 
 
 //-------------------------------------------------------------------------
 // RecLocalInitMessage
 //-------------------------------------------------------------------------
-
 int
 RecLocalInitMessage()
 {
-
   if (g_message_initialized) {
     return REC_ERR_OKAY;
   }
@@ -191,11 +187,11 @@ RecLocalInitMessage()
 //-------------------------------------------------------------------------
 // RecLocalStart
 //-------------------------------------------------------------------------
-
 int
 RecLocalStart()
 {
   ink_thread_create(sync_thr, NULL);
   ink_thread_create(config_update_thr, NULL);
+
   return REC_ERR_OKAY;
 }

Modified: trafficserver/traffic/trunk/librecords/RecProcess.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/RecProcess.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/RecProcess.cc (original)
+++ trafficserver/traffic/trunk/librecords/RecProcess.cc Wed Sep 22 20:30:13 2010
@@ -49,6 +49,7 @@ raw_stat_get_total(RecRawStatBlock *rsb,
 {
   int i;
   RecRawStat *tlp;
+
   total->sum = 0;
   total->count = 0;
 
@@ -76,6 +77,7 @@ raw_stat_sync_to_global(RecRawStatBlock 
   int i;
   RecRawStat *tlp;
   RecRawStat total;
+
   total.sum = 0;
   total.count = 0;
 
@@ -169,6 +171,7 @@ static int
 recv_message_cb__process(RecMessage *msg, RecMessageT msg_type, void *cookie)
 {
   int err;
+
   if ((err = recv_message_cb(msg, msg_type, cookie)) == REC_ERR_OKAY) {
     if (msg_type == RECG_PULL_ACK) {
       ink_mutex_acquire(&g_force_req_mutex);
@@ -183,12 +186,14 @@ recv_message_cb__process(RecMessage *msg
 //-------------------------------------------------------------------------
 // raw_stat_sync_cont
 //-------------------------------------------------------------------------
-struct raw_stat_sync_cont:public Continuation
+struct raw_stat_sync_cont: public Continuation
 {
-  raw_stat_sync_cont(ProxyMutex *m):Continuation(m)
+  raw_stat_sync_cont(ProxyMutex *m)
+    : Continuation(m)
   {
     SET_HANDLER(&raw_stat_sync_cont::exec_callbacks);
   }
+
   int exec_callbacks(int event, Event *e)
   {
     REC_NOWARN_UNUSED(event);
@@ -206,12 +211,14 @@ struct raw_stat_sync_cont:public Continu
 //-------------------------------------------------------------------------
 // config_update_cont
 //-------------------------------------------------------------------------
-struct config_update_cont:public Continuation
+struct config_update_cont: public Continuation
 {
-  config_update_cont(ProxyMutex *m):Continuation(m)
+  config_update_cont(ProxyMutex *m)
+    : Continuation(m)
   {
     SET_HANDLER(&config_update_cont::exec_callbacks);
   }
+
   int exec_callbacks(int event, Event *e)
   {
     REC_NOWARN_UNUSED(event);
@@ -229,14 +236,17 @@ struct config_update_cont:public Continu
 //-------------------------------------------------------------------------
 // sync_cont
 //-------------------------------------------------------------------------
-struct sync_cont:public Continuation
+struct sync_cont: public Continuation
 {
   textBuffer *m_tb;
-    sync_cont(ProxyMutex *m):Continuation(m)
+
+  sync_cont(ProxyMutex *m)
+    : Continuation(m)
   {
     SET_HANDLER(&sync_cont::sync);
     m_tb = NEW(new textBuffer(65536));
   }
+
    ~sync_cont()
   {
     if (m_tb != NULL) {
@@ -244,6 +254,7 @@ struct sync_cont:public Continuation
       m_tb = NULL;
     }
   }
+
   int sync(int event, Event *e)
   {
     REC_NOWARN_UNUSED(event);
@@ -277,7 +288,6 @@ RecProcessInit(RecModeT mode_type, Diags
   }
 
   g_records_tree = new RecTree(NULL);
-
   g_mode_type = mode_type;
 
   if (RecCoreInit(mode_type, _diags) == REC_ERR_FAIL) {
@@ -420,6 +430,7 @@ RecRegisterRawStat(RecRawStatBlock *rsb,
     err = REC_ERR_FAIL;
     goto Ldone;
   }
+  r->rsb_id = id; // This is the index within the RSB raw block for this stat, used for lookups by name.
   if (i_am_the_record_owner(r->rec_type)) {
     r->sync_required = r->sync_required | REC_PEER_SYNC_REQUIRED;
   } else {
@@ -604,6 +615,7 @@ int
 RecGetRawStatSum(RecRawStatBlock *rsb, int id, int64 *data)
 {
   RecRawStat total;
+
   raw_stat_get_total(rsb, id, &total);
   *data = total.sum;
   return REC_ERR_OKAY;
@@ -613,6 +625,7 @@ int
 RecGetRawStatCount(RecRawStatBlock *rsb, int id, int64 *data)
 {
   RecRawStat total;
+
   raw_stat_get_total(rsb, id, &total);
   *data = total.count;
   return REC_ERR_OKAY;

Modified: trafficserver/traffic/trunk/librecords/RecUtils.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/RecUtils.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/RecUtils.cc (original)
+++ trafficserver/traffic/trunk/librecords/RecUtils.cc Wed Sep 22 20:30:13 2010
@@ -32,56 +32,50 @@ extern Diags *g_diags;
 //-------------------------------------------------------------------------
 // RecAlloc
 //-------------------------------------------------------------------------
-
-RecRecord *
+RecRecord*
 RecAlloc(RecT rec_type, const char *name, RecDataT data_type)
 {
-
-  if (g_num_records >= REC_MAX_RECORDS) {
+  if (g_num_records >= g_max_records) {
+    Warning("too many stats/configs, please increase REC_MAX_RECORDS or proxy.config.stat_api.max_stats_allowed");
     return NULL;
   }
+
   int i = ink_atomic_increment(&g_num_records, 1);
   RecRecord *r = &(g_records[i]);
   // Note: record should already be memset to 0 from RecCoreInit()
   r->rec_type = rec_type;
   r->name = xstrdup(name);
+  r->order = i;
   r->data_type = data_type;
   rec_mutex_init(&(r->lock), NULL);
 
   g_records_tree->rec_tree_insert(r->name);
 
-  g_type_records[rec_type][g_type_num_records[rec_type]] = i;
-  r->relative_order = g_type_num_records[rec_type];
-  g_type_num_records[rec_type]++;
-
   return r;
-
 }
 
+
 //-------------------------------------------------------------------------
 // RecDataClear
 //-------------------------------------------------------------------------
-
 void
 RecDataClear(RecDataT data_type, RecData * data)
 {
-
   if ((data_type == RECD_STRING) && (data->rec_string)) {
     xfree(data->rec_string);
   }
   memset(data, 0, sizeof(RecData));
-
 }
 
+
 //-------------------------------------------------------------------------
 // RecDataSet
 //-------------------------------------------------------------------------
-
 bool
 RecDataSet(RecDataT data_type, RecData * data_dst, RecData * data_src)
 {
-
   bool rec_set = false;
+
   switch (data_type) {
   case RECD_STRING:
     if (data_src->rec_string == NULL) {
@@ -124,14 +118,13 @@ RecDataSet(RecDataT data_type, RecData *
 
 }
 
+
 //-------------------------------------------------------------------------
 // RecDataSetFromInk64
 //-------------------------------------------------------------------------
-
 bool
 RecDataSetFromInk64(RecDataT data_type, RecData * data_dst, int64 data_int64)
 {
-
   switch (data_type) {
   case RECD_INT:
     data_dst->rec_int = data_int64;
@@ -158,17 +151,15 @@ RecDataSetFromInk64(RecDataT data_type, 
   }
 
   return true;
-
 }
 
+
 //-------------------------------------------------------------------------
 // RecDataSetFromFloat
 //-------------------------------------------------------------------------
-
 bool
 RecDataSetFromFloat(RecDataT data_type, RecData * data_dst, float data_float)
 {
-
   switch (data_type) {
   case RECD_INT:
     data_dst->rec_int = (RecInt) data_float;
@@ -195,17 +186,15 @@ RecDataSetFromFloat(RecDataT data_type, 
   }
 
   return true;
-
 }
 
+
 //-------------------------------------------------------------------------
 // RecDataSetFromString
 //-------------------------------------------------------------------------
-
 bool
 RecDataSetFromString(RecDataT data_type, RecData * data_dst, char *data_string)
 {
-
   bool rec_set;
   RecData data_src;
 
@@ -232,17 +221,17 @@ RecDataSetFromString(RecDataT data_type,
   rec_set = RecDataSet(data_type, data_dst, &data_src);
 
   return rec_set;
-
 }
 
+
 //-------------------------------------------------------------------------
 // RecLog
 //-------------------------------------------------------------------------
-
 void
 RecLog(DiagsLevel dl, const char *format_string, ...)
 {
   va_list ap;
+
   va_start(ap, format_string);
   if (g_diags) {
     g_diags->log_va(NULL, dl, NULL, NULL, format_string, ap);
@@ -250,14 +239,15 @@ RecLog(DiagsLevel dl, const char *format
   va_end(ap);
 }
 
+
 //-------------------------------------------------------------------------
 // RecDebug
 //-------------------------------------------------------------------------
-
 void
 RecDebug(DiagsLevel dl, const char *format_string, ...)
 {
   va_list ap;
+
   va_start(ap, format_string);
   if (g_diags) {
     g_diags->log_va("rec", dl, NULL, NULL, format_string, ap);
@@ -265,10 +255,10 @@ RecDebug(DiagsLevel dl, const char *form
   va_end(ap);
 }
 
+
 //-------------------------------------------------------------------------
 // RecDebugOff
 //-------------------------------------------------------------------------
-
 void
 RecDebugOff()
 {

Modified: trafficserver/traffic/trunk/proxy/InkAPI.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPI.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPI.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPI.cc Wed Sep 22 20:30:13 2010
@@ -1818,9 +1818,14 @@ api_init()
     global_config_cbs = NEW(new ConfigUpdateCbTable);
 
     TS_ReadConfigInteger(api_stats_size, "proxy.config.stat_api.max_stats_allowed");
-    api_rsb = RecAllocateRawStatBlock(api_stats_size);
-    if (NULL == api_rsb) {
-      Warning("Can't allocate API stats block");
+    if (api_stats_size > 0) {
+      // RecResizeAdditional(api_stats_size);
+      api_rsb = RecAllocateRawStatBlock(api_stats_size);
+      if (NULL == api_rsb) {
+        Warning("Can't allocate API stats block");
+      }
+    } else {
+      api_rsb = NULL;
     }
 
     // Setup the version string for returning to plugins
@@ -7195,10 +7200,14 @@ INKMCOPreload(void *context,    // opaqu
 int
 TSStatCreate(const char *the_name, TSStatDataType the_type, TSStatPersistence persist, TSStatSync sync)
 {
-  int volatile ix = ink_atomic_increment(&top_stat, 1);
+  int volatile id = ink_atomic_increment(&top_stat, 1);
   RecRawStatSyncCb syncer = RecRawStatSyncCount;
 
-  if (sdk_sanity_check_null_ptr((void *)the_name) != INK_SUCCESS)
+  // TODO: This only supports "int" data types at this point, since the "Raw" stats
+  // interfaces only supports integers. Going forward, we could extend either the "Raw"
+  // stats APIs, or make non-int use the direct (synchronous) stats APIs (slower).
+  if ((sdk_sanity_check_null_ptr((void *)the_name) != INK_SUCCESS) ||
+      (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS))
     return INK_ERROR;
 
   switch (sync) {
@@ -7215,50 +7224,62 @@ TSStatCreate(const char *the_name, TSSta
     syncer = RecRawStatSyncCount;
     break;
   }
-  RecRegisterRawStat(api_rsb, RECT_PLUGIN, the_name, (RecDataT)the_type, RecPersistT(persist), ix, syncer);
+  RecRegisterRawStat(api_rsb, RECT_PLUGIN, the_name, (RecDataT)the_type, RecPersistT(persist), id, syncer);
 
-  return ix;
+  return id;
 }
 
-INKReturnCode
+TSReturnCode
 TSStatIntIncrement(int the_stat, INKMgmtInt amount)
 {
+  if (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS)
+    return TS_ERROR;
+
   RecIncrRawStat(api_rsb, NULL, the_stat, amount);
-  return INK_SUCCESS;
+  return TS_SUCCESS;
 }
 
-INKReturnCode
+TSReturnCode
 TSStatIntDecrement(int the_stat, INKMgmtInt amount)
 {
+  if (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS)
+    return TS_ERROR;
+
   RecDecrRawStat(api_rsb, NULL, the_stat, amount);
-  return INK_SUCCESS;
+  return TS_SUCCESS;
 }
 
-INKReturnCode
+TSReturnCode
 TSStatIntGet(int the_stat, INKMgmtInt* value)
 {
+  if (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS)
+    return TS_ERROR;
+
   RecGetGlobalRawStatSum(api_rsb, the_stat, value);
-  return INK_SUCCESS;
+  return TS_SUCCESS;
 }
 
-INKReturnCode
+TSReturnCode
 TSStatIntSet(int the_stat, INKMgmtInt value)
 {
+  if (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS)
+    return TS_ERROR;
+
   RecSetGlobalRawStatSum(api_rsb, the_stat, value);
-  return INK_SUCCESS;
+  return TS_SUCCESS;
 }
 
 int
 TSStatFindName(const char* name)
 {
-  int order;
+  int id;
 
-  if (sdk_sanity_check_null_ptr((void *)name) != INK_SUCCESS ||
-      sdk_sanity_check_null_ptr((void *)order) != INK_SUCCESS)
+  if ((sdk_sanity_check_null_ptr((void *)name) != INK_SUCCESS) ||
+      (sdk_sanity_check_null_ptr((void *)api_rsb) != INK_SUCCESS))
     return INK_ERROR;
 
-  if (RecGetRecordRelativeOrder(name, &order) == REC_ERR_OKAY)
-    return order;
+  if (RecGetRecordOrderAndId(name, NULL, &id) == REC_ERR_OKAY)
+    return id;
 
   return -1;
 }

Modified: trafficserver/traffic/trunk/proxy/api/ts/ts.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/api/ts/ts.h?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/api/ts/ts.h (original)
+++ trafficserver/traffic/trunk/proxy/api/ts/ts.h Wed Sep 22 20:30:13 2010
@@ -418,10 +418,16 @@ extern "C"
   } INKSDKVersion;
 
   typedef enum
-  {
-    INK_ERROR = -1,
-    INK_SUCCESS = 0
-  } INKReturnCode;
+    {
+      INK_ERROR = -1,
+      INK_SUCCESS = 0
+    } INKReturnCode;
+
+  typedef enum
+    {
+      TS_ERROR = -1,
+      TS_SUCCESS = 0
+    } TSReturnCode;
 
   typedef enum
   {
@@ -2360,14 +2366,15 @@ extern "C"
 
 
   /* --------------------------------------------------------------------------
-     Stats based on librecords (this is prefered API until we rewrite stats).
-     This system has a limitation of up to 10,000 stats max, controlled via
+     Stats based on librecords raw stats (this is prefered API until we rewrite
+     stats). This system has a limitation of up to 1,500 stats max, controlled via
      proxy.config.stat_api.max_stats_allowed (default is 512).
 
      This is available as of Apache TS v2.2.*/
   typedef enum
     {
       TS_STAT_TYPE_INT = 1,
+      //  The following are not supported yet.
       TS_STAT_TYPE_FLOAT,
       TS_STAT_TYPE_STRING,
       TS_STAT_TYPE_COUNTER,
@@ -2387,17 +2394,20 @@ extern "C"
       TS_STAT_SYNC_TIMEAVG,
     } TSStatSync;
 
+  // Note that only TS_STAT_TYPE_INT is supported at this point.
   inkapi int TSStatCreate(const char *the_name, TSStatDataType the_type, TSStatPersistence persist, TSStatSync sync);
 
-  inkapi INKReturnCode TSStatIntIncrement(int the_stat, INKMgmtInt amount);
-  inkapi INKReturnCode TSStatIntDecrement(int the_stat, INKMgmtInt amount);
-  inkapi INKReturnCode TSStatFloatIncrement(int the_stat, float amount);
-  inkapi INKReturnCode TSStatFloatDecrement(int the_stat, float amount);
-
-  inkapi INKReturnCode TSStatIntGet(int the_stat, INKMgmtInt* value);
-  inkapi INKReturnCode TSStatIntSet(int the_stat, INKMgmtInt value);
-  inkapi INKReturnCode TSStatFloatGet(int the_stat, float* value);
-  inkapi INKReturnCode TSStatFloatSet(int the_stat, float value);
+  inkapi TSReturnCode TSStatIntIncrement(int the_stat, INKMgmtInt amount);
+  inkapi TSReturnCode TSStatIntDecrement(int the_stat, INKMgmtInt amount);
+  // Currently not supported.
+  // inkapi TSReturnCode TSStatFloatIncrement(int the_stat, float amount);
+  // inkapi TSReturnCode TSStatFloatDecrement(int the_stat, float amount);
+
+  inkapi TSReturnCode TSStatIntGet(int the_stat, INKMgmtInt* value);
+  inkapi TSReturnCode TSStatIntSet(int the_stat, INKMgmtInt value);
+  // Currently not supported.
+  // inkapi TSeturnCode TSStatFloatGet(int the_stat, float* value);
+  // inkapi TSReturnCode TSStatFloatSet(int the_stat, float value);
 
   inkapi int TSStatFindName(const char* name);
 

Modified: trafficserver/traffic/trunk/proxy/mgmt2/cluster/ClusterCom.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/mgmt2/cluster/ClusterCom.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/mgmt2/cluster/ClusterCom.cc (original)
+++ trafficserver/traffic/trunk/proxy/mgmt2/cluster/ClusterCom.cc Wed Sep 22 20:30:13 2010
@@ -88,7 +88,6 @@ drainIncomingChannel(void *arg)
   // to reopen the channel (e.g. opening the socket would fail if the
   // interface was down).  In this case, the ccom->receive_fd is set
   // to '-1' and the open is retried until it succeeds.
-
   time_t t;
   time_t last_multicast_receive_time = time(NULL);
   struct timeval tv;
@@ -662,6 +661,7 @@ ClusterCom::checkPeers(time_t * ticker)
   return;
 }                               /* End ClusterCom::checkPeers */
 
+
 void
 ClusterCom::generateClusterDelta(void)
 {
@@ -846,19 +846,28 @@ ClusterCom::handleMultiCastMessage(char 
     p->inet_address = inet_addr(ip);
     p->num_virt_addrs = 0;
 
-    /* Safe since these are completely static */
-    p->node_rec_data.num_recs = g_type_num_records[RECT_NODE];
-    p->node_rec_data.recs = (RecRecord *) xmalloc(sizeof(RecRecord) * p->node_rec_data.num_recs);
-    for (int j = 0; j < p->node_rec_data.num_recs; j++) {
-      RecRecord *rec = &(g_records[g_type_records[RECT_NODE][j]]);
-      p->node_rec_data.recs[j].rec_type = rec->rec_type;
-      p->node_rec_data.recs[j].name = rec->name;
-      p->node_rec_data.recs[j].data_type = rec->data_type;
-      memset(&p->node_rec_data.recs[j].data, 0, sizeof(rec->data));
-      memset(&p->node_rec_data.recs[j].data_default, 0, sizeof(rec->data_default));
-      p->node_rec_data.recs[j].lock = rec->lock;
-      p->node_rec_data.recs[j].sync_required = rec->sync_required;
+    // Safe since these are completely static
+    // TODO: This might no longer be completely optimal, since we don't keep track of
+    // how many RECT_NODE stats there are. I'm hoping it's negligible though, but worst
+    // case we can reoptimize this later (and more efficiently).
+    int cnt = 0;
+    p->node_rec_data.recs = (RecRecord *) xmalloc(sizeof(RecRecord) * g_num_records);
+    for (int j = 0; j < g_num_records; j++) {
+      RecRecord *rec = &(g_records[j]);
+
+      if (rec->rec_type == RECT_NODE) {
+        p->node_rec_data.recs[cnt].rec_type = rec->rec_type;
+        p->node_rec_data.recs[cnt].name = rec->name;
+        p->node_rec_data.recs[cnt].data_type = rec->data_type;
+        memset(&p->node_rec_data.recs[cnt].data, 0, sizeof(rec->data));
+        memset(&p->node_rec_data.recs[cnt].data_default, 0, sizeof(rec->data_default));
+        p->node_rec_data.recs[cnt].lock = rec->lock;
+        p->node_rec_data.recs[cnt].sync_required = rec->sync_required;
+        ++cnt;
+      }
     }
+    p->node_rec_data.num_recs = cnt;
+
     ink_hash_table_insert(peers, (InkHashTableKey) ip, (p));
     ink_hash_table_delete(mismatchLog, ip);
 
@@ -1009,7 +1018,6 @@ ClusterCom::handleMultiCastStatPacket(ch
 // sync records.config CONFIG values (not LOCAL values) across a
 // records.config cluster syncronize operation.
 //-------------------------------------------------------------------------
-
 bool
 scan_and_terminate(char *&p, char a, char b)
 {
@@ -1480,37 +1488,40 @@ ClusterCom::constructSharedGenericPacket
   running_sum += strlen(tmp);
   ink_release_assert(running_sum < max);
 
-  for (int j = 0; j < g_type_num_records[RECT_NODE]; j++) {
-    RecRecord *rec = &(g_records[g_type_records[RECT_NODE][j]]);
-    ink_debug_assert(rec->rec_type == RECT_NODE);
+  int cnt = 0;
+  for (int j = 0; j < g_num_records; j++) {
+    RecRecord *rec = &(g_records[j]);
 
-    switch (rec->data_type) {
-    case RECD_COUNTER:
-      sprintf(tmp, "%d:%d: %lld\n", j, rec->data_type, rec->data.rec_counter);
-      ink_strncpy(&message[running_sum], tmp, (max - running_sum));
-      running_sum += strlen(tmp);
-      break;
-    case RECD_INT:
-      sprintf(tmp, "%d:%d: %lld\n", j, rec->data_type, rec->data.rec_int);
-      ink_strncpy(&message[running_sum], tmp, (max - running_sum));
-      running_sum += strlen(tmp);
-      break;
-    case RECD_FLOAT:
-      snprintf(tmp, sizeof(tmp), "%d:%d: %f\n", j, rec->data_type, rec->data.rec_float);
-      ink_strncpy(&message[running_sum], tmp, (max - running_sum));
-      running_sum += strlen(tmp);
-      break;
-    case RECD_STRING:
-      if (rec->data.rec_string) {
-        snprintf(tmp, sizeof(tmp), "%d:%d: %s\n", j, rec->data_type, rec->data.rec_string);
-      } else {
-        snprintf(tmp, sizeof(tmp), "%d:%d: NULL\n", j, rec->data_type);
+    if (rec->rec_type == RECT_NODE) {
+      switch (rec->data_type) {
+      case RECD_COUNTER:
+        sprintf(tmp, "%d:%d: %lld\n", cnt, rec->data_type, rec->data.rec_counter);
+        ink_strncpy(&message[running_sum], tmp, (max - running_sum));
+        running_sum += strlen(tmp);
+        break;
+      case RECD_INT:
+        sprintf(tmp, "%d:%d: %lld\n", cnt, rec->data_type, rec->data.rec_int);
+        ink_strncpy(&message[running_sum], tmp, (max - running_sum));
+        running_sum += strlen(tmp);
+        break;
+      case RECD_FLOAT:
+        snprintf(tmp, sizeof(tmp), "%d:%d: %f\n", cnt, rec->data_type, rec->data.rec_float);
+        ink_strncpy(&message[running_sum], tmp, (max - running_sum));
+        running_sum += strlen(tmp);
+        break;
+      case RECD_STRING:
+        if (rec->data.rec_string) {
+          snprintf(tmp, sizeof(tmp), "%d:%d: %s\n", cnt, rec->data_type, rec->data.rec_string);
+        } else {
+          snprintf(tmp, sizeof(tmp), "%d:%d: NULL\n", cnt, rec->data_type);
+        }
+        ink_strncpy(&message[running_sum], tmp, (max - running_sum));
+        running_sum += strlen(tmp);
+        break;
+      default:
+        break;
       }
-      ink_strncpy(&message[running_sum], tmp, (max - running_sum));
-      running_sum += strlen(tmp);
-      break;
-    default:
-      break;
+      ++cnt;
     }
     ink_release_assert(running_sum < max);
   }
@@ -1548,6 +1559,7 @@ ClusterCom::constructSharedPacketHeader(
   return running_sum;
 }                               /* End ClusterCom::constructSharedPacketHeader */
 
+
 /*
  * constructSharedFilePacket(...)
  *   Foreach of the config files we are holding build a packet that
@@ -1862,7 +1874,6 @@ ClusterCom::establishReceiveChannel(int 
 #endif
 
   return 0;
-
 }                               /* End ClusterCom::establishReceiveChannel */
 
 
@@ -2270,7 +2281,6 @@ ClusterCom::lowestPeer(int *no)
 void
 ClusterCom::logClusterMismatch(const char *ip, ClusterMismatch type, char *data)
 {
-
   void *value;
   ClusterMismatch stored_type;
 
@@ -2304,6 +2314,7 @@ ClusterCom::logClusterMismatch(const cha
   ink_hash_table_insert(mismatchLog, ip, (void *) type);
 }
 
+
 /*
  * highestPeer()
  *   Function finds the peer with the highest number of current virtual

Modified: trafficserver/traffic/trunk/proxy/mgmt2/web2/WebOverview.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/mgmt2/web2/WebOverview.cc?rev=1000197&r1=1000196&r2=1000197&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/mgmt2/web2/WebOverview.cc (original)
+++ trafficserver/traffic/trunk/proxy/mgmt2/web2/WebOverview.cc Wed Sep 22 20:30:13 2010
@@ -274,7 +274,8 @@ overviewRecord::readCounter(const char *
   int rec_status = REC_ERR_OKAY;
   int order = -1;
   if (localNode == false) {
-    rec_status = RecGetRecordRelativeOrder(name, &order);
+    // TODO: Not sure if this is correct now after we eliminated the relative order. Do we care?
+    rec_status = RecGetRecordOrderAndId(name, &order, NULL);
     if (rec_status == REC_ERR_OKAY) {
       ink_release_assert(order < node_rec_data.num_recs);
       ink_debug_assert(order < node_rec_data.num_recs);
@@ -299,7 +300,8 @@ overviewRecord::readInteger(const char *
   int rec_status = REC_ERR_OKAY;
   int order = -1;
   if (localNode == false) {
-    rec_status = RecGetRecordRelativeOrder(name, &order);
+    // TODO: Not sure if this is correct now after we eliminated the relative order. Do we care?
+    rec_status = RecGetRecordOrderAndId(name, &order, NULL);
     if (rec_status == REC_ERR_OKAY) {
       ink_release_assert(order < node_rec_data.num_recs);
       ink_debug_assert(order < node_rec_data.num_recs);
@@ -324,7 +326,8 @@ overviewRecord::readFloat(const char *na
   int rec_status = REC_ERR_OKAY;
   int order = -1;
   if (localNode == false) {
-    rec_status = RecGetRecordRelativeOrder(name, &order);
+    // TODO: Not sure if this is correct now after we eliminated the relative order. Do we care?
+    rec_status = RecGetRecordOrderAndId(name, &order, NULL);
     if (rec_status == REC_ERR_OKAY) {
       ink_release_assert(order < node_rec_data.num_recs);
       ink_debug_assert(order < node_rec_data.num_recs);
@@ -349,7 +352,8 @@ overviewRecord::readString(const char *n
   int rec_status = REC_ERR_OKAY;
   int order = -1;
   if (localNode == false) {
-    rec_status = RecGetRecordRelativeOrder(name, &order);
+    // TODO: Not sure if this is correct now after we eliminated the relative order. Do we care?
+    rec_status = RecGetRecordOrderAndId(name, &order, NULL);
     if (rec_status == REC_ERR_OKAY) {
       ink_release_assert(order < node_rec_data.num_recs);
       ink_debug_assert(order < node_rec_data.num_recs);