summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/lltexturefetch.cpp4
-rw-r--r--indra/newview/llviewerassetstats.cpp60
-rw-r--r--indra/newview/tests/llviewerassetstats_test.cpp228
3 files changed, 271 insertions, 21 deletions
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 2be3ba3280..f5e2e35e1e 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2659,7 +2659,6 @@ void LLTextureFetch::commandSetRegion(const LLUUID & region_id)
TFReqSetRegion * req = new TFReqSetRegion(region_id);
cmdEnqueue(req);
- LL_INFOS("Texture") << "COMMANDING SET REGION" << LL_ENDL;
}
void LLTextureFetch::commandSendMetrics(const std::string & caps_url,
@@ -2821,7 +2820,6 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
LLViewerAssetStatsFF::merge_stats(main_stats, thread1_stats);
// *TODO: Consider putting a report size limiter here.
- LL_INFOS("Texture") << "PROCESSING SENDMETRICS REQUEST" << LL_ENDL;
if (! mCapsURL.empty())
{
LLCurlRequest::headers_t headers;
@@ -2839,7 +2837,7 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
// In QA mode, Metrics submode, log the result for ease of testing
if (fetcher->isQAMode())
{
- LL_INFOS("QAViewerMetrics") << thread1_stats << LL_ENDL;
+ LL_INFOS("Textures") << thread1_stats << LL_ENDL;
}
gViewerAssetStatsThread1->reset();
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 3d7f9f932f..502a3aa340 100644
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -263,19 +263,19 @@ LLViewerAssetStats::asLLSD()
slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
- slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin()));
- slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax()));
- slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean()));
+ slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
+ slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
+ slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
}
- reg_stat["duration"] = LLSD::Integer(stats.mTotalTime / 1000000);
+ reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);
regions[it->first.asString()] = reg_stat;
}
LLSD ret = LLSD::emptyMap();
ret["regions"] = regions;
- ret["duration"] = LLSD::Integer((now - mResetTimestamp) / 1000000);
+ ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6);
return ret;
}
@@ -290,12 +290,12 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst)
static const int MOP_MEAN_REAL(3); // Requires a 'mMergeOpArg' to weight the input terms
static const LLSD::String regions_key("regions");
+ static const LLSD::String resp_count_key("resp_count");
static const struct
{
LLSD::String mName;
int mMergeOp;
- LLSD::String mMergeOpArg;
}
key_list[] =
{
@@ -305,12 +305,12 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst)
// is modified or the weight will be wrong. Key list is
// defined in asLLSD() and must track it.
- { "resp_mean", MOP_MEAN_REAL, "resp_count" },
- { "enqueued", MOP_ADD_INT, "" },
- { "dequeued", MOP_ADD_INT, "" },
- { "resp_count", MOP_ADD_INT, "" },
- { "resp_min", MOP_MIN_REAL, "" },
- { "resp_max", MOP_MAX_REAL, "" }
+ { "resp_mean", MOP_MEAN_REAL },
+ { "enqueued", MOP_ADD_INT },
+ { "dequeued", MOP_ADD_INT },
+ { "resp_min", MOP_MIN_REAL },
+ { "resp_max", MOP_MAX_REAL },
+ { resp_count_key, MOP_ADD_INT } // Keep last
};
// Trivial checks
@@ -368,6 +368,10 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst)
LLSD & bin_dst(reg_dst[it_sets->first]);
const LLSD & bin_src(reg_src[it_sets->first]);
+ // The "resp_count" value is needed repeatedly in operations.
+ const LLSD::Integer bin_src_count(bin_src[resp_count_key].asInteger());
+ const LLSD::Integer bin_dst_count(bin_dst[resp_count_key].asInteger());
+
for (int key_index(0); key_index < LL_ARRAY_SIZE(key_list); ++key_index)
{
const LLSD::String & key_name(key_list[key_index].mName);
@@ -395,25 +399,45 @@ LLViewerAssetStats::mergeRegionsLLSD(const LLSD & src, LLSD & dst)
case MOP_ADD_INT:
// Simple counts, just add
dst_value = dst_value.asInteger() + src_value.asInteger();
-
break;
case MOP_MIN_REAL:
// Minimum
- dst_value = llmin(dst_value.asReal(), src_value.asReal());
+ if (bin_src_count)
+ {
+ // If src has non-zero count, it's min is meaningful
+ if (bin_dst_count)
+ {
+ dst_value = llmin(dst_value.asReal(), src_value.asReal());
+ }
+ else
+ {
+ dst_value = src_value;
+ }
+ }
break;
case MOP_MAX_REAL:
// Maximum
- dst_value = llmax(dst_value.asReal(), src_value.asReal());
+ if (bin_src_count)
+ {
+ // If src has non-zero count, it's max is meaningful
+ if (bin_dst_count)
+ {
+ dst_value = llmax(dst_value.asReal(), src_value.asReal());
+ }
+ else
+ {
+ dst_value = src_value;
+ }
+ }
break;
case MOP_MEAN_REAL:
{
// Mean
- const LLSD::String & weight_key(key_list[key_index].mMergeOpArg);
- F64 src_weight(bin_src[weight_key].asReal());
- F64 dst_weight(bin_dst[weight_key].asReal());
+ F64 src_weight(bin_src_count);
+ F64 dst_weight(bin_dst_count);
F64 tot_weight(src_weight + dst_weight);
if (tot_weight >= F64(0.5))
{
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
index a44712e8ad..8bedd2c860 100644
--- a/indra/newview/tests/llviewerassetstats_test.cpp
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
@@ -518,4 +518,232 @@ namespace tut
ensure_approximately_equals("weighted mean of means", dst["regions"][reg1_name]["get_other"]["resp_mean"].asReal(), 2.7901295, 20);
}
}
+
+ // Maximum merges are interesting when one side contributes nothing
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<10>()
+ {
+ LLSD::String reg1_name = region1.asString();
+ LLSD::String reg2_name = region2.asString();
+
+ LLSD reg1_stats = LLSD::emptyMap();
+ LLSD reg2_stats = LLSD::emptyMap();
+
+ LLSD & tmp_other1 = reg1_stats["get_other"];
+ tmp_other1["enqueued"] = 4;
+ tmp_other1["dequeued"] = 4;
+ tmp_other1["resp_count"] = 7;
+ tmp_other1["resp_max"] = F64(-23.2892);
+ tmp_other1["resp_min"] = F64(-123.2892);
+ tmp_other1["resp_mean"] = F64(-58.28298);
+
+ LLSD & tmp_other2 = reg2_stats["get_other"];
+ tmp_other2["enqueued"] = 8;
+ tmp_other2["dequeued"] = 7;
+ tmp_other2["resp_count"] = 0;
+ tmp_other2["resp_max"] = F64(0);
+ tmp_other2["resp_min"] = F64(0);
+ tmp_other2["resp_mean"] = F64(0);
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg1_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg2_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("dst maximum with count 0 does not contribute to merged maximum",
+ dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20);
+ }
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg2_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg1_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("src maximum with count 0 does not contribute to merged maximum",
+ dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20);
+ }
+ }
+
+ // Minimum merges are interesting when one side contributes nothing
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<11>()
+ {
+ LLSD::String reg1_name = region1.asString();
+ LLSD::String reg2_name = region2.asString();
+
+ LLSD reg1_stats = LLSD::emptyMap();
+ LLSD reg2_stats = LLSD::emptyMap();
+
+ LLSD & tmp_other1 = reg1_stats["get_other"];
+ tmp_other1["enqueued"] = 4;
+ tmp_other1["dequeued"] = 4;
+ tmp_other1["resp_count"] = 7;
+ tmp_other1["resp_max"] = F64(123.2892);
+ tmp_other1["resp_min"] = F64(23.2892);
+ tmp_other1["resp_mean"] = F64(58.28298);
+
+ LLSD & tmp_other2 = reg2_stats["get_other"];
+ tmp_other2["enqueued"] = 8;
+ tmp_other2["dequeued"] = 7;
+ tmp_other2["resp_count"] = 0;
+ tmp_other2["resp_max"] = F64(0);
+ tmp_other2["resp_min"] = F64(0);
+ tmp_other2["resp_mean"] = F64(0);
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg1_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg2_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("dst minimum with count 0 does not contribute to merged minimum",
+ dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20);
+ }
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg2_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg1_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("src minimum with count 0 does not contribute to merged minimum",
+ dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20);
+ }
+ }
+
+ // resp_count missing is taken as '0' for maximum calculation
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<12>()
+ {
+ LLSD::String reg1_name = region1.asString();
+ LLSD::String reg2_name = region2.asString();
+
+ LLSD reg1_stats = LLSD::emptyMap();
+ LLSD reg2_stats = LLSD::emptyMap();
+
+ LLSD & tmp_other1 = reg1_stats["get_other"];
+ tmp_other1["enqueued"] = 4;
+ tmp_other1["dequeued"] = 4;
+ tmp_other1["resp_count"] = 7;
+ tmp_other1["resp_max"] = F64(-23.2892);
+ tmp_other1["resp_min"] = F64(-123.2892);
+ tmp_other1["resp_mean"] = F64(-58.28298);
+
+ LLSD & tmp_other2 = reg2_stats["get_other"];
+ tmp_other2["enqueued"] = 8;
+ tmp_other2["dequeued"] = 7;
+ // tmp_other2["resp_count"] = 0;
+ tmp_other2["resp_max"] = F64(0);
+ tmp_other2["resp_min"] = F64(0);
+ tmp_other2["resp_mean"] = F64(0);
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg1_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg2_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("dst maximum with undefined count does not contribute to merged maximum",
+ dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20);
+ }
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg2_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg1_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("src maximum with undefined count does not contribute to merged maximum",
+ dst["regions"][reg1_name]["get_other"]["resp_max"].asReal(), F64(-23.2892), 20);
+ }
+ }
+
+ // resp_count unspecified is taken as 0 for minimum merges
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<13>()
+ {
+ LLSD::String reg1_name = region1.asString();
+ LLSD::String reg2_name = region2.asString();
+
+ LLSD reg1_stats = LLSD::emptyMap();
+ LLSD reg2_stats = LLSD::emptyMap();
+
+ LLSD & tmp_other1 = reg1_stats["get_other"];
+ tmp_other1["enqueued"] = 4;
+ tmp_other1["dequeued"] = 4;
+ tmp_other1["resp_count"] = 7;
+ tmp_other1["resp_max"] = F64(123.2892);
+ tmp_other1["resp_min"] = F64(23.2892);
+ tmp_other1["resp_mean"] = F64(58.28298);
+
+ LLSD & tmp_other2 = reg2_stats["get_other"];
+ tmp_other2["enqueued"] = 8;
+ tmp_other2["dequeued"] = 7;
+ // tmp_other2["resp_count"] = 0;
+ tmp_other2["resp_max"] = F64(0);
+ tmp_other2["resp_min"] = F64(0);
+ tmp_other2["resp_mean"] = F64(0);
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg1_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg2_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("dst minimum with undefined count does not contribute to merged minimum",
+ dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20);
+ }
+
+ {
+ LLSD src = LLSD::emptyMap();
+ LLSD dst = LLSD::emptyMap();
+
+ src["regions"][reg1_name] = reg2_stats;
+ src["duration"] = 24;
+ dst["regions"][reg1_name] = reg1_stats;
+ dst["duration"] = 36;
+
+ LLViewerAssetStats::mergeRegionsLLSD(src, dst);
+
+ ensure_approximately_equals("src minimum with undefined count does not contribute to merged minimum",
+ dst["regions"][reg1_name]["get_other"]["resp_min"].asReal(), F64(23.2892), 20);
+ }
+ }
}