<!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>[181816] trunk/Source/WebKit2</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/181816">181816</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-03-20 16:09:56 -0700 (Fri, 20 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2] NetworkCache retrievals sometimes fail on browser startup
https://bugs.webkit.org/show_bug.cgi?id=142925
&lt;rdar://problem/20245368&gt;

Reviewed by Antti Koivisto.

NetworkCache retrievals sometimes fail on browser startup for resources
that are actually cached. The reason is that we are using a bloom filter
for performance reasons to avoid unnecessary disk I/O and this bloom
filter is populated on start up in a background thread by traversing the
cache files on disk. However, when restoring the tabs on start-up we
sometimes query this bloom filter before it is completely populated and
we thus fail to retrieve cached entries because we think they don't
exist and don't check the disk.

This patch adds an &quot;isPopulatingContentsFilter&quot; flag that is turned ON
on start up while we are populating the bloon filter. We then bypass
the bloom filter and send queries directly to disk on start up if this
flag is ON.

* NetworkProcess/cache/NetworkCacheStorage.cpp:
(WebKit::NetworkCache::Storage::initialize):
(WebKit::NetworkCache::Storage::retrieve):
(WebKit::NetworkCache::Storage::dispatchPendingWriteOperations):
(WebKit::NetworkCache::Storage::dispatchHeaderWriteOperation):
* NetworkProcess/cache/NetworkCacheStorage.h:
(WebKit::NetworkCache::Storage::cacheMayContain):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStoragecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181815 => 181816)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-20 22:45:14 UTC (rev 181815)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-20 23:09:56 UTC (rev 181816)
</span><span class="lines">@@ -1,5 +1,35 @@
</span><span class="cx"> 2015-03-20  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        [WK2] NetworkCache retrievals sometimes fail on browser startup
+        https://bugs.webkit.org/show_bug.cgi?id=142925
+        &lt;rdar://problem/20245368&gt;
+
+        Reviewed by Antti Koivisto.
+
+        NetworkCache retrievals sometimes fail on browser startup for resources
+        that are actually cached. The reason is that we are using a bloom filter
+        for performance reasons to avoid unnecessary disk I/O and this bloom
+        filter is populated on start up in a background thread by traversing the
+        cache files on disk. However, when restoring the tabs on start-up we
+        sometimes query this bloom filter before it is completely populated and
+        we thus fail to retrieve cached entries because we think they don't
+        exist and don't check the disk.
+
+        This patch adds an &quot;isPopulatingContentsFilter&quot; flag that is turned ON
+        on start up while we are populating the bloon filter. We then bypass
+        the bloom filter and send queries directly to disk on start up if this
+        flag is ON.
+
+        * NetworkProcess/cache/NetworkCacheStorage.cpp:
+        (WebKit::NetworkCache::Storage::initialize):
+        (WebKit::NetworkCache::Storage::retrieve):
+        (WebKit::NetworkCache::Storage::dispatchPendingWriteOperations):
+        (WebKit::NetworkCache::Storage::dispatchHeaderWriteOperation):
+        * NetworkProcess/cache/NetworkCacheStorage.h:
+        (WebKit::NetworkCache::Storage::cacheMayContain):
+
+2015-03-20  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         [WK2] Allow stale content when restoring the browser's session state
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=142916
</span><span class="cx">         &lt;rdar://problem/20243493&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStoragecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp (181815 => 181816)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp        2015-03-20 22:45:14 UTC (rev 181815)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp        2015-03-20 23:09:56 UTC (rev 181816)
</span><span class="lines">@@ -92,6 +92,7 @@
</span><span class="cx">             WebCore::getFileSize(filePath, fileSize);
</span><span class="cx">             m_approximateSize += fileSize;
</span><span class="cx">         });
</span><ins>+        m_hasPopulatedContentsFilter = true;
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -372,7 +373,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!m_contentsFilter.mayContain(key.shortHash())) {
</del><ins>+    if (!cacheMayContain(key.shortHash())) {
</ins><span class="cx">         completionHandler(nullptr);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -460,7 +461,7 @@
</span><span class="cx">         auto&amp; write = *writeOperation;
</span><span class="cx">         m_activeWriteOperations.add(WTF::move(writeOperation));
</span><span class="cx"> 
</span><del>-        if (write.existingEntry &amp;&amp; m_contentsFilter.mayContain(write.entry.key.shortHash())) {
</del><ins>+        if (write.existingEntry &amp;&amp; cacheMayContain(write.entry.key.shortHash())) {
</ins><span class="cx">             dispatchHeaderWriteOperation(write);
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="lines">@@ -515,7 +516,7 @@
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="cx">     ASSERT(write.existingEntry);
</span><span class="cx">     ASSERT(m_activeWriteOperations.contains(&amp;write));
</span><del>-    ASSERT(m_contentsFilter.mayContain(write.entry.key.shortHash()));
</del><ins>+    ASSERT(cacheMayContain(write.entry.key.shortHash()));
</ins><span class="cx"> 
</span><span class="cx">     // Try to update the header of an existing entry.
</span><span class="cx">     StringCapture cachePathCapture(m_directoryPath);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h (181815 => 181816)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-20 22:45:14 UTC (rev 181815)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-20 23:09:56 UTC (rev 181816)
</span><span class="lines">@@ -103,12 +103,16 @@
</span><span class="cx">     WorkQueue&amp; backgroundIOQueue() { return m_backgroundIOQueue.get(); }
</span><span class="cx">     WorkQueue&amp; serialBackgroundIOQueue() { return m_serialBackgroundIOQueue.get(); }
</span><span class="cx"> 
</span><ins>+    bool cacheMayContain(unsigned shortHash) { return !m_hasPopulatedContentsFilter || m_contentsFilter.mayContain(shortHash); }
+
</ins><span class="cx">     const String m_baseDirectoryPath;
</span><span class="cx">     const String m_directoryPath;
</span><span class="cx"> 
</span><span class="cx">     size_t m_maximumSize { std::numeric_limits&lt;size_t&gt;::max() };
</span><span class="cx"> 
</span><span class="cx">     BloomFilter&lt;20&gt; m_contentsFilter;
</span><ins>+    std::atomic&lt;bool&gt; m_hasPopulatedContentsFilter { false };
+
</ins><span class="cx">     std::atomic&lt;size_t&gt; m_approximateSize { 0 };
</span><span class="cx">     std::atomic&lt;bool&gt; m_shrinkInProgress { false };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>