<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[183081] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/183081">183081</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-04-21 16:20:32 -0700 (Tue, 21 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2][NetworkCache] Better account of resource revalidations in efficacy logging
https://bugs.webkit.org/show_bug.cgi?id=144014

Reviewed by Antti Koivisto.

Source/WebCore:

Add additional diagnostic logging key for network cache efficacy
logging.

* page/DiagnosticLoggingKeys.cpp:
(WebCore::DiagnosticLoggingKeys::needsRevalidationKey):
* page/DiagnosticLoggingKeys.h:

Source/WebKit2:

Better account of resource revalidations in efficacy logging.
Prevously, resources that were in the cache but needed revalidation
were counted as retrieval successes, which is not entirely accurate.

We now distinguish &quot;is in the cache and is directly usable&quot; from
&quot;is in the cache but needs revalidation&quot;. We also log how many of these
revalidations are successful.

* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::didReceiveResponseAsync):
* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::Cache::update):
* NetworkProcess/cache/NetworkCache.h:
* NetworkProcess/cache/NetworkCacheStatistics.cpp:
(WebKit::NetworkCache::Statistics::recordRetrievedCachedEntry):
(WebKit::NetworkCache::Statistics::recordRevalidationSuccess):
* NetworkProcess/cache/NetworkCacheStatistics.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageDiagnosticLoggingKeyscpp">trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDiagnosticLoggingKeysh">trunk/Source/WebCore/page/DiagnosticLoggingKeys.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp">trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStatisticscpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStatisticsh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebCore/ChangeLog        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-04-21  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][NetworkCache] Better account of resource revalidations in efficacy logging
+        https://bugs.webkit.org/show_bug.cgi?id=144014
+
+        Reviewed by Antti Koivisto.
+
+        Add additional diagnostic logging key for network cache efficacy
+        logging.
+
+        * page/DiagnosticLoggingKeys.cpp:
+        (WebCore::DiagnosticLoggingKeys::needsRevalidationKey):
+        * page/DiagnosticLoggingKeys.h:
+
</ins><span class="cx"> 2015-04-21  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Context menu doesn't account for selection semantics
</span></span></pre></div>
<a id="trunkSourceWebCorepageDiagnosticLoggingKeyscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -103,6 +103,11 @@
</span><span class="cx">     return ASCIILiteral(&quot;navigation&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String DiagnosticLoggingKeys::needsRevalidationKey()
+{
+    return ASCIILiteral(&quot;needsRevalidation&quot;);
+}
+
</ins><span class="cx"> String DiagnosticLoggingKeys::networkCacheKey()
</span><span class="cx"> {
</span><span class="cx">     return ASCIILiteral(&quot;networkCache&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCorepageDiagnosticLoggingKeysh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.h (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.h        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.h        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx">     static String mediaLoadingFailedKey();
</span><span class="cx">     WEBCORE_EXPORT static String missingValidatorFieldsKey();
</span><span class="cx">     static String navigationKey();
</span><ins>+    WEBCORE_EXPORT static String needsRevalidationKey();
</ins><span class="cx">     WEBCORE_EXPORT static String networkCacheKey();
</span><span class="cx">     static String networkKey();
</span><span class="cx">     WEBCORE_EXPORT static String neverSeenBeforeKey();
</span><span class="lines">@@ -101,7 +102,7 @@
</span><span class="cx">     static String resourceResponseKey();
</span><span class="cx">     WEBCORE_EXPORT static String retrievalKey();
</span><span class="cx">     WEBCORE_EXPORT static String retrievalRequestKey();
</span><del>-    static String revalidatingKey();
</del><ins>+    WEBCORE_EXPORT static String revalidatingKey();
</ins><span class="cx">     static String sameLoadKey();
</span><span class="cx">     static String scriptKey();
</span><span class="cx">     static String sourceKey();
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2015-04-21  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][NetworkCache] Better account of resource revalidations in efficacy logging
+        https://bugs.webkit.org/show_bug.cgi?id=144014
+
+        Reviewed by Antti Koivisto.
+
+        Better account of resource revalidations in efficacy logging.
+        Prevously, resources that were in the cache but needed revalidation
+        were counted as retrieval successes, which is not entirely accurate.
+
+        We now distinguish &quot;is in the cache and is directly usable&quot; from
+        &quot;is in the cache but needs revalidation&quot;. We also log how many of these
+        revalidations are successful.
+
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::didReceiveResponseAsync):
+        * NetworkProcess/cache/NetworkCache.cpp:
+        (WebKit::NetworkCache::Cache::update):
+        * NetworkProcess/cache/NetworkCache.h:
+        * NetworkProcess/cache/NetworkCacheStatistics.cpp:
+        (WebKit::NetworkCache::Statistics::recordRetrievedCachedEntry):
+        (WebKit::NetworkCache::Statistics::recordRevalidationSuccess):
+        * NetworkProcess/cache/NetworkCacheStatistics.h:
+
</ins><span class="cx"> 2015-04-21  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cocoa] Framework header postprocessing should respect additional definitions
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx">     if (m_cacheEntryForValidation) {
</span><span class="cx">         bool validationSucceeded = m_response.httpStatusCode() == 304; // 304 Not Modified
</span><span class="cx">         if (validationSucceeded)
</span><del>-            NetworkCache::singleton().update(originalRequest(), *m_cacheEntryForValidation, m_response);
</del><ins>+            NetworkCache::singleton().update(originalRequest(), m_parameters.webPageID, *m_cacheEntryForValidation, m_response);
</ins><span class="cx">         else
</span><span class="cx">             m_cacheEntryForValidation = nullptr;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -385,7 +385,7 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Cache::update(const WebCore::ResourceRequest&amp; originalRequest, const Entry&amp; existingEntry, const WebCore::ResourceResponse&amp; validatingResponse)
</del><ins>+void Cache::update(const WebCore::ResourceRequest&amp; originalRequest, uint64_t webPageID, const Entry&amp; existingEntry, const WebCore::ResourceResponse&amp; validatingResponse)
</ins><span class="cx"> {
</span><span class="cx">     LOG(NetworkCache, &quot;(NetworkProcess) updating %s&quot;, originalRequest.url().string().latin1().data());
</span><span class="cx"> 
</span><span class="lines">@@ -397,6 +397,9 @@
</span><span class="cx">     auto updateRecord = updateEntry.encodeAsStorageRecord();
</span><span class="cx"> 
</span><span class="cx">     m_storage-&gt;store(updateRecord, { });
</span><ins>+
+    if (m_statistics)
+        m_statistics-&gt;recordRevalidationSuccess(webPageID, existingEntry.key(), originalRequest);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Cache::remove(const Key&amp; key)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">     // Completion handler may get called back synchronously on failure.
</span><span class="cx">     void retrieve(const WebCore::ResourceRequest&amp;, uint64_t webPageID, std::function&lt;void (std::unique_ptr&lt;Entry&gt;)&gt;);
</span><span class="cx">     void store(const WebCore::ResourceRequest&amp;, const WebCore::ResourceResponse&amp;, RefPtr&lt;WebCore::SharedBuffer&gt;&amp;&amp;, std::function&lt;void (MappedBody&amp;)&gt;);
</span><del>-    void update(const WebCore::ResourceRequest&amp;, const Entry&amp;, const WebCore::ResourceResponse&amp; validatingResponse);
</del><ins>+    void update(const WebCore::ResourceRequest&amp;, uint64_t webPageID, const Entry&amp;, const WebCore::ResourceResponse&amp; validatingResponse);
</ins><span class="cx"> 
</span><span class="cx">     void traverse(std::function&lt;void (const Entry*)&gt;&amp;&amp;);
</span><span class="cx">     void remove(const Key&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStatisticscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -287,17 +287,31 @@
</span><span class="cx"> void Statistics::recordRetrievedCachedEntry(uint64_t webPageID, const Key&amp; key, const WebCore::ResourceRequest&amp; request, UseDecision decision)
</span><span class="cx"> {
</span><span class="cx">     WebCore::URL requestURL = request.url();
</span><del>-    if (decision == UseDecision::Use || decision == UseDecision::Validate) {
</del><ins>+    if (decision == UseDecision::Use) {
</ins><span class="cx">         LOG(NetworkCache, &quot;(NetworkProcess) webPageID %llu: %s is in the cache and is used&quot;, webPageID, requestURL.string().ascii().data());
</span><span class="cx">         NetworkProcess::singleton().logDiagnosticMessageWithResult(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::retrievalKey(), WebCore::DiagnosticLoggingResultPass, WebCore::ShouldSample::Yes);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (decision == UseDecision::Validate) {
+        LOG(NetworkCache, &quot;(NetworkProcess) webPageID %llu: %s is in the cache but needs revalidation&quot;, webPageID, requestURL.string().ascii().data());
+        NetworkProcess::singleton().logDiagnosticMessageWithValue(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::retrievalKey(), WebCore::DiagnosticLoggingKeys::needsRevalidationKey(), WebCore::ShouldSample::Yes);
+        return;
+    }
+
</ins><span class="cx">     String diagnosticKey = cachedEntryReuseFailureToDiagnosticKey(decision);
</span><span class="cx">     LOG(NetworkCache, &quot;(NetworkProcess) webPageID %llu: %s is in the cache but wasn't used, reason: %s&quot;, webPageID, requestURL.string().ascii().data(), diagnosticKey.utf8().data());
</span><span class="cx">     NetworkProcess::singleton().logDiagnosticMessageWithValue(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::unusableCachedEntryKey(), diagnosticKey, WebCore::ShouldSample::Yes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Statistics::recordRevalidationSuccess(uint64_t webPageID, const Key&amp; key, const WebCore::ResourceRequest&amp; request)
+{
+    WebCore::URL requestURL = request.url();
+    LOG(NetworkCache, &quot;(NetworkProcess) webPageID %llu: %s was successfully revalidated&quot;, webPageID, requestURL.string().ascii().data());
+
+    NetworkProcess::singleton().logDiagnosticMessageWithResult(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::revalidatingKey(), WebCore::DiagnosticLoggingResultPass, WebCore::ShouldSample::Yes);
+}
+
</ins><span class="cx"> void Statistics::markAsRequested(const String&amp; hash)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStatisticsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.h (183080 => 183081)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.h        2015-04-21 23:07:59 UTC (rev 183080)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.h        2015-04-21 23:20:32 UTC (rev 183081)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx">     void recordNotUsingCacheForRequest(uint64_t webPageID, const Key&amp;, const WebCore::ResourceRequest&amp;, RetrieveDecision);
</span><span class="cx">     void recordRetrievalFailure(uint64_t webPageID, const Key&amp;, const WebCore::ResourceRequest&amp;);
</span><span class="cx">     void recordRetrievedCachedEntry(uint64_t webPageID, const Key&amp;, const WebCore::ResourceRequest&amp;, UseDecision);
</span><ins>+    void recordRevalidationSuccess(uint64_t webPageID, const Key&amp;, const WebCore::ResourceRequest&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     explicit Statistics(const String&amp; databasePath);
</span></span></pre>
</div>
</div>

</body>
</html>