SL-409 - fixed some longstanding errors with viewer asset metrics with wrong values being used for sample counts

master
Brad Payne (Vir Linden) 2017-03-01 11:19:31 -05:00
parent 578e927641
commit d4d7c39dcd
2 changed files with 113 additions and 194 deletions

View File

@ -115,47 +115,65 @@ namespace LLViewerAssetStatsFF
case LLAssetType::AT_GESTURE:
ret = with_http ? EVACGestureHTTPGet : EVACGestureUDPGet;
break;
default:
ret = EVACOtherGet;
break;
}
return ret;
}
static LLTrace::CountStatHandle<> sEnqueueAssetRequestsTempTextureHTTP ("enqueuedassetrequeststemptexturehttp",
"Number of temporary texture asset http requests enqueued"),
sEnqueueAssetRequestsTempTextureUDP ("enqueuedassetrequeststemptextureudp",
"Number of temporary texture asset udp requests enqueued"),
sEnqueueAssetRequestsNonTempTextureHTTP("enqueuedassetrequestsnontemptexturehttp",
"Number of texture asset http requests enqueued"),
sEnqueueAssetRequestsNonTempTextureUDP ("enqueuedassetrequestsnontemptextureudp",
"Number of texture asset udp requests enqueued"),
sEnqueuedAssetRequestsWearableHTTP ("enqueuedassetrequestswearablehttp",
"Number of wearable asset http requests enqueued"),
sEnqueuedAssetRequestsWearableUdp ("enqueuedassetrequestswearableudp",
"Number of wearable asset udp requests enqueued"),
sEnqueuedAssetRequestsSoundHTTP ("enqueuedassetrequestssoundhttp",
"Number of sound asset http requests enqueued"),
sEnqueuedAssetRequestsSoundUdp ("enqueuedassetrequestssoundudp",
"Number of sound asset udp requests enqueued"),
sEnqueuedAssetRequestsGestureHTTP ("enqueuedassetrequestsgesturehttp",
"Number of gesture asset http requests enqueued"),
sEnqueuedAssetRequestsGestureUdp ("enqueuedassetrequestsgestureudp",
"Number of gesture asset udp requests enqueued"),
sEnqueuedAssetRequestsOther ("enqueuedassetrequestsother",
"Number of other asset requests enqueued");
/* Note that this is very verbose, in a way that's actually somewhat
* risky - when adding or removing a bucket, all these arrays have to
* be updated in parallel (although the risk is somewhat illusory,
* because none of the names actually affect the final XML output, so
* you just have to have the right number of distinct names). Why
* can't we just have an array of stat objects indexed by the bucket
* index? Because CountStatHandle doesn't have a default constructor,
* and is built on a big pile of template code that assumes the name
* parameter in the constructor is useful and needed and mandatory. We
* could replace these stat handles with something more accommodating
* like the LLViewerAssetStats::StatsAccumulator class, but it's hard
* to justify given how rarely this code gets changed. For now, caveat
* developer. */
static LLTrace::CountStatHandle<> sEnqueueAssetRequestsTempTextureHTTP ("enqueuedassetrequeststemptexturehttp",
"Number of temporary texture asset http requests enqueued"),
sEnqueueAssetRequestsTempTextureUDP ("enqueuedassetrequeststemptextureudp",
"Number of temporary texture asset udp requests enqueued"),
sEnqueueAssetRequestsNonTempTextureHTTP("enqueuedassetrequestsnontemptexturehttp",
"Number of texture asset http requests enqueued"),
sEnqueueAssetRequestsNonTempTextureUDP ("enqueuedassetrequestsnontemptextureudp",
"Number of texture asset udp requests enqueued"),
sEnqueuedAssetRequestsWearableHTTP ("enqueuedassetrequestswearablehttp",
"Number of wearable asset http requests enqueued"),
sEnqueuedAssetRequestsWearableUdp ("enqueuedassetrequestswearableudp",
"Number of wearable asset udp requests enqueued"),
sEnqueuedAssetRequestsSoundHTTP ("enqueuedassetrequestssoundhttp",
"Number of sound asset http requests enqueued"),
sEnqueuedAssetRequestsSoundUdp ("enqueuedassetrequestssoundudp",
"Number of sosund asset udp requests enqueued"),
sEnqueuedAssetRequestsGestureHTTP ("enqueuedassetrequestsgesturehttp",
"Number of gesture asset http requests enqueued"),
sEnqueuedAssetRequestsGestureUdp ("enqueuedassetrequestsgestureudp",
"Number of gesture asset udp requests enqueued"),
sEnqueuedAssetRequestsOther ("enqueuedassetrequestsother",
"Number of other asset requests enqueued");
//static LLTrace::CountStatHandle<> sJunkEnqueued[EVACCount];
static LLTrace::CountStatHandle<>* sEnqueued[EVACCount] = {
&sEnqueueAssetRequestsTempTextureHTTP,
&sEnqueueAssetRequestsTempTextureUDP,
&sEnqueueAssetRequestsNonTempTextureHTTP,
&sEnqueueAssetRequestsNonTempTextureUDP,
&sEnqueuedAssetRequestsWearableHTTP,
&sEnqueuedAssetRequestsWearableUdp,
&sEnqueuedAssetRequestsSoundHTTP,
&sEnqueuedAssetRequestsSoundUdp,
&sEnqueuedAssetRequestsGestureHTTP,
&sEnqueuedAssetRequestsGestureUdp,
&sEnqueuedAssetRequestsOther
};
static LLTrace::CountStatHandle<>* sEnqueued[EVACCount] = {
&sEnqueueAssetRequestsTempTextureHTTP,
&sEnqueueAssetRequestsTempTextureUDP,
&sEnqueueAssetRequestsNonTempTextureHTTP,
&sEnqueueAssetRequestsNonTempTextureUDP,
&sEnqueuedAssetRequestsWearableHTTP,
&sEnqueuedAssetRequestsWearableUdp,
&sEnqueuedAssetRequestsSoundHTTP,
&sEnqueuedAssetRequestsSoundUdp,
&sEnqueuedAssetRequestsGestureHTTP,
&sEnqueuedAssetRequestsGestureUdp,
&sEnqueuedAssetRequestsOther
};
static LLTrace::CountStatHandle<> sDequeueAssetRequestsTempTextureHTTP ("dequeuedassetrequeststemptexturehttp",
"Number of temporary texture asset http requests dequeued"),
sDequeueAssetRequestsTempTextureUDP ("dequeuedassetrequeststemptextureudp",
@ -322,6 +340,25 @@ void LLViewerAssetStats::setRegion(region_handle_t region_handle)
mRegionHandle = region_handle;
}
template <typename T>
void LLViewerAssetStats::getStat(LLTrace::Recording& rec, T& req, LLViewerAssetStatsFF::EViewerAssetCategories cat, bool compact_output)
{
using namespace LLViewerAssetStatsFF;
if (!compact_output
|| rec.getSampleCount(*sEnqueued[cat])
|| rec.getSampleCount(*sDequeued[cat])
|| rec.getSampleCount(*sResponse[cat]))
{
req .enqueued(rec.getSampleCount(*sEnqueued[cat]))
.dequeued(rec.getSampleCount(*sDequeued[cat]))
.resp_count(rec.getSampleCount(*sResponse[cat]))
.resp_min(rec.getMin(*sResponse[cat]).value())
.resp_max(rec.getMax(*sResponse[cat]).value())
.resp_mean(rec.getMean(*sResponse[cat]).value());
}
}
void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
{
using namespace LLViewerAssetStatsFF;
@ -334,147 +371,19 @@ void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
{
RegionStats& r = stats.regions.add();
LLTrace::Recording& rec = it->second;
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureTempHTTPGet])
|| rec.getSum(*sDequeued[EVACTextureTempHTTPGet])
|| rec.getSum(*sResponse[EVACTextureTempHTTPGet]).value())
{
r.get_texture_temp_http .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureTempHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureTempHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureTempHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureTempHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureTempHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureTempHTTPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureTempUDPGet])
|| rec.getSum(*sDequeued[EVACTextureTempUDPGet])
|| rec.getSum(*sResponse[EVACTextureTempUDPGet]).value())
{
r.get_texture_temp_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureTempUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureTempUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureTempUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureTempUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureTempUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureTempUDPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureNonTempHTTPGet])
|| rec.getSum(*sDequeued[EVACTextureNonTempHTTPGet])
|| rec.getSum(*sResponse[EVACTextureNonTempHTTPGet]).value())
{
r.get_texture_non_temp_http .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureNonTempHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureNonTempHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureNonTempHTTPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet])
|| rec.getSum(*sDequeued[EVACTextureNonTempUDPGet])
|| rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value())
{
r.get_texture_non_temp_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureNonTempUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureNonTempUDPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACWearableHTTPGet])
|| rec.getSum(*sDequeued[EVACWearableHTTPGet])
|| rec.getSum(*sResponse[EVACWearableHTTPGet]).value())
{
r.get_wearable_http .enqueued((S32)rec.getSum(*sEnqueued[EVACWearableHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACWearableHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACWearableHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACWearableHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACWearableHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACWearableHTTPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACWearableUDPGet])
|| rec.getSum(*sDequeued[EVACWearableUDPGet])
|| rec.getSum(*sResponse[EVACWearableUDPGet]).value())
{
r.get_wearable_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACWearableUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACWearableUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACWearableUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACWearableUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACWearableUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACWearableUDPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACSoundHTTPGet])
|| rec.getSum(*sDequeued[EVACSoundHTTPGet])
|| rec.getSum(*sResponse[EVACSoundHTTPGet]).value())
{
r.get_sound_http.enqueued((S32)rec.getSum(*sEnqueued[EVACSoundHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACSoundHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACSoundHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACSoundHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACSoundHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACSoundHTTPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACSoundUDPGet])
|| rec.getSum(*sDequeued[EVACSoundUDPGet])
|| rec.getSum(*sResponse[EVACSoundUDPGet]).value())
{
r.get_sound_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACSoundUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACSoundUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACSoundUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACSoundUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACSoundUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACSoundUDPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACGestureHTTPGet])
|| rec.getSum(*sDequeued[EVACGestureHTTPGet])
|| rec.getSum(*sResponse[EVACGestureHTTPGet]).value())
{
r.get_gesture_http .enqueued((S32)rec.getSum(*sEnqueued[EVACGestureHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACGestureHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACGestureHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACGestureHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACGestureHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACGestureHTTPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACGestureUDPGet])
|| rec.getSum(*sDequeued[EVACGestureUDPGet])
|| rec.getSum(*sResponse[EVACGestureUDPGet]).value())
{
r.get_gesture_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACGestureUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACGestureUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACGestureUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACGestureUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACGestureUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACGestureUDPGet]).value());
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACOtherGet])
|| rec.getSum(*sDequeued[EVACOtherGet])
|| rec.getSum(*sResponse[EVACOtherGet]).value())
{
r.get_other .enqueued((S32)rec.getSum(*sEnqueued[EVACOtherGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACOtherGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACOtherGet]).value())
.resp_min(rec.getMin(*sResponse[EVACOtherGet]).value())
.resp_max(rec.getMax(*sResponse[EVACOtherGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACOtherGet]).value());
}
getStat(rec, r.get_texture_temp_http, EVACTextureTempHTTPGet, compact_output);
getStat(rec, r.get_texture_temp_udp, EVACTextureTempUDPGet, compact_output);
getStat(rec, r.get_texture_non_temp_http, EVACTextureNonTempHTTPGet, compact_output);
getStat(rec, r.get_texture_non_temp_udp, EVACTextureNonTempUDPGet, compact_output);
getStat(rec, r.get_wearable_http, EVACWearableHTTPGet, compact_output);
getStat(rec, r.get_wearable_udp, EVACWearableUDPGet, compact_output);
getStat(rec, r.get_sound_http, EVACSoundHTTPGet, compact_output);
getStat(rec, r.get_sound_udp, EVACSoundUDPGet, compact_output);
getStat(rec, r.get_gesture_http, EVACGestureHTTPGet, compact_output);
getStat(rec, r.get_gesture_udp, EVACGestureUDPGet, compact_output);
getStat(rec, r.get_other, EVACOtherGet, compact_output);
S32 fps = (S32)rec.getLastValue(LLStatViewer::FPS_SAMPLE);
if (!compact_output || fps != 0)
{

View File

@ -39,6 +39,26 @@
#include "lltrace.h"
#include "llinitparam.h"
namespace LLViewerAssetStatsFF
{
enum EViewerAssetCategories
{
EVACTextureTempHTTPGet, //< Texture GETs - temp/baked, HTTP
EVACTextureTempUDPGet, //< Texture GETs - temp/baked, UDP
EVACTextureNonTempHTTPGet, //< Texture GETs - perm, HTTP
EVACTextureNonTempUDPGet, //< Texture GETs - perm, UDP
EVACWearableHTTPGet, //< Wearable GETs HTTP
EVACWearableUDPGet, //< Wearable GETs UDP
EVACSoundHTTPGet, //< Sound GETs HTTP
EVACSoundUDPGet, //< Sound GETs UDP
EVACGestureHTTPGet, //< Gesture GETs HTTP
EVACGestureUDPGet, //< Gesture GETs UDP
EVACOtherGet, //< Other GETs
EVACCount // Must be last
};
}
/**
* @class LLViewerAssetStats
* @brief Records performance aspects of asset access operations.
@ -74,6 +94,7 @@
* LLViewerAssetStatsFF is provided for conditional test-and-call
* operations.
*/
class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats>
{
public:
@ -94,8 +115,8 @@ public:
struct AssetRequestType : public LLInitParam::Block<AssetRequestType>
{
Mandatory<S32> enqueued,
dequeued,
resp_count;
dequeued,
resp_count;
Mandatory<F64> resp_min,
resp_max,
resp_mean;
@ -168,6 +189,11 @@ public:
// Retrieve current metrics for all visited regions (NULL region UUID/handle excluded)
// Uses AssetStats structure seen above
void getStats(AssetStats& stats, bool compact_output);
// Retrieve a single asset request type (taken from a single region)
template <typename T>
void getStat(LLTrace::Recording& rec, T& req, LLViewerAssetStatsFF::EViewerAssetCategories cat, bool compact_output);
LLSD asLLSD(bool compact_output);
protected:
@ -208,22 +234,6 @@ extern LLViewerAssetStats * gViewerAssetStats;
namespace LLViewerAssetStatsFF
{
enum EViewerAssetCategories
{
EVACTextureTempHTTPGet, //< Texture GETs - temp/baked, HTTP
EVACTextureTempUDPGet, //< Texture GETs - temp/baked, UDP
EVACTextureNonTempHTTPGet, //< Texture GETs - perm, HTTP
EVACTextureNonTempUDPGet, //< Texture GETs - perm, UDP
EVACWearableHTTPGet, //< Wearable GETs HTTP
EVACWearableUDPGet, //< Wearable GETs UDP
EVACSoundHTTPGet, //< Sound GETs HTTP
EVACSoundUDPGet, //< Sound GETs UDP
EVACGestureHTTPGet, //< Gesture GETs HTTP
EVACGestureUDPGet, //< Gesture GETs UDP
EVACOtherGet, //< Other GETs
EVACCount // Must be last
};
/**
* @brief Allocation and deallocation of globals.