TS-1805: fix conversion when pass value to statVarSet() The result from NodeStatEval()/ClusterStatEval() could have different type compare to the token type of m_node_dest/m_cluster_dest.
So we should do conversion in statVarSet() when they are different. Signed-off-by: Yunkai Zhang <qiushu....@taobao.com> Signed-off-by: Zhao Yongming <ming....@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/e935ebae Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e935ebae Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e935ebae Branch: refs/heads/3.3.x Commit: e935ebaeb6fd9ba75c4103800beef26c19d1c8fe Parents: eabab3e Author: Yunkai Zhang <qiushu....@taobao.com> Authored: Sun Apr 7 20:55:32 2013 +0800 Committer: Zhao Yongming <ming....@gmail.com> Committed: Mon Apr 8 10:50:29 2013 +0800 ---------------------------------------------------------------------- CHANGES | 3 + mgmt/stats/StatProcessor.cc | 3 +- mgmt/stats/StatType.cc | 82 +++++++++++++++++++++++++++----------- mgmt/stats/StatType.h | 6 +- 4 files changed, 67 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e935ebae/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 3ee67b2..11b87e4 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache Traffic Server 3.3.2 + *) [TS-1805] Fix stats ExpressionEval in stats xml. + Author: Yunkai Zhang + *) [TS-1783] Eliminate the wpad.dat configuration option (it's unused). *) [TS-1787] Eliminate old ink_time code (was probably only used by the http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e935ebae/mgmt/stats/StatProcessor.cc ---------------------------------------------------------------------- diff --git a/mgmt/stats/StatProcessor.cc b/mgmt/stats/StatProcessor.cc index 98ce28d..26e8c2a 100644 --- a/mgmt/stats/StatProcessor.cc +++ b/mgmt/stats/StatProcessor.cc @@ -312,11 +312,12 @@ StatProcessor::processStat() RecData ExpressionEval(char *exprString) { + RecDataT result_type; StatObject statObject; char content[BUFSIZ * 10]; XML_extractContent(exprString, content, BUFSIZ * 10); statObject.assignExpr(content); - return statObject.NodeStatEval(false); + return statObject.NodeStatEval(&result_type, false); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e935ebae/mgmt/stats/StatType.cc ---------------------------------------------------------------------- diff --git a/mgmt/stats/StatType.cc b/mgmt/stats/StatType.cc index 7a283cc..efdde92 100644 --- a/mgmt/stats/StatType.cc +++ b/mgmt/stats/StatType.cc @@ -156,10 +156,6 @@ bool StatExprToken::assignTokenType() m_token_type = RECD_FX; } - if (m_token_type == RECD_COUNTER) { - m_token_type = RECD_INT; - } - if (m_token_value_delta) { m_token_value_delta->data_type = m_token_type; } @@ -228,8 +224,10 @@ StatExprToken::precedence() * or larger than max, then the error value is assigned. If no * error value is assigned, either min. or max. is assigned. */ -bool StatExprToken::statVarSet(RecData value) +bool StatExprToken::statVarSet(RecDataT type, RecData value) { + RecData converted_value; + if (StatError) { /* fix this after librecords is done mgmt_log(stderr, @@ -240,14 +238,47 @@ bool StatExprToken::statVarSet(RecData value) return varSetData(m_token_type, m_token_name, err_value); } - if (RecDataCmp(m_token_type, value, m_token_value_min) < 0) { + /* + * do conversion if necessary. + */ + if (m_token_type != type) { + switch (m_token_type) { + case RECD_INT: + case RECD_COUNTER: + if (type == RECD_NULL) + converted_value = value; + else if (type == RECD_INT || type == RECD_COUNTER || type == RECD_FX) + converted_value.rec_int = value.rec_int; + else if (type == RECD_FLOAT || type == RECD_CONST) + converted_value.rec_int = (RecInt)value.rec_float; + else + Fatal("invalid value type:%d\n", m_token_type); + break; + case RECD_FLOAT: + if (type == RECD_NULL) + converted_value = value; + else if (type == RECD_INT || type == RECD_COUNTER || type == RECD_FX) + converted_value.rec_float = (RecFloat)value.rec_int; + else if (type == RECD_FLOAT || type == RECD_CONST) + converted_value.rec_float = value.rec_float; + else + Fatal("invalid value type:%d\n", m_token_type); + break; + default: + Fatal("unsupported token type:%d\n", m_token_type); + } + } else { + converted_value = value; + } + + if (RecDataCmp(m_token_type, converted_value, m_token_value_min) < 0) { value = m_token_value_min; } - else if (RecDataCmp(m_token_type, value, m_token_value_max) > 0) { + else if (RecDataCmp(m_token_type, converted_value, m_token_value_max) > 0) { value = m_token_value_max; } - return varSetData(m_token_type, m_token_name, value); + return varSetData(m_token_type, m_token_name, converted_value); } @@ -632,7 +663,7 @@ StatObject::infix2postfix() * * */ -RecData StatObject::NodeStatEval(bool cluster) +RecData StatObject::NodeStatEval(RecDataT *result_type, bool cluster) { StatExprList stack; StatExprToken *left = NULL; @@ -653,8 +684,10 @@ RecData StatObject::NodeStatEval(bool cluster) } if (src->m_token_type == RECD_CONST) { + *result_type = RECD_CONST; tempValue = src->m_token_value; } else if (src->m_token_value_delta) { + *result_type = src->m_token_type; tempValue = src->m_token_value_delta->diff_value(src->m_token_name); } else if (!cluster) { if (!varDataFromName(src->m_token_type, src->m_token_name, &tempValue)) { @@ -704,6 +737,7 @@ RecData StatObject::NodeStatEval(bool cluster) ink_debug_assert(false); } + *result_type = stack.top()->m_token_type; tempValue = stack.top()->m_token_value; } @@ -718,7 +752,7 @@ RecData StatObject::NodeStatEval(bool cluster) * * */ -RecData StatObject::ClusterStatEval() +RecData StatObject::ClusterStatEval(RecDataT *result_type) { RecData tempValue; @@ -727,11 +761,12 @@ RecData StatObject::ClusterStatEval() // what is this? if ((m_node_dest == NULL) || (m_cluster_dest->m_sum_var == false)) { - return NodeStatEval(true); + return NodeStatEval(result_type, true); } else { if (!overviewGenerator->varClusterDataFromName(m_node_dest->m_token_type, m_node_dest->m_token_name, &tempValue)) { + *result_type = RECD_NULL; RecDataClear(RECD_NULL, &tempValue); } return (tempValue); @@ -986,6 +1021,7 @@ StatObjectList::Eval() { RecData tempValue; RecData result; + RecDataT result_type; ink_hrtime threshold = 0; ink_hrtime delta = 0; short count = 0; @@ -1006,13 +1042,13 @@ StatObjectList::Eval() object->m_current_time = ink_get_hrtime_internal(); if (object->m_node_dest) { - result = object->NodeStatEval(false); - object->m_node_dest->statVarSet(result); + result = object->NodeStatEval(&result_type, false); + object->m_node_dest->statVarSet(result_type, result); } if (object->m_cluster_dest) { - result = object->ClusterStatEval(); - object->m_cluster_dest->statVarSet(result); + result = object->ClusterStatEval(&result_type); + object->m_cluster_dest->statVarSet(result_type, result); } object->m_last_update = object->m_current_time; @@ -1051,13 +1087,13 @@ StatObjectList::Eval() } if (object->m_node_dest) { - result = object->NodeStatEval(false); - object->m_node_dest->statVarSet(result); + result = object->NodeStatEval(&result_type, false); + object->m_node_dest->statVarSet(result_type, result); } if (object->m_cluster_dest) { - result = object->ClusterStatEval(); - object->m_cluster_dest->statVarSet(result); + result = object->ClusterStatEval(&result_type); + object->m_cluster_dest->statVarSet(result_type, result); } object->m_last_update = object->m_current_time; @@ -1083,13 +1119,13 @@ StatObjectList::Eval() if (delta > threshold) { if (object->m_node_dest) { - result = object->NodeStatEval(false); - object->m_node_dest->statVarSet(result); + result = object->NodeStatEval(&result_type, false); + object->m_node_dest->statVarSet(result_type, result); } if (object->m_cluster_dest) { - result = object->ClusterStatEval(); - object->m_cluster_dest->statVarSet(result); + result = object->ClusterStatEval(&result_type); + object->m_cluster_dest->statVarSet(result_type, result); } object->m_last_update = object->m_current_time; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e935ebae/mgmt/stats/StatType.h ---------------------------------------------------------------------- diff --git a/mgmt/stats/StatType.h b/mgmt/stats/StatType.h index 3d56ee3..673e1e7 100644 --- a/mgmt/stats/StatType.h +++ b/mgmt/stats/StatType.h @@ -114,7 +114,7 @@ public: }; void clean(); - bool statVarSet(RecData); + bool statVarSet(RecDataT, RecData); }; @@ -189,8 +189,8 @@ public: void assignExpr(char *); StatExprToken *StatBinaryEval(StatExprToken *, char, StatExprToken *, bool cluster = false); - RecData NodeStatEval(bool cluster); - RecData ClusterStatEval(); + RecData NodeStatEval(RecDataT *result_type, bool cluster); + RecData ClusterStatEval(RecDataT *result_type); void setTokenValue(StatExprToken *, bool cluster = false); private: