Skip to content
Snippets Groups Projects
Commit d4d7c39d authored by Brad Payne (Vir Linden)'s avatar Brad Payne (Vir Linden)
Browse files

SL-409 - fixed some longstanding errors with viewer asset metrics with wrong...

SL-409 - fixed some longstanding errors with viewer asset metrics with wrong values being used for sample counts
parent 578e9276
Branches
Tags
No related merge requests found
...@@ -115,10 +115,27 @@ namespace LLViewerAssetStatsFF ...@@ -115,10 +115,27 @@ namespace LLViewerAssetStatsFF
case LLAssetType::AT_GESTURE: case LLAssetType::AT_GESTURE:
ret = with_http ? EVACGestureHTTPGet : EVACGestureUDPGet; ret = with_http ? EVACGestureHTTPGet : EVACGestureUDPGet;
break; break;
default:
ret = EVACOtherGet;
break;
} }
return ret; return ret;
} }
/* 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", static LLTrace::CountStatHandle<> sEnqueueAssetRequestsTempTextureHTTP ("enqueuedassetrequeststemptexturehttp",
"Number of temporary texture asset http requests enqueued"), "Number of temporary texture asset http requests enqueued"),
sEnqueueAssetRequestsTempTextureUDP ("enqueuedassetrequeststemptextureudp", sEnqueueAssetRequestsTempTextureUDP ("enqueuedassetrequeststemptextureudp",
...@@ -134,7 +151,7 @@ namespace LLViewerAssetStatsFF ...@@ -134,7 +151,7 @@ namespace LLViewerAssetStatsFF
sEnqueuedAssetRequestsSoundHTTP ("enqueuedassetrequestssoundhttp", sEnqueuedAssetRequestsSoundHTTP ("enqueuedassetrequestssoundhttp",
"Number of sound asset http requests enqueued"), "Number of sound asset http requests enqueued"),
sEnqueuedAssetRequestsSoundUdp ("enqueuedassetrequestssoundudp", sEnqueuedAssetRequestsSoundUdp ("enqueuedassetrequestssoundudp",
"Number of sound asset udp requests enqueued"), "Number of sosund asset udp requests enqueued"),
sEnqueuedAssetRequestsGestureHTTP ("enqueuedassetrequestsgesturehttp", sEnqueuedAssetRequestsGestureHTTP ("enqueuedassetrequestsgesturehttp",
"Number of gesture asset http requests enqueued"), "Number of gesture asset http requests enqueued"),
sEnqueuedAssetRequestsGestureUdp ("enqueuedassetrequestsgestureudp", sEnqueuedAssetRequestsGestureUdp ("enqueuedassetrequestsgestureudp",
...@@ -142,6 +159,7 @@ namespace LLViewerAssetStatsFF ...@@ -142,6 +159,7 @@ namespace LLViewerAssetStatsFF
sEnqueuedAssetRequestsOther ("enqueuedassetrequestsother", sEnqueuedAssetRequestsOther ("enqueuedassetrequestsother",
"Number of other asset requests enqueued"); "Number of other asset requests enqueued");
//static LLTrace::CountStatHandle<> sJunkEnqueued[EVACCount];
static LLTrace::CountStatHandle<>* sEnqueued[EVACCount] = { static LLTrace::CountStatHandle<>* sEnqueued[EVACCount] = {
&sEnqueueAssetRequestsTempTextureHTTP, &sEnqueueAssetRequestsTempTextureHTTP,
&sEnqueueAssetRequestsTempTextureUDP, &sEnqueueAssetRequestsTempTextureUDP,
...@@ -322,6 +340,25 @@ void LLViewerAssetStats::setRegion(region_handle_t region_handle) ...@@ -322,6 +340,25 @@ void LLViewerAssetStats::setRegion(region_handle_t region_handle)
mRegionHandle = 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) void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
{ {
using namespace LLViewerAssetStatsFF; using namespace LLViewerAssetStatsFF;
...@@ -334,146 +371,18 @@ void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output) ...@@ -334,146 +371,18 @@ void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
{ {
RegionStats& r = stats.regions.add(); RegionStats& r = stats.regions.add();
LLTrace::Recording& rec = it->second; 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 getStat(rec, r.get_texture_temp_http, EVACTextureTempHTTPGet, compact_output);
|| rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet]) getStat(rec, r.get_texture_temp_udp, EVACTextureTempUDPGet, compact_output);
|| rec.getSum(*sDequeued[EVACTextureNonTempUDPGet]) getStat(rec, r.get_texture_non_temp_http, EVACTextureNonTempHTTPGet, compact_output);
|| rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value()) getStat(rec, r.get_texture_non_temp_udp, EVACTextureNonTempUDPGet, compact_output);
{ getStat(rec, r.get_wearable_http, EVACWearableHTTPGet, compact_output);
r.get_texture_non_temp_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet])) getStat(rec, r.get_wearable_udp, EVACWearableUDPGet, compact_output);
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureNonTempUDPGet])) getStat(rec, r.get_sound_http, EVACSoundHTTPGet, compact_output);
.resp_count((S32)rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value()) getStat(rec, r.get_sound_udp, EVACSoundUDPGet, compact_output);
.resp_min(rec.getMin(*sResponse[EVACTextureNonTempUDPGet]).value()) getStat(rec, r.get_gesture_http, EVACGestureHTTPGet, compact_output);
.resp_max(rec.getMax(*sResponse[EVACTextureNonTempUDPGet]).value()) getStat(rec, r.get_gesture_udp, EVACGestureUDPGet, compact_output);
.resp_mean(rec.getMean(*sResponse[EVACTextureNonTempUDPGet]).value()); getStat(rec, r.get_other, EVACOtherGet, compact_output);
}
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());
}
S32 fps = (S32)rec.getLastValue(LLStatViewer::FPS_SAMPLE); S32 fps = (S32)rec.getLastValue(LLStatViewer::FPS_SAMPLE);
if (!compact_output || fps != 0) if (!compact_output || fps != 0)
......
...@@ -39,6 +39,26 @@ ...@@ -39,6 +39,26 @@
#include "lltrace.h" #include "lltrace.h"
#include "llinitparam.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 * @class LLViewerAssetStats
* @brief Records performance aspects of asset access operations. * @brief Records performance aspects of asset access operations.
...@@ -74,6 +94,7 @@ ...@@ -74,6 +94,7 @@
* LLViewerAssetStatsFF is provided for conditional test-and-call * LLViewerAssetStatsFF is provided for conditional test-and-call
* operations. * operations.
*/ */
class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats> class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats>
{ {
public: public:
...@@ -168,6 +189,11 @@ class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats> ...@@ -168,6 +189,11 @@ class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats>
// Retrieve current metrics for all visited regions (NULL region UUID/handle excluded) // Retrieve current metrics for all visited regions (NULL region UUID/handle excluded)
// Uses AssetStats structure seen above // Uses AssetStats structure seen above
void getStats(AssetStats& stats, bool compact_output); 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); LLSD asLLSD(bool compact_output);
protected: protected:
...@@ -208,22 +234,6 @@ extern LLViewerAssetStats * gViewerAssetStats; ...@@ -208,22 +234,6 @@ extern LLViewerAssetStats * gViewerAssetStats;
namespace LLViewerAssetStatsFF 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. * @brief Allocation and deallocation of globals.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment