Bug 1682552 - Add a probe to understand the channel successful rate when https rr is used r=necko-reviewers,dragana

Differential Revision: https://phabricator.services.mozilla.com/D99916
This commit is contained in:
Kershaw Chang 2021-01-12 09:17:21 +00:00
Родитель 6fa129d883
Коммит 880ee627a1
11 изменённых файлов: 88 добавлений и 45 удалений

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

@ -61,8 +61,13 @@ enum HTTPSSVC_RECEIVED_STAGE : uint32_t {
HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_1 = 4,
HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_2 = 5,
HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_2 = 6,
HTTPSSVC_NOT_USED = 7,
HTTPSSVC_NO_USABLE_RECORD = 8,
};
#define HTTPS_RR_IS_USED(s) \
(s > HTTPSSVC_NOT_PRESENT && s < HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_2)
// Required buffer size for text form of an IP address.
// Includes space for null termination. We make our own contants
// because we don't want higher-level code depending on things

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

@ -483,15 +483,13 @@ HttpTransactionChild::OnStartRequest(nsIRequest* aRequest) {
int32_t proxyConnectResponseCode =
mTransaction->GetProxyConnectResponseCode();
Maybe<uint32_t> stage = mTransaction->HTTPSSVCReceivedStage();
Unused << SendOnStartRequest(status, optionalHead, serializedSecurityInfoOut,
mTransaction->ProxyConnectFailed(),
ToTimingStructArgs(mTransaction->Timings()),
proxyConnectResponseCode, dataForSniffer,
optionalAltSvcUsed, !!mDataBridgeParent,
mTransaction->TakeRestartedState(), stage,
mTransaction->GetSupportsHTTP3());
Unused << SendOnStartRequest(
status, optionalHead, serializedSecurityInfoOut,
mTransaction->ProxyConnectFailed(),
ToTimingStructArgs(mTransaction->Timings()), proxyConnectResponseCode,
dataForSniffer, optionalAltSvcUsed, !!mDataBridgeParent,
mTransaction->TakeRestartedState(), mTransaction->HTTPSSVCReceivedStage(),
mTransaction->GetSupportsHTTP3());
return NS_OK;
}
@ -597,8 +595,10 @@ HttpTransactionChild::OnTransportStatus(nsITransport* aTransport,
NetAddr selfAddr;
NetAddr peerAddr;
bool isTrr = false;
bool echConfigUsed = false;
if (mTransaction) {
mTransaction->GetNetworkAddresses(selfAddr, peerAddr, isTrr);
mTransaction->GetNetworkAddresses(selfAddr, peerAddr, isTrr,
echConfigUsed);
} else {
nsCOMPtr<nsISocketTransport> socketTransport =
do_QueryInterface(aTransport);
@ -606,9 +606,10 @@ HttpTransactionChild::OnTransportStatus(nsITransport* aTransport,
socketTransport->GetSelfAddr(&selfAddr);
socketTransport->GetPeerAddr(&peerAddr);
socketTransport->ResolvedByTRR(&isTrr);
socketTransport->GetEchConfigUsed(&echConfigUsed);
}
}
arg.emplace(selfAddr, peerAddr, isTrr);
arg.emplace(selfAddr, peerAddr, isTrr, echConfigUsed);
}
Unused << SendOnTransportStatus(aStatus, aProgress, aProgressMax, arg);

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

@ -88,6 +88,7 @@ HttpTransactionParent::HttpTransactionParent(bool aIsDocumentLoad)
mOnStartRequestCalled(false),
mOnStopRequestCalled(false),
mResolvedByTRR(false),
mEchConfigUsed(false),
mProxyConnectResponseCode(0),
mChannelId(0),
mDataSentToChildProcess(false),
@ -304,12 +305,12 @@ void HttpTransactionParent::SetDNSWasRefreshed() {
}
void HttpTransactionParent::GetNetworkAddresses(NetAddr& self, NetAddr& peer,
bool& aResolvedByTRR) {
bool& aResolvedByTRR,
bool& aEchConfigUsed) {
self = mSelfAddr;
peer = mPeerAddr;
// TODO: will be implemented later in bug 1600254.
aResolvedByTRR = false;
aResolvedByTRR = mResolvedByTRR;
aEchConfigUsed = mEchConfigUsed;
}
bool HttpTransactionParent::HasStickyConnection() const {
@ -378,7 +379,7 @@ bool HttpTransactionParent::TakeRestartedState() {
return result;
}
Maybe<uint32_t> HttpTransactionParent::HTTPSSVCReceivedStage() {
uint32_t HttpTransactionParent::HTTPSSVCReceivedStage() {
return mHTTPSSVCReceivedStage;
}
@ -447,20 +448,19 @@ mozilla::ipc::IPCResult HttpTransactionParent::RecvOnStartRequest(
const int32_t& aProxyConnectResponseCode,
nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed,
const bool& aDataToChildProcess, const bool& aRestarted,
Maybe<uint32_t>&& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3) {
const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3) {
mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent(
this, [self = UnsafePtr<HttpTransactionParent>(this), aStatus,
aResponseHead, aSecurityInfoSerialization, aProxyConnectFailed,
aTimings, aProxyConnectResponseCode,
aDataForSniffer = CopyableTArray{std::move(aDataForSniffer)},
aAltSvcUsed, aDataToChildProcess, aRestarted,
aHTTPSSVCReceivedStage{std::move(aHTTPSSVCReceivedStage)},
aSupportsHttp3]() mutable {
aHTTPSSVCReceivedStage, aSupportsHttp3]() mutable {
self->DoOnStartRequest(
aStatus, aResponseHead, aSecurityInfoSerialization,
aProxyConnectFailed, aTimings, aProxyConnectResponseCode,
std::move(aDataForSniffer), aAltSvcUsed, aDataToChildProcess,
aRestarted, std::move(aHTTPSSVCReceivedStage), aSupportsHttp3);
aRestarted, aHTTPSSVCReceivedStage, aSupportsHttp3);
}));
return IPC_OK();
}
@ -490,7 +490,7 @@ void HttpTransactionParent::DoOnStartRequest(
const int32_t& aProxyConnectResponseCode,
nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed,
const bool& aDataToChildProcess, const bool& aRestarted,
Maybe<uint32_t>&& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3) {
const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3) {
LOG(("HttpTransactionParent::DoOnStartRequest [this=%p aStatus=%" PRIx32
"]\n",
this, static_cast<uint32_t>(aStatus)));
@ -503,7 +503,7 @@ void HttpTransactionParent::DoOnStartRequest(
mStatus = aStatus;
mDataSentToChildProcess = aDataToChildProcess;
mHTTPSSVCReceivedStage = std::move(aHTTPSSVCReceivedStage);
mHTTPSSVCReceivedStage = aHTTPSSVCReceivedStage;
mSupportsHTTP3 = aSupportsHttp3;
if (!aSecurityInfoSerialization.IsEmpty()) {
@ -547,6 +547,7 @@ mozilla::ipc::IPCResult HttpTransactionParent::RecvOnTransportStatus(
mSelfAddr = aNetworkAddressArg->selfAddr();
mPeerAddr = aNetworkAddressArg->peerAddr();
mResolvedByTRR = aNetworkAddressArg->resolvedByTRR();
mEchConfigUsed = aNetworkAddressArg->echConfigUsed();
}
mEventsink->OnTransportStatus(nullptr, aStatus, aProgress, aProgressMax);
return IPC_OK();

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

@ -54,7 +54,7 @@ class HttpTransactionParent final : public PHttpTransactionParent,
const int32_t& aProxyConnectResponseCode,
nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed,
const bool& aDataToChildProcess, const bool& aRestarted,
Maybe<uint32_t>&& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3);
const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3);
mozilla::ipc::IPCResult RecvOnTransportStatus(
const nsresult& aStatus, const int64_t& aProgress,
const int64_t& aProgressMax,
@ -98,7 +98,7 @@ class HttpTransactionParent final : public PHttpTransactionParent,
const int32_t& aProxyConnectResponseCode,
nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed,
const bool& aDataToChildProcess, const bool& aRestarted,
Maybe<uint32_t>&& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3);
const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3);
void DoOnDataAvailable(const nsCString& aData, const uint64_t& aOffset,
const uint32_t& aCount);
void DoOnStopRequest(
@ -137,6 +137,7 @@ class HttpTransactionParent final : public PHttpTransactionParent,
bool mOnStartRequestCalled;
bool mOnStopRequestCalled;
bool mResolvedByTRR;
bool mEchConfigUsed = false;
int32_t mProxyConnectResponseCode;
uint64_t mChannelId;
bool mDataSentToChildProcess;
@ -155,7 +156,7 @@ class HttpTransactionParent final : public PHttpTransactionParent,
OnPushCallback mOnPushCallback;
nsTArray<uint8_t> mDataForSniffer;
std::function<void()> mCallOnResume;
Maybe<uint32_t> mHTTPSSVCReceivedStage;
uint32_t mHTTPSSVCReceivedStage;
RefPtr<nsHttpConnectionInfo> mConnInfo;
bool mSupportsHTTP3 = false;
};

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

@ -108,7 +108,8 @@ class HttpTransactionShell : public nsISupports {
virtual void SetSecurityCallbacks(nsIInterfaceRequestor* aCallbacks) = 0;
virtual void GetNetworkAddresses(NetAddr& self, NetAddr& peer,
bool& aResolvedByTRR) = 0;
bool& aResolvedByTRR,
bool& aEchConfigUsed) = 0;
// Functions for Timing interface
virtual mozilla::TimeStamp GetDomainLookupStart() = 0;
@ -152,7 +153,7 @@ class HttpTransactionShell : public nsISupports {
virtual HttpTransactionParent* AsHttpTransactionParent() = 0;
virtual bool TakeRestartedState() = 0;
virtual Maybe<uint32_t> HTTPSSVCReceivedStage() = 0;
virtual uint32_t HTTPSSVCReceivedStage() = 0;
virtual bool Http2Disabled() const = 0;
virtual bool Http3Disabled() const = 0;
@ -185,7 +186,8 @@ NS_DEFINE_STATIC_IID_ACCESSOR(HttpTransactionShell, HTTPTRANSACTIONSHELL_IID)
virtual void SetSecurityCallbacks(nsIInterfaceRequestor* aCallbacks) \
override; \
virtual void GetNetworkAddresses(NetAddr& self, NetAddr& peer, \
bool& aResolvedByTRR) override; \
bool& aResolvedByTRR, bool& aEchConfigUsed) \
override; \
virtual mozilla::TimeStamp GetDomainLookupStart() override; \
virtual mozilla::TimeStamp GetDomainLookupEnd() override; \
virtual mozilla::TimeStamp GetConnectStart() override; \
@ -214,7 +216,7 @@ NS_DEFINE_STATIC_IID_ACCESSOR(HttpTransactionShell, HTTPTRANSACTIONSHELL_IID)
virtual nsHttpTransaction* AsHttpTransaction() override; \
virtual HttpTransactionParent* AsHttpTransactionParent() override; \
virtual bool TakeRestartedState() override; \
virtual Maybe<uint32_t> HTTPSSVCReceivedStage() override; \
virtual uint32_t HTTPSSVCReceivedStage() override; \
virtual bool Http2Disabled() const override; \
virtual bool Http3Disabled() const override; \
virtual already_AddRefed<nsHttpConnectionInfo> GetConnInfo() const override; \

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

@ -30,6 +30,7 @@ struct NetworkAddressArg {
NetAddr selfAddr;
NetAddr peerAddr;
bool resolvedByTRR;
bool echConfigUsed;
};
refcounted protocol PHttpTransaction
@ -47,7 +48,7 @@ parent:
nsCString? altSvcUsed,
bool dataToChildProcess,
bool restarted,
uint32_t? HTTPSSVCReceivedStage,
uint32_t HTTPSSVCReceivedStage,
bool supportsHttp3);
async OnTransportStatus(nsresult status,
int64_t progress,

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

@ -7421,13 +7421,20 @@ nsHttpChannel::OnStartRequest(nsIRequest* request) {
mSecurityInfo = mTransaction->SecurityInfo();
}
uint32_t stage = mTransaction->HTTPSSVCReceivedStage();
if (!LoadHTTPSSVCTelemetryReported()) {
Maybe<uint32_t> stage = mTransaction->HTTPSSVCReceivedStage();
if (stage) {
if (stage != HTTPSSVC_NOT_USED) {
Telemetry::Accumulate(Telemetry::DNS_HTTPSSVC_RECORD_RECEIVING_STAGE,
*stage);
stage);
}
}
if (HTTPS_RR_IS_USED(stage)) {
Telemetry::Accumulate(
Telemetry::HTTP_CHANNEL_ONSTART_SUCCESS_HTTPS_RR,
LoadEchConfigUsed() ? "echConfig-used"_ns : "echConfig-not-used"_ns,
NS_SUCCEEDED(mStatus));
}
}
// don't enter this block if we're reading from the cache...
@ -8338,17 +8345,21 @@ nsHttpChannel::OnTransportStatus(nsITransport* trans, nsresult status,
if (status == NS_NET_STATUS_CONNECTED_TO ||
status == NS_NET_STATUS_WAITING_FOR) {
bool isTrr = false;
bool echConfigUsed = false;
if (mTransaction) {
mTransaction->GetNetworkAddresses(mSelfAddr, mPeerAddr, isTrr);
mTransaction->GetNetworkAddresses(mSelfAddr, mPeerAddr, isTrr,
echConfigUsed);
} else {
nsCOMPtr<nsISocketTransport> socketTransport = do_QueryInterface(trans);
if (socketTransport) {
socketTransport->GetSelfAddr(&mSelfAddr);
socketTransport->GetPeerAddr(&mPeerAddr);
socketTransport->ResolvedByTRR(&isTrr);
socketTransport->GetEchConfigUsed(&echConfigUsed);
}
}
StoreResolvedByTRR(isTrr);
StoreEchConfigUsed(echConfigUsed);
}
// block socket status event after Cancel or OnStopRequest has been called.

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

@ -744,7 +744,8 @@ class nsHttpChannel final : public HttpBaseChannel,
MOZ_ATOMIC_BITFIELDS(mAtomicBitfields6, 32, (
// Only set to true when we receive an HTTPSSVC record before the
// transaction is created.
(uint32_t, HTTPSSVCTelemetryReported, 1)
(uint32_t, HTTPSSVCTelemetryReported, 1),
(uint32_t, EchConfigUsed, 1)
))
// clang-format on

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

@ -136,12 +136,14 @@ nsHttpTransaction::nsHttpTransaction()
mSynchronousRatePaceRequest(false),
mClassOfService(0),
mResolvedByTRR(false),
mEchConfigUsed(false),
m0RTTInProgress(false),
mDoNotTryEarlyData(false),
mEarlyDataDisposition(EARLY_NONE),
mFastOpenStatus(TFO_NOT_TRIED),
mTrafficCategory(HttpTrafficCategory::eInvalid),
mProxyConnectResponseCode(0),
mHTTPSSVCReceivedStage(HTTPSSVC_NOT_USED),
m421Received(false),
mDontRetryWithDirectRoute(false),
mFastFallbackTriggered(false),
@ -442,7 +444,7 @@ nsresult nsHttpTransaction::Init(
}
if (gHttpHandler->UseHTTPSRRAsAltSvcEnabled()) {
mHTTPSSVCReceivedStage.emplace(HTTPSSVC_NOT_PRESENT);
mHTTPSSVCReceivedStage = HTTPSSVC_NOT_PRESENT;
nsCOMPtr<nsIEventTarget> target;
Unused << gHttpHandler->GetSocketThreadTarget(getter_AddRefs(target));
@ -650,6 +652,7 @@ void nsHttpTransaction::OnTransportStatus(nsITransport* transport,
socketTransport->GetSelfAddr(&mSelfAddr);
socketTransport->GetPeerAddr(&mPeerAddr);
socketTransport->ResolvedByTRR(&mResolvedByTRR);
socketTransport->GetEchConfigUsed(&mEchConfigUsed);
}
}
@ -2850,11 +2853,13 @@ nsHttpTransaction::OnOutputStreamReady(nsIAsyncOutputStream* out) {
}
void nsHttpTransaction::GetNetworkAddresses(NetAddr& self, NetAddr& peer,
bool& aResolvedByTRR) {
bool& aResolvedByTRR,
bool& aEchConfigUsed) {
MutexAutoLock lock(mLock);
self = mSelfAddr;
peer = mPeerAddr;
aResolvedByTRR = mResolvedByTRR;
aEchConfigUsed = mEchConfigUsed;
}
bool nsHttpTransaction::CanDo0RTT() {
@ -3112,6 +3117,12 @@ nsresult nsHttpTransaction::OnHTTPSRRAvailable(
mDNSRequest = nullptr;
}
uint32_t receivedStage = HTTPSSVC_NO_USABLE_RECORD;
// Make sure we set the correct value to |mHTTPSSVCReceivedStage|, since we
// also use this value to indicate whether HTTPS RR is used or not.
auto updateHTTPSSVCReceivedStage =
MakeScopeExit([&] { mHTTPSSVCReceivedStage = receivedStage; });
MakeDontWaitHTTPSSVC();
nsCOMPtr<nsIDNSHTTPSSVCRecord> record = aHTTPSSVCRecord;
@ -3123,15 +3134,13 @@ nsresult nsHttpTransaction::OnHTTPSRRAvailable(
Unused << record->GetHasIPAddresses(&hasIPAddress);
if (mActivated) {
mHTTPSSVCReceivedStage =
Some(hasIPAddress ? HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_2
: HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_2);
receivedStage = hasIPAddress ? HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_2
: HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_2;
return NS_OK;
}
mHTTPSSVCReceivedStage =
Some(hasIPAddress ? HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_1
: HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_1);
receivedStage = hasIPAddress ? HTTPSSVC_WITH_IPHINT_RECEIVED_STAGE_1
: HTTPSSVC_WITHOUT_IPHINT_RECEIVED_STAGE_1;
nsCOMPtr<nsISVCBRecord> svcbRecord = aHighestPriorityRecord;
if (!svcbRecord) {
@ -3198,7 +3207,7 @@ nsresult nsHttpTransaction::OnHTTPSRRAvailable(
return NS_OK;
}
Maybe<uint32_t> nsHttpTransaction::HTTPSSVCReceivedStage() {
uint32_t nsHttpTransaction::HTTPSSVCReceivedStage() {
return mHTTPSSVCReceivedStage;
}

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

@ -485,6 +485,7 @@ class nsHttpTransaction final : public nsAHttpTransaction,
NetAddr mSelfAddr;
NetAddr mPeerAddr;
bool mResolvedByTRR;
bool mEchConfigUsed = false;
bool m0RTTInProgress;
bool mDoNotTryEarlyData;
@ -509,7 +510,7 @@ class nsHttpTransaction final : public nsAHttpTransaction,
mIDToStreamMap;
nsCOMPtr<nsICancelable> mDNSRequest;
Maybe<uint32_t> mHTTPSSVCReceivedStage;
Atomic<uint32_t, Relaxed> mHTTPSSVCReceivedStage;
bool m421Received = false;
nsCOMPtr<nsIDNSHTTPSSVCRecord> mHTTPSSVCRecord;
nsTArray<RefPtr<nsISVCBRecord>> mRecordsForRetry;

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

@ -3123,6 +3123,16 @@
"releaseChannelCollection": "opt-out",
"alert_emails": ["necko@mozilla.com", "vgosu@mozilla.com"]
},
"HTTP_CHANNEL_ONSTART_SUCCESS_HTTPS_RR" : {
"record_in_processes": ["main"],
"products": ["firefox", "fennec"],
"expires_in_version": "never",
"kind": "boolean",
"keyed": true,
"description": "Successfully started HTTP channels when HTTPS RR is used; Keyed by echConfig is used or not",
"bug_numbers": [1682552],
"alert_emails": ["necko@mozilla.com", "kershaw@mozilla.com"]
},
"HTTP_CONNECTION_ENTRY_CACHE_HIT_1" : {
"record_in_processes": ["main", "content"],
"products": ["firefox", "fennec"],