Bug 1382555 - Add more diagnostic asserts to nsHtttpConnectionMgr. r=mcmanus

This commit is contained in:
Dragana Damjanovic dd.mozilla@gmail.com 2017-07-24 16:24:33 +02:00
Родитель 2a757d9ae7
Коммит bfaf919c95
2 изменённых файлов: 42 добавлений и 3 удалений

Просмотреть файл

@ -789,8 +789,9 @@ nsHttpConnectionMgr::UpdateCoalescingForNewConn(nsHttpConnection *newConn,
MOZ_ASSERT(OnSocketThread(), "not on socket thread"); MOZ_ASSERT(OnSocketThread(), "not on socket thread");
MOZ_ASSERT(newConn); MOZ_ASSERT(newConn);
MOZ_ASSERT(newConn->ConnectionInfo()); MOZ_ASSERT(newConn->ConnectionInfo());
MOZ_ASSERT(ent); MOZ_DIAGNOSTIC_ASSERT(ent);
MOZ_ASSERT(mCT.GetWeak(newConn->ConnectionInfo()->HashKey()) == ent); MOZ_ASSERT(mCT.GetWeak(newConn->ConnectionInfo()->HashKey()) == ent);
CheckConnEntryMustBeInmCT(ent->mConnInfo);
nsHttpConnection *existingConn = FindCoalescableConnection(ent, true); nsHttpConnection *existingConn = FindCoalescableConnection(ent, true);
if (existingConn) { if (existingConn) {
@ -1253,6 +1254,7 @@ nsHttpConnectionMgr::AtActiveConnectionLimit(nsConnectionEntry *ent, uint32_t ca
void void
nsHttpConnectionMgr::ClosePersistentConnections(nsConnectionEntry *ent) nsHttpConnectionMgr::ClosePersistentConnections(nsConnectionEntry *ent)
{ {
CheckConnEntryMustBeInmCT(ent->mConnInfo);
LOG(("nsHttpConnectionMgr::ClosePersistentConnections [ci=%s]\n", LOG(("nsHttpConnectionMgr::ClosePersistentConnections [ci=%s]\n",
ent->mConnInfo->HashKey().get())); ent->mConnInfo->HashKey().get()));
while (ent->mIdleConns.Length()) { while (ent->mIdleConns.Length()) {
@ -1661,6 +1663,7 @@ nsHttpConnectionMgr::DispatchTransaction(nsConnectionEntry *ent,
nsHttpTransaction *trans, nsHttpTransaction *trans,
nsHttpConnection *conn) nsHttpConnection *conn)
{ {
CheckConnEntryMustBeInmCT(ent->mConnInfo);
uint32_t caps = trans->Caps(); uint32_t caps = trans->Caps();
int32_t priority = trans->Priority(); int32_t priority = trans->Priority();
nsresult rv; nsresult rv;
@ -1756,6 +1759,7 @@ nsHttpConnectionMgr::DispatchAbstractTransaction(nsConnectionEntry *ent,
int32_t priority) int32_t priority)
{ {
MOZ_DIAGNOSTIC_ASSERT(ent); MOZ_DIAGNOSTIC_ASSERT(ent);
CheckConnEntryMustBeInmCT(ent->mConnInfo);
nsresult rv; nsresult rv;
MOZ_ASSERT(!conn->UsingSpdy(), MOZ_ASSERT(!conn->UsingSpdy(),
"Spdy Must Not Use DispatchAbstractTransaction"); "Spdy Must Not Use DispatchAbstractTransaction");
@ -1904,6 +1908,7 @@ void
nsHttpConnectionMgr::AddActiveConn(nsHttpConnection *conn, nsHttpConnectionMgr::AddActiveConn(nsHttpConnection *conn,
nsConnectionEntry *ent) nsConnectionEntry *ent)
{ {
CheckConnEntryMustBeInmCT(ent->mConnInfo);
ent->mActiveConns.AppendElement(conn); ent->mActiveConns.AppendElement(conn);
mNumActiveConns++; mNumActiveConns++;
ActivateTimeoutTick(); ActivateTimeoutTick();
@ -2091,7 +2096,8 @@ nsHttpConnection *
nsHttpConnectionMgr::GetSpdyActiveConn(nsConnectionEntry *ent) nsHttpConnectionMgr::GetSpdyActiveConn(nsConnectionEntry *ent)
{ {
MOZ_ASSERT(OnSocketThread(), "not on socket thread"); MOZ_ASSERT(OnSocketThread(), "not on socket thread");
MOZ_ASSERT(ent); MOZ_DIAGNOSTIC_ASSERT(ent);
CheckConnEntryMustBeInmCT(ent->mConnInfo);
nsHttpConnection *experienced = nullptr; nsHttpConnection *experienced = nullptr;
nsHttpConnection *noExperience = nullptr; nsHttpConnection *noExperience = nullptr;
@ -2413,6 +2419,7 @@ nsHttpConnectionMgr::OnMsgCancelTransaction(int32_t reason, ARefBase *param)
for (uint32_t index = 0; for (uint32_t index = 0;
ent && (index < ent->mActiveConns.Length()); ent && (index < ent->mActiveConns.Length());
++index) { ++index) {
CheckConnEntryMustBeInmCT(ent->mConnInfo);
nsHttpConnection *activeConn = ent->mActiveConns[index]; nsHttpConnection *activeConn = ent->mActiveConns[index];
nsAHttpTransaction *liveTransaction = activeConn->Transaction(); nsAHttpTransaction *liveTransaction = activeConn->Transaction();
if (liveTransaction && liveTransaction->IsNullTransaction()) { if (liveTransaction && liveTransaction->IsNullTransaction()) {
@ -4061,6 +4068,7 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out)
MOZ_DIAGNOSTIC_ASSERT(out == mStreamOut || out == mBackupStreamOut, MOZ_DIAGNOSTIC_ASSERT(out == mStreamOut || out == mBackupStreamOut,
"stream mismatch"); "stream mismatch");
MOZ_DIAGNOSTIC_ASSERT(mEnt); MOZ_DIAGNOSTIC_ASSERT(mEnt);
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
LOG(("nsHalfOpenSocket::OnOutputStreamReady [this=%p ent=%s %s]\n", LOG(("nsHalfOpenSocket::OnOutputStreamReady [this=%p ent=%s %s]\n",
this, mEnt->mConnInfo->Origin(), this, mEnt->mConnInfo->Origin(),
@ -4119,7 +4127,9 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out)
mFastOpenInProgress = false; mFastOpenInProgress = false;
mConnectionNegotiatingFastOpen = nullptr; mConnectionNegotiatingFastOpen = nullptr;
} }
MOZ_DIAGNOSTIC_ASSERT(mEnt); MOZ_DIAGNOSTIC_ASSERT(mEnt);
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
nsresult rv = SetupConn(out, false); nsresult rv = SetupConn(out, false);
if (mEnt) { if (mEnt) {
mEnt->mDoNotDestroy = false; mEnt->mDoNotDestroy = false;
@ -4135,6 +4145,8 @@ nsHalfOpenSocket::FastOpenEnabled()
MOZ_DIAGNOSTIC_ASSERT(mEnt); MOZ_DIAGNOSTIC_ASSERT(mEnt);
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
if (!mEnt) { if (!mEnt) {
return false; return false;
} }
@ -4187,12 +4199,15 @@ nsHalfOpenSocket::StartFastOpen()
MOZ_DIAGNOSTIC_ASSERT(!mBackupTransport); MOZ_DIAGNOSTIC_ASSERT(!mBackupTransport);
MOZ_DIAGNOSTIC_ASSERT(mEnt); MOZ_DIAGNOSTIC_ASSERT(mEnt);
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
LOG(("nsHalfOpenSocket::StartFastOpen [this=%p]\n", LOG(("nsHalfOpenSocket::StartFastOpen [this=%p]\n",
this)); this));
RefPtr<nsHalfOpenSocket> deleteProtector(this); RefPtr<nsHalfOpenSocket> deleteProtector(this);
mFastOpenInProgress = true; mFastOpenInProgress = true;
mEnt->mDoNotDestroy = true;
// Remove this HalfOpen from mEnt->mHalfOpens. // Remove this HalfOpen from mEnt->mHalfOpens.
// The new connection will take care of closing this HalfOpen from now on! // The new connection will take care of closing this HalfOpen from now on!
if (!mEnt->mHalfOpens.RemoveElement(this)) { if (!mEnt->mHalfOpens.RemoveElement(this)) {
@ -4206,7 +4221,7 @@ nsHalfOpenSocket::StartFastOpen()
Abandon(); Abandon();
return NS_ERROR_ABORT; return NS_ERROR_ABORT;
} }
mEnt->mDoNotDestroy = true;
MOZ_ASSERT(gHttpHandler->ConnMgr()->mNumHalfOpenConns); MOZ_ASSERT(gHttpHandler->ConnMgr()->mNumHalfOpenConns);
if (gHttpHandler->ConnMgr()->mNumHalfOpenConns) { // just in case if (gHttpHandler->ConnMgr()->mNumHalfOpenConns) { // just in case
gHttpHandler->ConnMgr()->mNumHalfOpenConns--; gHttpHandler->ConnMgr()->mNumHalfOpenConns--;
@ -4243,6 +4258,9 @@ nsHalfOpenSocket::StartFastOpen()
} else { } else {
LOG(("nsHalfOpenSocket::StartFastOpen [this=%p conn=%p]\n", LOG(("nsHalfOpenSocket::StartFastOpen [this=%p conn=%p]\n",
this, mConnectionNegotiatingFastOpen.get())); this, mConnectionNegotiatingFastOpen.get()));
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
mEnt->mHalfOpenFastOpenBackups.AppendElement(this); mEnt->mHalfOpenFastOpenBackups.AppendElement(this);
// SetupBackupTimer should setup timer which will hold a ref to this // SetupBackupTimer should setup timer which will hold a ref to this
// halfOpen. It will failed only if it cannot create timer. Anyway just // halfOpen. It will failed only if it cannot create timer. Anyway just
@ -4267,6 +4285,8 @@ nsHalfOpenSocket::SetFastOpenConnected(nsresult aError, bool aWillRetry)
MOZ_DIAGNOSTIC_ASSERT(mFastOpenInProgress); MOZ_DIAGNOSTIC_ASSERT(mFastOpenInProgress);
MOZ_DIAGNOSTIC_ASSERT(mEnt); MOZ_DIAGNOSTIC_ASSERT(mEnt);
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
LOG(("nsHalfOpenSocket::SetFastOpenConnected [this=%p conn=%p error=%x]\n", LOG(("nsHalfOpenSocket::SetFastOpenConnected [this=%p conn=%p error=%x]\n",
this, mConnectionNegotiatingFastOpen.get(), this, mConnectionNegotiatingFastOpen.get(),
static_cast<uint32_t>(aError))); static_cast<uint32_t>(aError)));
@ -4327,6 +4347,7 @@ nsHalfOpenSocket::SetFastOpenConnected(nsresult aError, bool aWillRetry)
// mConnectionNegotiatingFastOpen is going away and halfOpen is taking // mConnectionNegotiatingFastOpen is going away and halfOpen is taking
// this mSocketTransport so add halfOpen to mEnt and update // this mSocketTransport so add halfOpen to mEnt and update
// mNumActiveConns. // mNumActiveConns.
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
mEnt->mHalfOpens.AppendElement(this); mEnt->mHalfOpens.AppendElement(this);
gHttpHandler->ConnMgr()->mNumHalfOpenConns++; gHttpHandler->ConnMgr()->mNumHalfOpenConns++;
gHttpHandler->ConnMgr()->StartedConnect(); gHttpHandler->ConnMgr()->StartedConnect();
@ -4385,6 +4406,8 @@ nsHalfOpenSocket::CancelFastOpenConnection()
LOG(("nsHalfOpenSocket::CancelFastOpenConnection [this=%p conn=%p]\n", LOG(("nsHalfOpenSocket::CancelFastOpenConnection [this=%p conn=%p]\n",
this, mConnectionNegotiatingFastOpen.get())); this, mConnectionNegotiatingFastOpen.get()));
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
RefPtr<nsHalfOpenSocket> deleteProtector(this); RefPtr<nsHalfOpenSocket> deleteProtector(this);
mEnt->mHalfOpenFastOpenBackups.RemoveElement(this); mEnt->mHalfOpenFastOpenBackups.RemoveElement(this);
mSocketTransport->SetFastOpenCallback(nullptr); mSocketTransport->SetFastOpenCallback(nullptr);
@ -4594,6 +4617,7 @@ nsHalfOpenSocket::SetupConn(nsIAsyncOutputStream *out,
MOZ_DIAGNOSTIC_ASSERT(static_cast<int32_t>(mEnt->mIdleConns.IndexOf(conn)) == -1); MOZ_DIAGNOSTIC_ASSERT(static_cast<int32_t>(mEnt->mIdleConns.IndexOf(conn)) == -1);
int32_t idx = mEnt->mActiveConns.IndexOf(conn); int32_t idx = mEnt->mActiveConns.IndexOf(conn);
if (NS_SUCCEEDED(rv) && (idx != -1)) { if (NS_SUCCEEDED(rv) && (idx != -1)) {
gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo);
mConnectionNegotiatingFastOpen = conn; mConnectionNegotiatingFastOpen = conn;
} else { } else {
conn->SetFastOpen(false); conn->SetFastOpen(false);
@ -5153,5 +5177,17 @@ nsHttpConnectionMgr::MoveToWildCardConnEntry(nsHttpConnectionInfo *specificCI,
} }
} }
void
nsHttpConnectionMgr::CheckConnEntryMustBeInmCT(nsHttpConnectionInfo *ci)
{
nsConnectionEntry *ent = mCT.GetWeak(ci->HashKey());
MOZ_DIAGNOSTIC_ASSERT(ent);
if (ent->mHowItWasRemoved == nsConnectionEntry::CONN_ENTRY_CLEAR_CONNECTION_HISTORY) {
MOZ_DIAGNOSTIC_ASSERT(false);
} else if (ent->mHowItWasRemoved == nsConnectionEntry::CONN_ENTRY_REMOVED_SHUTDOWN) {
MOZ_DIAGNOSTIC_ASSERT(false);
}
}
} // namespace net } // namespace net
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -747,6 +747,9 @@ private:
nsTArray<RefPtr<PendingTransactionInfo>>* nsTArray<RefPtr<PendingTransactionInfo>>*
GetTransactionPendingQHelper(nsConnectionEntry *ent, nsAHttpTransaction *trans); GetTransactionPendingQHelper(nsConnectionEntry *ent, nsAHttpTransaction *trans);
// This is only a diagnostic check end it will e removed soon.
void CheckConnEntryMustBeInmCT(nsHttpConnectionInfo *ci);
}; };
NS_DEFINE_STATIC_IID_ACCESSOR(nsHttpConnectionMgr::nsHalfOpenSocket, NS_HALFOPENSOCKET_IID) NS_DEFINE_STATIC_IID_ACCESSOR(nsHttpConnectionMgr::nsHalfOpenSocket, NS_HALFOPENSOCKET_IID)