summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authornat-goodspeed <nat@lindenlab.com>2022-12-08 13:33:29 -0500
committerGitHub <noreply@github.com>2022-12-08 13:33:29 -0500
commit95f682f1278922c8aa3632194bac9d3755161ae0 (patch)
treee0030a070012d7416dd707500bdbc47d150ffdd3 /indra
parentf064cba4362b6ab183fb16192305338953867f2b (diff)
parent769bf46a3f4df2ee0dc9167d687a89eaf7547daa (diff)
Merge pull request #28 from secondlife/sl-14399
SL-14399: Ditch overflow queue LLViewerAssetStorage::mCoroWaitList.
Diffstat (limited to 'indra')
-rw-r--r--indra/llmessage/llcoproceduremanager.cpp5
-rw-r--r--indra/newview/llviewerassetstorage.cpp55
-rw-r--r--indra/newview/llviewerassetstorage.h4
3 files changed, 15 insertions, 49 deletions
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index be014e7b1e..d310cefd1e 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -47,7 +47,10 @@ static const std::map<std::string, U32> DefaultPoolSizes{
};
static const U32 DEFAULT_POOL_SIZE = 5;
-const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 4096;
+// SL-14399: When we teleport to a brand-new simulator, the coprocedure queue
+// gets absolutely slammed with fetch requests. Make this queue effectively
+// unlimited.
+const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*1024;
//=========================================================================
class LLCoprocedurePool: private boost::noncopyable
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 70065cb5a0..aa9ff012c3 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -134,14 +134,6 @@ LLViewerAssetStorage::~LLViewerAssetStorage()
// This class has dedicated coroutine pool, clean it up, otherwise coroutines will crash later.
LLCoprocedureManager::instance().close(VIEWER_ASSET_STORAGE_CORO_POOL);
}
-
- while (mCoroWaitList.size() > 0)
- {
- CoroWaitList &request = mCoroWaitList.front();
- // Clean up pending downloads, delete request and trigger callbacks
- removeAndCallbackPendingDownloads(request.mId, request.mType, request.mId, request.mType, LL_ERR_NOERR, LLExtStat::NONE);
- mCoroWaitList.pop_front();
- }
}
// virtual
@@ -346,28 +338,6 @@ void LLViewerAssetStorage::storeAssetData(
}
}
-void LLViewerAssetStorage::checkForTimeouts()
-{
- LLAssetStorage::checkForTimeouts();
-
- // Restore requests
- LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
- while (mCoroWaitList.size() > 0
- && manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
- {
- CoroWaitList &request = mCoroWaitList.front();
-
- bool with_http = true;
- bool is_temp = false;
- LLViewerAssetStatsFF::record_enqueue(request.mType, with_http, is_temp);
-
- manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
- boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, request.mRequest, request.mId, request.mType, request.mCallback, request.mUserData));
-
- mCoroWaitList.pop_front();
- }
-}
-
/**
* @brief Allocate and queue an asset fetch request for the viewer
*
@@ -424,21 +394,18 @@ void LLViewerAssetStorage::queueRequestHttp(
// This is the same as the current UDP logic - don't re-request a duplicate.
if (!duplicate)
{
- // Coroutine buffer has fixed size (synchronization buffer, so we have no alternatives), so buffer any request above limit
LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
- if (manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
- {
- bool with_http = true;
- bool is_temp = false;
- LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
-
- manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
- boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
- }
- else
- {
- mCoroWaitList.emplace_back(req, uuid, atype, callback, user_data);
- }
+ bool with_http = true;
+ bool is_temp = false;
+ LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
+ manager->enqueueCoprocedure(
+ VIEWER_ASSET_STORAGE_CORO_POOL,
+ "LLViewerAssetStorage::assetRequestCoro",
+ [this, req, uuid, atype, callback, user_data]
+ (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t&, const LLUUID&)
+ {
+ assetRequestCoro(req, uuid, atype, callback, user_data);
+ });
}
}
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index 0965a17ce1..c3719d0918 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -65,8 +65,6 @@ public:
bool user_waiting=FALSE,
F64Seconds timeout=LL_ASSET_STORAGE_TIMEOUT) override;
- void checkForTimeouts() override;
-
protected:
void _queueDataRequest(const LLUUID& uuid,
LLAssetType::EType type,
@@ -118,8 +116,6 @@ protected:
LLGetAssetCallback mCallback;
void *mUserData;
};
- typedef std::list<CoroWaitList> wait_list_t;
- wait_list_t mCoroWaitList;
std::string mViewerAssetUrl;
S32 mCountRequests;