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);