Ayende @ Rahienhttps://www.ayende.com/blog/Ayende @ RahienCopyright (C) Ayende Rahien 2004 - 2021 (c) 202460Fun with bugs: Advanced Dictionary API<p style="text-align:left;">In RavenDB, we <em>really</em>&nbsp;care about performance. That means that our typical code does <em>not</em>&nbsp;follow idiomatic C# code. Instead, we make use of everything that the framework and the language give us to eke out that additional push for performance. Recently we ran into a bug that was quite puzzling. Here is a simple reproduction of the problem:</p><p style="text-align:left;"><hr/><pre class='line-numbers language-csharp'><code class='line-numbers language-csharp'><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Runtime<span class="token punctuation">.</span>InteropServices</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> counts <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Dictionary<span class="token punctuation">&lt;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> totalKey <span class="token operator">=</span> <span class="token number">10_000</span><span class="token punctuation">;</span> <span class="token keyword">ref</span> <span class="token class-name"><span class="token keyword">var</span></span> total <span class="token operator">=</span> <span class="token keyword">ref</span> CollectionsMarshal<span class="token punctuation">.</span><span class="token function">GetValueRefOrAddDefault</span><span class="token punctuation">(</span> counts<span class="token punctuation">,</span> totalKey<span class="token punctuation">,</span> <span class="token keyword">out</span> _<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">4</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">var</span></span> key <span class="token operator">=</span> i <span class="token operator">%</span> <span class="token number">32</span><span class="token punctuation">;</span> <span class="token keyword">ref</span> <span class="token class-name"><span class="token keyword">var</span></span> count <span class="token operator">=</span> <span class="token keyword">ref</span> CollectionsMarshal<span class="token punctuation">.</span><span class="token function">GetValueRefOrAddDefault</span><span class="token punctuation">(</span> counts<span class="token punctuation">,</span> key<span class="token punctuation">,</span> <span class="token keyword">out</span> _<span class="token punctuation">)</span><span class="token punctuation">;</span> count<span class="token operator">++</span><span class="token punctuation">;</span> total<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span>counts<span class="token punctuation">[</span>totalKey<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><hr/></p><p style="text-align:left;">What would you <em>expect</em>&nbsp;this code to output? We are using two important features of C# here:</p><ul><li>Value types (in this case, an int, but the real scenario was with a struct)</li><li>CollectionMarshal.GetValueRefOrAddDefault()</li></ul><p style="text-align:left;">The latter method is a way to avoid performing two lookups in the dictionary to get the value if it exists and then add or modify it. </p><p style="text-align:left;">If you run the code above, it will output the number 2. </p><p style="text-align:left;">That is <em>not</em>&nbsp;expected, but when I sat down and thought about it, it made sense.</p><p style="text-align:left;">We are keeping track of the reference to a value in the dictionary, <em>and we are mutating</em>&nbsp;the dictionary.</p><p style="text-align:left;">The documentation for the method <span style="text-decoration:underline;"><a style="color:inherit;" href="https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.collectionsmarshal.getvaluereforadddefault?view=net-8.0#system-runtime-interopservices-collectionsmarshal-getvaluereforadddefault-2(system-collections-generic-dictionary((-0-1))-0-system-boolean@)">very clearly explains that this is a Bad Idea.</a></span>&nbsp;It is an easy mistake to make, but still a mistake. The challenge here is figuring out <em>why</em>&nbsp;this is happening. Can you give it a minute of thought and see if you can figure it out?</p><p style="text-align:left;">A dictionary is basically an array that you access using an index (computed via a hash function), that is all. So if we strip everything away, the code above can be seen as:</p><p style="text-align:left;"><hr/><pre class='line-numbers language-javascript'><code class='line-numbers language-javascript'><span class="token keyword">var</span> buffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">int</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> ref <span class="token keyword">var</span> total <span class="token operator">=</span> ref <span class="token keyword">var</span> buffer<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><hr/></p><p style="text-align:left;">We simply have a reference to the first element in the array, that&rsquo;s what this does behind the scenes. And when we insert items into the dictionary, we may need to allocate a bigger backing array for it, so this becomes:</p><p style="text-align:left;"><hr/><pre class='line-numbers language-javascript'><code class='line-numbers language-javascript'><span class="token keyword">var</span> buffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">int</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> ref <span class="token keyword">var</span> total <span class="token operator">=</span> ref <span class="token keyword">var</span> buffer<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">var</span> newBuffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">int</span><span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> buffer<span class="token punctuation">.</span><span class="token function">CopyTo</span><span class="token punctuation">(</span>newBuffer<span class="token punctuation">)</span><span class="token punctuation">;</span> buffer <span class="token operator">=</span> newBuffer<span class="token punctuation">;</span> total <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">var</span> newTotal <span class="token operator">=</span> buffer<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span></code></pre><hr/></p><p style="text-align:left;">In other words, the <em>total</em>&nbsp;variable is pointing to the first element in the <em>two-element array</em>, but we allocated a <em>new</em>&nbsp;array (and copied all the values). That is the reason why the code above gives the wrong result. Makes perfect sense, and yet, was quite puzzling to figure out.</p> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/themes/prism.min.css" integrity="sha512-/mZ1FHPkg6EKcxo0fKXF51ak6Cr2ocgDi5ytaTBjsQZIH/RNs6GF6+oId/vPe3eJB836T36nXwVh/WBl/cWT4w==" crossorigin="anonymous" referrerpolicy="no-referrer" />https://www.ayende.com/blog/201761-C/fun-with-bugs-advanced-dictionary-api?Key=8f507241-34b2-4e31-b3f1-a31f6adbcc28https://www.ayende.com/blog/201761-C/fun-with-bugs-advanced-dictionary-api?Key=8f507241-34b2-4e31-b3f1-a31f6adbcc28Fri, 15 Nov 2024 10:00:00 GMTDebugging the Linux kernel using awesome psychic powers<p style="text-align:left;">I wanted to test low-level file-system behavior in preparation for a new feature for RavenDB. Specifically, I wanted to look into hole punching - where you can give low-level instructions to the file system to indicate that you&rsquo;re giving up disk space, but without actually reducing the size of the file.</p><p style="text-align:left;">This can be very helpful in space management. If I have a section in the file that is full of zeroes, I can just tell the file system that, and it can skip storing that range of zeros on the disk entirely. This is an advanced feature for file systems. I haven&#39;t actually used that in the past, so I needed to gain some expertise with it.</p><p style="text-align:left;">I wrote the following code for Linux:</p><p style="text-align:left;"><hr/><pre class='line-numbers language-bash'><code class='line-numbers language-bash'>int fd <span class="token operator">=</span> open<span class="token punctuation">(</span><span class="token string">"test.file"</span>, O_CREAT <span class="token operator">|</span> O_WRONLY, 0644<span class="token punctuation">)</span><span class="token punctuation">;</span> lseek<span class="token punctuation">(</span>fd, <span class="token number">128</span> * <span class="token number">1024</span> * <span class="token number">1024</span> - <span class="token number">1</span>, SEEK_SET<span class="token punctuation">)</span><span class="token punctuation">;</span> // 128MB <span class="token function">file</span> write<span class="token punctuation">(</span>fd, <span class="token string">""</span>, <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fallocate<span class="token punctuation">(</span>fd, // <span class="token number">32</span> MB hole from the 16MB<span class="token punctuation">..</span>48MB range FALLOC_FL_PUNCH_HOLE <span class="token operator">|</span> FALLOC_FL_KEEP_SIZE, <span class="token number">16</span> * <span class="token number">1024</span> * <span class="token number">1024</span>, <span class="token number">32</span> * <span class="token number">1024</span> * <span class="token number">1024</span><span class="token punctuation">)</span><span class="token punctuation">;</span> close<span class="token punctuation">(</span>fd<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><hr/></p><p style="text-align:left;">The code for <span style="text-decoration:underline;"><a style="color:inherit;" href="https://gist.github.com/ayende/68dcb097c0500785b18a14ab9afa69a1">Windows is here</a></span>&nbsp;if you want to see it. I tested the feature on both Windows &amp; Linux, and it worked. I could see that while the file size was 128MB, I was able to give back 16MB to the operating system without any issues. I turned the code above into a test and called it a day. </p><p style="text-align:left;">And then the CI build broke. But that wasn&rsquo;t possible since I <em>tested</em>&nbsp;that. And there had been CI runs that did work on Linux. So I did the obvious thing and started running the code above in a loop. </p><p style="text-align:left;">I found something <em>really</em>&nbsp;annoying. This code worked, <em>sometimes</em>. And sometimes it just didn&rsquo;t. </p><p style="text-align:left;">In order to get the size, I need to run this code:</p><p style="text-align:left;"><hr/><pre class='line-numbers language-bash'><code class='line-numbers language-bash'>struct <span class="token function">stat</span> st<span class="token punctuation">;</span> fstat<span class="token punctuation">(</span>fd, <span class="token operator">&amp;</span>st<span class="token punctuation">)</span><span class="token punctuation">;</span> printf<span class="token punctuation">(</span><span class="token string">"Total size: %lld bytes<span class="token entity" title="\n">\n</span>"</span>, <span class="token punctuation">(</span>long long<span class="token punctuation">)</span>st.st_size<span class="token punctuation">)</span><span class="token punctuation">;</span> printf<span class="token punctuation">(</span><span class="token string">"Actual size on disk: %lld bytes<span class="token entity" title="\n">\n</span>"</span>, <span class="token punctuation">(</span>long long<span class="token punctuation">)</span>st.st_blocks * <span class="token number">512</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><hr/></p><p style="text-align:left;">I&rsquo;m used to weirdness from file systems at this point, but this is really simple. All the data is 4KB aligned (in fact, all the data is 16MB aligned). There shouldn&rsquo;t be any weirdness here.</p><p style="text-align:left;">As you can see, I&rsquo;m already working at the level of Linux syscalls, but I used strace&nbsp;to check if there is something funky going on. Nope, there was a 1:1 mapping between the code and the actual system calls issued.</p><p style="text-align:left;">That means that I have to debug deeper if I want to understand what is going on. This involves debugging the Linux Kernel, which is a <span style="text-decoration:underline;"><a style="color:inherit;" href="https://github.com/torvalds/linux/blob/master/fs/ext4/inode.c#L3946">Big Task</a></span>. Take a look at the code in the relevant link. I&rsquo;m fairly certain that <span style="text-decoration:underline;"><a style="color:inherit;" href="https://github.com/torvalds/linux/blob/master/fs/ext4/inode.c#L4024-L4025">the issue is in those lines</a></span>. The problem is that this cannot be, since both offset &amp; length are aligned to 4KB.</p><p style="text-align:left;">I got out my crystal ball and thinking hat and meditated on this. If you&rsquo;ll note, the difference between the expected and actual values is exactly 4KB. It almost looks like the file <em>itself</em>&nbsp;is not aligned on a 4KB boundary, but the holes must be. </p><p style="text-align:left;">Given that I just want to release this space to the operating system and 4KB is really small, I can adjust that as a fudge factor for the test. I would <em>love</em>&nbsp;to understand exactly what is going on, but so far the &ldquo;file itself is not 4KB aligned, but holes are&rdquo; is a good working hypothesis (even though my gut tells me it might be wrong). </p><blockquote><p style="text-align:left;">If you know the actual reason for this, I would love to hear it. </p></blockquote><p style="text-align:left;">And don&#39;t get me started on what happened with sparse files in macOS. There, the OS will <em>randomly</em>&nbsp;decide to mark some parts of your file as holes, making any deterministic testing really hard. </p> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/themes/prism.min.css" integrity="sha512-/mZ1FHPkg6EKcxo0fKXF51ak6Cr2ocgDi5ytaTBjsQZIH/RNs6GF6+oId/vPe3eJB836T36nXwVh/WBl/cWT4w==" crossorigin="anonymous" referrerpolicy="no-referrer" />https://www.ayende.com/blog/201665-A/debugging-the-linux-kernel-using-awesome-psychic-powers?Key=9089428b-0483-4aad-9653-44f96a66cde9https://www.ayende.com/blog/201665-A/debugging-the-linux-kernel-using-awesome-psychic-powers?Key=9089428b-0483-4aad-9653-44f96a66cde9Tue, 17 Sep 2024 12:00:00 GMTCryptographically impossible bug hunt<p style="text-align:left;">I&rsquo;m currently deep in the process of modifying the internals of Voron, trying to eke out more performance out of the system. I&rsquo;m making great progress, but I&rsquo;m also touching parts of the code that haven&rsquo;t even been looked at for a <em>long </em>time. </p><p style="text-align:left;">In other words, I&rsquo;m mucking about with the most stable and most critical portions of the storage engine. It&rsquo;s a lot of fun, and I&rsquo;m actually seeing some great results, but it is also nerve-wracking. </p><p style="text-align:left;">We have enough tests that I&rsquo;ve great confidence I would catch any actual stability issues, but the drive back toward a fully green build has been a slog.</p><p style="text-align:left;">The process is straightforward:</p><ul><li>Change something.</li><li>Verify that it works better than before.</li><li>Run the entire test suite (upward of 30K tests) to see if there are any breaks.</li></ul><p style="text-align:left;">The last part can be frustrating because it takes a <em>while</em>&nbsp;to run this sort of test suite. That would be bad enough, but some of the changes I made were things like marking a piece of memory that used to be read/write as read-only. Now any access to that memory would result in an access violation. </p><p style="text-align:left;">I fixed those in the code, of course, but we have a <em>lot</em>&nbsp;of tests, including some tests that intentionally corrupt data to verify that RavenDB behaves properly under those conditions. </p><p style="text-align:left;">One such test writes garbage to the RavenDB file, using read-write memory. The idea is to verify that the checksum matches on read and abort early. Because that test directly modifies what is now read-only memory, it generates a crash due to a memory access violation. That doesn&rsquo;t just result in a test failure, it takes the whole process down.</p><p style="text-align:left;">I&rsquo;ve gotten pretty good at debugging those sorts of issues (--blame-crash&nbsp;is fantastic) and was able to knock quite a few of them down and get them fixed. <img src="data:image/png;base64,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"/></p><p style="text-align:left;">And then there was this test, which uses encryption-at-rest. That test started to fail after my changes, and I was pretty confused about exactly what was going on. When trying to read data from disk, it would follow up a pointer to an invalid location. That is <em>not</em>&nbsp;supposed to happen, obviously. </p><p style="text-align:left;">Looks like I have a little data corruption issue on my hands. The problem is that this shouldn&rsquo;t be possible. Remember how we validate the checksum on read? When using encryption-at-rest, we are using a mechanism called AEAD (Authenticated Encryption with Associated Data). That means that in order to successfully decrypt a page of data from disk, it must have been <em>cryptographically</em>&nbsp;verified to be valid.</p><p style="text-align:left;">My test results showed, pretty conclusively, that I was generating valid data and then encrypting it. The next stage was to decrypt the data (verifying that it was valid), at which point I ended up with complete garbage.</p><p style="text-align:left;">RavenDB trusts that since the data was properly decrypted, it is valid and tries to use it. Because the data is garbage, that leads to&hellip; excitement. Once I realized what was going on, I was really confused. I&rsquo;m pretty sure that I didn&rsquo;t break 256-bit encryption, but I had a very clear chain of steps that led to valid data being decrypted (successfully!) to garbage. </p><p style="text-align:left;">It was also quite frustrating to track because any small-stage test that I wrote would return the expected results. It was only when I ran the entire system and <em>stressed</em>&nbsp;it that I got this weird scenario.</p><p style="text-align:left;">I started practicing for my Fields medal acceptance speech while digging deeper. Something here <em>had</em>&nbsp;to be wrong. It took me a while to figure out what was going on, but eventually, I tracked it down to registering to the TransactionCommit&nbsp;event when we open a new file. </p><p style="text-align:left;">The idea is that when we commit the transaction, we&rsquo;ll encrypt all the data buffers and then write them to the file. We register for&nbsp;an event to handle that, and we used to do that on a per-file basis. My changes, among other things, moved that logic to apply globally. </p><p style="text-align:left;">As long as we were writing to a single file, everything just worked. When we had enough workload to need a second file, we would encrypt the data <em>twice</em>&nbsp;and then write it to the file. Upon decryption, we would successfully decrypt the data but would end up with still encrypted data (looking like random fluff). </p><p style="text-align:left;">The fix was simply moving the event registration to the transaction level, not the file level. I committed my changes and went back to the unexciting life of bug-fixing, rather than encryption-breaking and math-defying hacks.</p> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/themes/prism.min.css" integrity="sha512-/mZ1FHPkg6EKcxo0fKXF51ak6Cr2ocgDi5ytaTBjsQZIH/RNs6GF6+oId/vPe3eJB836T36nXwVh/WBl/cWT4w==" crossorigin="anonymous" referrerpolicy="no-referrer" />https://www.ayende.com/blog/201441-B/cryptographically-impossible-bug-hunt?Key=b0e0416d-2ab6-4e40-9e90-74a7c913b24ehttps://www.ayende.com/blog/201441-B/cryptographically-impossible-bug-hunt?Key=b0e0416d-2ab6-4e40-9e90-74a7c913b24eWed, 24 Jul 2024 12:00:00 GMTPermission to pay your money, please!<p style="text-align: left;">I&rsquo;m trying to pay a SaaS bill online, and I run into the following issue. I have insufficient permissions to pay the invoice on the account. No insufficient funds, which is something that you&rsquo;ll routinely run into when dealing with payment processing. But insufficient permissions!</p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;">Is&hellip; paying something an act that requires permissions? That something that happens? Can I get <em>more</em>&nbsp;vulnerabilities like that? When I get people to drive-by pay for my bills?</p> <p style="text-align: left;">I can&rsquo;t think of a scenario where you are prevented from <em>paying</em>&nbsp;to the provider. That is&hellip; weird.</p> <p style="text-align: left;">And now I&rsquo;m in this &ldquo;nice&rdquo; position where I have to chase after the provider to <em>give them money</em>, because otherwise they&rsquo;ll close the account.</p>https://www.ayende.com/blog/200865-A/permission-to-pay-your-money-please?Key=394e981a-ce0f-4dd0-8773-8b34736558e0https://www.ayende.com/blog/200865-A/permission-to-pay-your-money-please?Key=394e981a-ce0f-4dd0-8773-8b34736558e0Mon, 25 Mar 2024 12:00:00 GMTChallenge: Spot the bug<p>The following bug cost me a bunch of time, can you see what I&rsquo;m doing wrong?</p> <blockquote> <script src="https://gist.github.com/ayende/cd3d6a7efae64b9725a3a9083625d4c1.js"></script> </blockquote> <p>For fun, it&rsquo;s so nasty because usually, it will accidentally work.</p>https://www.ayende.com/blog/200161-C/challenge-spot-the-bug?Key=277eeb3d-ea55-4969-a179-95bd86ebece9https://www.ayende.com/blog/200161-C/challenge-spot-the-bug?Key=277eeb3d-ea55-4969-a179-95bd86ebece9Tue, 19 Sep 2023 12:00:00 GMTSolving heap corruption errors in managed applications<p>RavenDB is a .NET application, written in C#. It also has a <em>non trivial</em> amount of unmanaged memory usage. We absolutely need that to get the proper level of performance that we require.</p> <p>With managing memory manually, there is also the possibility that we&rsquo;ll mess it up. We run into one such case, when running our full test suite (over 10,000 tests) we would get random crashes due to heap corruption. Those issues are <em>nasty</em>, because there is a big separation between the root cause and the actual problem manifesting.</p> <p>I recently learned that you can use <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/gflags-and-pageheap">the gflags tool on .NET executables</a>. We were able to narrow the problem to a single scenario, but we still had no idea where the problem really occurred. So I installed the <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools">Debugging Tools for Windows</a> and then executed:</p> <blockquote> <pre> &amp;"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable C:\Work\ravendb-6.0\test\Tryouts\bin\release\net7.0\Tryouts.exe</pre> </blockquote> <p>What this does is enable a special debug heap at the executable level, which applies to <em>all</em> operations (managed and native memory alike).</p> <p>With that enabled, I ran the scenario in question:</p> <blockquote> <p>PS C:\Work\ravendb-6.0\test\Tryouts&gt;&nbsp; C:\Work\ravendb-6.0\test\Tryouts\bin\release\net7.0\Tryouts.exe<br /> 42896<br /> Starting to run 0<br /> Max number of concurrent tests is: 16<br /> Ignore request for setting processor affinity. Requested cores: 3. Number of cores on the machine: 32.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; To attach debugger to test process (x64), use proc-id: 42896. Url <a href="http://127.0.0.1:51595">http://127.0.0.1:51595</a><br /> Ignore request for setting processor affinity. Requested cores: 3. Number of cores on the machine: 32.&nbsp; License limits: A: 3/32. Total utilized cores: 3. Max licensed cores: 1024<br /> <a href="http://127.0.0.1:51595/studio/index.html#databases/documents?&amp;database=Should_correctly_reduce_after_updating_all_documents_1&amp;withStop=true&amp;disableAnalytics=true">http://127.0.0.1:51595/studio/index.html#databases/documents?&amp;database=Should_correctly_reduce_after_updating_all_documents_1&amp;withStop=true&amp;disableAnalytics=true</a><br /> Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.<br />&nbsp;&nbsp;&nbsp; at Sparrow.Server.Compression.Encoder3Gram`1[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Encode(System.ReadOnlySpan`1&lt;Byte&gt;, System.Span`1&lt;Byte&gt;)<br />&nbsp;&nbsp;&nbsp; at Sparrow.Server.Compression.HopeEncoder`1[[Sparrow.Server.Compression.Encoder3Gram`1[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Sparrow.Server, Version=6.0.0.0, Culture=neutral, PublicKeyToken=37f41c7f99471593]].Encode(System.ReadOnlySpan`1&lt;Byte&gt; ByRef, System.Span`1&lt;Byte&gt; ByRef)<br />&nbsp;&nbsp;&nbsp; at Voron.Data.CompactTrees.PersistentDictionary.ReplaceIfBetter[[Raven.Server.Documents.Indexes.Persistence.Corax.CoraxDocumentTrainEnumerator, Raven.Server, Version=6.0.0.0, Culture=neutral, PublicKeyToken=37f41c7f99471593],[Raven.Server.Documents.Indexes.Persistence.Corax.CoraxDocumentTrainEnumerator, Raven.Server, Version=6.0.0.0, Culture=neutral, PublicKeyToken=37f41c7f99471593]](Voron.Impl.LowLevelTransaction, Raven.Server.Documents.Indexes.Persistence.Corax.CoraxDocumentTrainEnumerator, Raven.Server.Documents.Indexes.Persistence.Corax.CoraxDocumentTrainEnumerator, Voron.Data.CompactTrees.PersistentDictionary)<br />&nbsp;&nbsp;&nbsp; at Raven.Server.Documents.Indexes.Persistence.Corax.CoraxIndexPersistence.Initialize(Voron.StorageEnvironment)</p> </blockquote> <p>That pinpointed things so I was able to know exactly where we are messing up.</p> <p>I was also able to reproduce the behavior on the debugger:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Solving-heap-corruption-errors-in-manage_B4AE/image%20(3)_2.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="image (3)" src="https://ayende.com/blog/Images/Open-Live-Writer/Solving-heap-corruption-errors-in-manage_B4AE/image%20(3)_thumb.png" alt="image (3)" width="1394" height="306" border="0" /></a></p> <p>This saved me <em>hours </em>or <em>days</em> of trying to figure out where the problem actually is.</p>https://www.ayende.com/blog/199682-B/solving-heap-corruption-errors-in-managed-applications?Key=9d558341-07d7-46a6-be46-f94cb752404ehttps://www.ayende.com/blog/199682-B/solving-heap-corruption-errors-in-managed-applications?Key=9d558341-07d7-46a6-be46-f94cb752404eWed, 05 Jul 2023 12:00:00 GMTBug chasing, narrowing down the scope<p>I just completed a major refactoring of a piece of code inside RavenDB that is responsible for how we manage sorted queries. The first two tiers of tests all passed, which is great. Now was the time to test how this change performed. I threw 50M records into RavenDB and indexed them. I did&hellip; not <em>like</em> the numbers I got back. It makes sense, since I was heavily refactoring to get a particular structure, I could think of a few ways to improve performance, but I like doing this based on profiler output.</p> <p>When running the same scenario under the profiler, the process crashed. That is&hellip; quite annoying, as you can imagine. In fact, I discovered a really startling issue.</p> <p>If I index the data and query on it, I get the results I expect. If I restart the process and run the <em>same query, </em>I get an ExecutionEngineException. Trying to debug those is a PITA. In this case, I&rsquo;m 100% at fault, we are doing a <em>lot</em> of unsafe things to get better performance, and it appears that I messed up something along the way. But my only reproduction is a 50M records dataset. To give some context, this means 51GB of documents to be indexed and 18 GB of indexing. Indexing this in release mode takes about 20 minutes. In debug mode, it takes a <em>lot</em> longer.</p> <p>Trying to find <em>an</em> error there, especially one that can only happen after you restart the process is going to be a challenging task. But this isn&rsquo;t my first rodeo. Part of good system design is knowing how to address just these sorts of issues.</p> <p>The indexing process inside RavenDB is single-threaded per index. That means that we can rule out a huge chunk of issues around race conditions. It also means that we can play certain tricks. Allow me to present you with the nicest tool for debugging that you can imagine: repeatable traces.</p> <p>Here is what this looks like in terms of code:</p> <blockquote> <script src="https://gist.github.com/ayende/e248344c5b038f2cc2bd5b654609a0cd.js"></script> </blockquote> <p>In this case, you can see that this is a development only feature, so it is really bare-bones one. What it does is capture the indexing and commit operations on the system and write them to a file. I have another piece of similarly trivial code that reads and applies&nbsp;them, as shown below. Don&rsquo;t bother to dig into that, the code itself isn&rsquo;t really that interesting. What is important is that I have captured the behavior of the system and can now replay it at will.</p> <blockquote> <script src="https://gist.github.com/ayende/447c66ac5b724a5983f51b21e2392b53.js"></script> </blockquote> <p>The code itself isn&rsquo;t much, but it does the job. What is more important, note that we have calls to StopDatabase() and StartDatabase(), I was able to reproduce the crash using this code.</p> <p>That was a massive win, since it dropped my search area from 50M documents to <em>merely</em> 1.2 million.</p> <p>The key aspect of this is that I now have a way to play around with things. In particular, instead of using the commit points in the trace, I can force a commit (and start / stop the database) every 10,000 items (by calling FlushIndexAndRenewWriteTransaction). When using that, I can reproduce this <em>far </em>faster. Here is the output when I run this in release mode:</p> <blockquote> <pre>1 With 0 2 With 10000 3 With 10000 4 With 10000 5 With 10000 6 With 10000 7 With 10000 8 With 10000 9 With 10000 10 With 10000 11 With 10000 Fatal error. Internal CLR error. (0x80131506) </pre> </blockquote> <p>So now I dropped the search area to 120,000 items, which is pretty awesome. Even more important, when I run this in debug mode, I get this:</p> <blockquote> <pre>1 With 0 2 With 10000 Process terminated. Assertion failed. at Voron.Data.Containers.Container.Get(Low...</pre> </blockquote> <p>So now I have a repro in 30,000 items, what is even better, a debug assertion was fired, so I have a really good lead into what is going on.</p> <p>The key challenge in this bug is that it is probably triggered as a result of a commit and an index of the <em>next</em> batch. There is a bunch of work that we do around batch optimizations that likely cause this sort of behavior. By being able to capture the input to the process and play with the batch size, we were able to reduce the amount of work required to generate a reproduction from 50M records to 30,000 and have a lead into what is going on.</p> <p>With that, I can now start applying more techniques to narrow down what is going on. But by far the most important aspect as far as I&rsquo;m concerned is the feedback cycle. I can now hit F5 to run the code and encounter the problem in a few seconds.</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_2.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb.png" alt="image" width="697" height="86" border="0" /></a></p> </blockquote> <p>It looks like we hit a debug assertion because we keep a reference to an item that was already freed. That is really interesting, and now I can find out <em>which</em> item and then figure out why this is the case. And at each point, I can simply go one step back in the investigation, and reproduce the state, I have to hit F5 and wait a bit. This means that I can be far more liberal in how I figure out this bug.</p> <p>This is triggered by a query on the indexed data, and if I follow up the stack, I have:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_4.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_1.png" alt="image" width="704" height="201" border="0" /></a></p> </blockquote> <p>This is really interesting, I wonder&hellip; what happens if I query <em>before</em> I restart the database? With this structure, this is easy to do.</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_6.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_2.png" alt="image" width="724" height="197" border="0" /></a></p> </blockquote> <p>This is actually a <em>big</em> relief. I had no idea why restarting the database would cause us to expose this bug.</p> <p>Another thing to note is that when I ran into the problem, I reproduced this on a query that sorted on a single field. In the test code, I&rsquo;m testing on <em>all</em> fields, so that may be an asset in exposing this faster.</p> <p>Right now the problem reproduces on the id field, which is unique. That helps, because it removes a large swath of code that deals with multiple terms for an entry. The current stage is that I can now reproduce this issue <em>without</em> running the queries, and I know exactly where it goes wrong.</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_10.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_4.png" alt="image" width="894" height="80" border="0" /></a></p> </blockquote> <p>And I can put a breakpoint on the exact location where this entry is created:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_12.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_5.png" alt="image" width="429" height="123" border="0" /></a></p> </blockquote> <p>By the way, note that I&rsquo;m modifying the code instead of using a conditional breakpoint. This is because of the performance difference. For a conditional breakpoint, the debugger has to stop execution, evaluate the condition and decide what to do. If this is run a <em>lot</em>, it can have a <em>huge</em> impact on performance. Easier to modify the code. The fact that I can do that and hit F5 and get to the same state allows me to have a lot more freedom in the ergonomics of how I work.</p> <p>This allows me to discover that the entry in question was created during the <em>second</em> transaction. But the failure happens during the <em>third</em>, which is really interesting. More to the point, it means that I can now do this:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_14.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_6.png" alt="image" width="368" height="145" border="0" /></a></p> </blockquote> <p>With the idea that this will trigger the assert on the exact entry that cause the problem. This is a good idea, and I wish that it worked, but we are actually doing a non-trivial amount of work during the commit process, so now we have a negative feedback and another clue. This is happening in the commit phase of the indexing process. It&rsquo;s not a big loss, I can do the same in the commit process as well. I have done just that and now I know that I have a problem when indexing the term: &ldquo;tweets/1212163952102137856&rdquo;. Which leads to this code:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_16.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_7.png" alt="image" width="855" height="100" border="0" /></a></p> </blockquote> <p>And at this point, I can now single step through this and figure out what is going on, I hope.</p> <p>When working on complex data structures, one of the things that you need to do is to allow to visualize them. Being able to manually inspect the internal structure of your data structures can save you a <em>lot</em> of debugging. As I mentioned, this isn&rsquo;t my first rodeo. So when I narrowed it down to a specific location, I started looking into exactly what is going on.</p> <p>Beforehand, I need to explain a couple of terms (pun intended):</p> <ul> <li>tweets/1212163952102137856 &ndash; this is the entry that <em>triggers</em> the error.</li> <li>tweets/1212163846623727616 &ndash; this is the term that should be returned for 1679560</li> </ul> <p>Here is what the structure looks like at the time of the insert:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_18.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-narrowing-down-the-scope_984B/image_thumb_8.png" alt="image" width="684" height="270" border="0" /></a></p> </blockquote> <p>You can notice that the value here for the last page is the same as the one that we are checking for 1679560.</p> <p>To explain what is going on will take us down a pretty complex path that you probably don&rsquo;t care about, but the situation is that we are keeping track of the id in two locations. Making sure to add and remove it in both locations as appropriate. <em>However</em>, at certain points, we may decide to shuffle things around inside the tree, and we didn&rsquo;t sync that up properly with the rest of the system, leading to a dangling reference.</p> <p>Now that I know what is going on, I can figure out how to fix it. But the story of this post was mostly about how I figured it out, not the bug itself.</p> <p>The key aspect was to get to the point where I can reproduce this easily, so I can repeat it as many times that is needed to slowly inch closer to the solution.</p>https://www.ayende.com/blog/199457-B/bug-chasing-narrowing-down-the-scope?Key=ae76509f-0c74-4d15-a2e5-da5a93a273f4https://www.ayende.com/blog/199457-B/bug-chasing-narrowing-down-the-scope?Key=ae76509f-0c74-4d15-a2e5-da5a93a273f4Fri, 05 May 2023 12:00:00 GMTBug chasing, the process is more important than the result<p>I&rsquo;m doing a pretty major refactoring inside of RavenDB right now. I was able to finish a bunch of work and submitted things to the CI server for testing. RavenDB has several layers of tests, which we run depending on context.</p> <p>During development, we&rsquo;ll usually run the FastTests. About 2,300 tests are being run to validate various behaviors for RavenDB, and on my machine, they take just over 3 minutes to complete. The next tier is the SlowTests, which run for about 3 hours on the CI server and run about 26,000 tests. Beyond that we actually have a few more layers, like tests that are being run only on the nightly builds and stress tests, which can take several minutes each to complete.</p> <p>In short, the usual process is that you write the code and write the relevant tests. You also validate that you didn&rsquo;t break anything by running the FastTests locally. Then we let CI pick up the rest of the work. At the last count, we had about 9 dedicated machines as CI agents and given our workload, an actual full test run of a PR may complete the next day.</p> <p>I&rsquo;m mentioning all of that to explain that when I reviewed the build log for my PR, I found that there were a bunch of tests that failed. That was reasonable, given the scope of my changes. I sat down to grind through them, fixing them one at a time. Some of them were <em>quite</em> important things that I didn&rsquo;t take into account, after all. For example, one of the tests failed because I didn&rsquo;t account for sorting on a dynamic numeric field. Sorting on a numeric field worked, and a dynamic text field also worked. But dynamic numeric field didn&rsquo;t. It&rsquo;s the sort of thing that I would never think of, but we got the tests to cover us.</p> <p>But when I moved to the next test, it didn&rsquo;t fail. I ran it again, and it still didn&rsquo;t fail. I ran it in a loop, and it failed on the 5th iteration. That&hellip; sucked. Because it meant that I had a race condition in there somewhere. I ran the loop again, and it failed <em>again</em> on the 5th. In fact, in every iteration I tried, it would only fail on the 5th iteration.</p> <p>When trying to isolate a test failure like that, I usually run that in a loop, and hope that with enough iterations, I&rsquo;ll get it to reproduce. Having it happen constantly on the 5th iteration was&hellip; really strange. I tried figuring out what was going on, and I realized that the test was generating 1000 documents using a random. The fact that I&rsquo;m using Random is the reason it is non-deterministic, of course, except that this is the code inside my test base class:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_2.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_thumb.png" alt="image" width="450" height="47" border="0" /></a></p> </blockquote> <p>So this is <em>properly</em> initialized with a seed, so it will be consistent.</p> <p>Read the code again, do you see the problem?</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_7.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_thumb_2.png" alt="image" width="450" height="47" border="0" /></a></p> </blockquote> <p>That is a <em>static</em> value. So there are two problems here:</p> <ul> <li>I&rsquo;m getting the <em>bad</em> values on the fifth run in a consistent manner because that is the set of results that reproduce the error.</li> <li>This is a <em>shared</em> instance that may be called from multiple tests at once, leading to the wrong result because Random is not thread safe.</li> </ul> <p>Before fixing this issue so it would run properly, I decided to use an ancient debugging technique. It&rsquo;s called printf().</p> <p>In this case, I wrote out all the values that were generated by the test and wrote a <em>new</em> test to replay them. <em>That</em> one failed consistently.</p> <p>The problem was that it was still too big in scope. I iterated over this approach, trying to end up with a smaller section of the codebase that I could invoke to repeat this issue. <em>That</em> took most of the day. But the end result is a test like this:</p> <blockquote> <script src="https://gist.github.com/ayende/1af4847d0f7dc293f6b075824ca8c3d8.js"></script> </blockquote> <p>As you can see, in terms of the amount of code that it invokes, it is pretty minimal. Which is pretty awesome, since that allowed me to figure out what the problem was:</p> <blockquote> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_9.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Bug-chasing-the-process-is-more-importan_FFE0/image_thumb_3.png" alt="image" width="247" height="76" border="0" /></a></p> </blockquote> <p>I&rsquo;ve been developing software professionally for over two decades at this point. I still get caught up with things like that, sigh.</p>https://www.ayende.com/blog/199425-B/bug-chasing-the-process-is-more-important-than-the-result?Key=25f17f7f-bece-4fee-98d2-91ccbe9df5e8https://www.ayende.com/blog/199425-B/bug-chasing-the-process-is-more-important-than-the-result?Key=25f17f7f-bece-4fee-98d2-91ccbe9df5e8Thu, 04 May 2023 12:00:00 GMTDebugging native memory issues in a C# application<p>I&rsquo;m working on improving the performance of Corax, RavenDB&rsquo;s new search engine. Along the way, I introduced a bug, a fairly nasty one. At a random location, while indexing a ~50 million documents corpus, we are getting an access violation exception. That means that I messed something up.</p> <p>That makes sense, given that my changes were mostly about making things lower-level. Working directly with pointers and avoiding length checks. At our speed, even the use of Span can be a killer for performance, and we want to be as close to the raw metal as possible. The particular changeset that I was working on was able to improve the indexing speed from 90,000 per second to 120,000 per second. That is a change that I absolutely <em>want</em> to keep, so I started investigating it.</p> <p>I mentioned that it is a <em>fairly</em> nasty problem. A truly nasty problem would be heap corruption that is discovered after the fact and is very hard to trace. In this case, it was <em>not</em> consistent, which is <em>really</em> strange. One of <em>the</em> important aspects of Corax is that it is single-threaded, which means that a lot of complexity is out the window. It means that for the same input, we always have the same behavior. If there is any variance, such as <em>not</em> crashing all the time, it means that there are external factors involved.</p> <p>At any rate, given that it happened at least half the time, I was able to attach WinDBG to the process and wait for the exception to happen, this is what I got:</p> <blockquote> <pre>(5e20.1468): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. Corax!Corax.IndexWriter.AddEntriesToTermResultViaSmallPostingList+0x953: 00007ffa`24dcea53 c4e261902411 vpgatherdd xmm4,dword ptr [rcx+xmm2],xmm3 ds:0000026d`516514e7=????????</pre> </blockquote> <p>Now, look at the last line, that is an interesting one, we use the VPGATHERDD assembly instruction. It is gathering packed DWORD values, in C#, this is generated using the Avx2.GatherVector128() method. We are using that to do some bit packing in this case, so this makes a lot of sense.</p> <p>Next, let&rsquo;s see what we get from the exception:</p> <blockquote> <pre>0:074&gt; .exr -1 ExceptionAddress: 00007ffafc2bfe7c (KERNELBASE!RaiseException+0x000000000000006c) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000080 NumberParameters: 2 Parameter[0]: 0000000000000000 Parameter[1]: 0000026d51650000 Attempt to read from address 0000026d51650000</pre> </blockquote> <p>All of this points to an out-of-bounds read, but why is that? The call we have for GatherVector128() is used inside a method named: ReadAvx2(). And this method is called like this:</p> <blockquote> <pre>private unsafe static ulong Read(int stateBitPos, byte* inputBufferPtr, int bitsToRead, int inputBufferSize, out int outputStateBit) { if ((stateBitPos + bitsToRead) / 8 &gt;= inputBufferSize) throw new ArgumentOutOfRangeException(); if ( Avx2.IsSupported) { return ReadAvx2(stateBitPos, inputBufferPtr, bitsToRead, out outputStateBit); } return ReadScalar(stateBitPos, inputBufferPtr, bitsToRead, out outputStateBit); }</pre> </blockquote> <p>It is an optimized approach to read some bits from a buffer, I&rsquo;ll skip the details on exactly how this works. As you can see, we have a proper bounds check here, ensuring that we aren&rsquo;t reading past the end of the buffer.</p> <p>Except&hellip;</p> <p>That we aren&rsquo;t actually checking this. What we are doing is checking that we can access the <em>bytes</em> range, but consider the following scenario:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Debugging-native-memory-issues-in-a-C-ap_817C/image_2.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Debugging-native-memory-issues-in-a-C-ap_817C/image_thumb.png" alt="image" width="625" height="152" border="0" /></a></p> <p>We have a memory page and a buffer that is located toward the end of it.&nbsp; We are now trying to access the last bit in the buffer, using ReadAvx2(). If we&rsquo;ll check the actual bytes range, it will pass, we are trying to access the last byte.</p> <p>However, we are going to call GatherVector128(), which means that we&rsquo;ll actually access 16 bytes(!), and only the first byte is in the valid memory range, the rest is going to be read from the next page, which isn&rsquo;t mapped.</p> <p>This also explains why we are not always failing. If the <em>next </em>page is valid (which is subject to the decisions of the operating system allocator), it will pass. So that is why we didn&rsquo;t have 100% reproduction. In fact, this is the sort of bug that is very easy to hide for a very long time in the system, given that it is dependent on the actual memory structure of the application.</p> <p>Once we figured out what was going on, it was pretty easy to understand, but the fact that the AVX instructions will read after the end of the buffer was really confusing. Because even when we used Span, and its range checks, it would be completely ignored. Makes total sense, given that those aren&rsquo;t really methods, but compiler intrinsics that are translated to direct machine instructions.</p> <p>Amusingly enough, now that we found the problem, we ran into something very similar a long while ago. Then it was <a href="https://ayende.com/blog/185185-C/production-postmortem-the-arm-is-killing-me">the wrong instruction</a> being used (loading a word, instead of a byte), that would fail, but the same overal setup. It will sometimes fail, depending on the state of the <em>next</em> page in the memory.</p> <p>We actually built some tooling around managing that, we call that electric fence memory. We allocate memory so any out-of-band access would <em>always</em> hit invalid memory, stopping us in our tracks. That means that I can get <em>easy</em> reproduction of those sorts of issues, and once we have that, the rest isn&rsquo;t really that interesting, to be honest. It&rsquo;s just a normal bug fix. It&rsquo;s the hunt for the root cause that is both incredibly frustrating and quite rewarding.</p>https://www.ayende.com/blog/199265-A/debugging-native-memory-issues-in-a-c-application?Key=8667f482-df0e-4b5b-8ff9-f4b69797e8b5https://www.ayende.com/blog/199265-A/debugging-native-memory-issues-in-a-c-application?Key=8667f482-df0e-4b5b-8ff9-f4b69797e8b5Mon, 10 Apr 2023 12:00:00 GMTProduction postmortem: The server ate all my memory<p>A customer reported a scenario where RavenDB was using stupendous amounts of memory. In the orders of tens of GB on a system that didn&rsquo;t have that much load.</p> <p>Our first suspicion was that this is an issue with reading the metrics, since RavenDB will <a href="https://ayende.com/blog/181729-C/understanding-memory-utilization-in-ravendb">try to keep as much of the data in memory</a>, which sometimes leads users to worry. <a href="https://ayende.com/blog/181729-C/understanding-memory-utilization-in-ravendb">I spoke about this at length in the past</a>.</p> <p>In this case, that wasn&rsquo;t the case. We were able to drill down into the exact cause of the memory usage and we found out that RavenDB <em>was</em> using an abnormally high amount of memory. The question was why that was, exactly.</p> <p>We looked into the common operations on the server, and we found a suspicious query, it looked something like this:</p> <blockquote> <p><span style="font-family: Consolas;"><span style="color: #0000ff;">from index</span> 'Sales/Actions'<br /><span style="color: #0000ff;"> where</span> <span style="color: #9b00d3;">endsWith</span>(WorkflowStage, '/Final')</span></p> </blockquote> <p>The <em>endsWith</em> query was suspicious, so we looked into that further. In general, <em>endsWith</em> requires us to scan all the unique terms for a particular field, but in most cases, there aren&rsquo;t that many unique values for a field. In this case, however, that wasn&rsquo;t the case, here are some of the values for WorkflowStage:</p> <ul> <li>Workflows/3a1af12a-b5d2-4c96-9348-177ebaacab6c/Step-2</li> <li>Workflows/6aacc86c-2f28-4b8b-8dee-1024314d5add/Final</li> </ul> <p>In total, there were about 250 <em>million&nbsp;</em>sales in the database, each one of them with a unique WorflowStage value.</p> <p>What does this mean, in terms of RavenDB query execution? Well, the fields are indexed, but we need to effectively do:</p> <blockquote> <script src="https://gist.github.com/ayende/eb784b0fba00fd8b4caf20fdfa9f8ef6.js"></script> </blockquote> <p>This isn&rsquo;t the actual code, but it will show you what is going on.</p> <p>In other words, in order to process this query, we have to scan (and materialize) all 250 million unique terms for this field. Obviously that is going to consume a lot of memory.</p> <p>But what is the solution to that? Instead of doing an expensive <em>endsWith</em> query, we can move the computation from the query time to the index time.</p> <p>In other words, instead of indexing the <em>WorkflowStage </em>field&nbsp; as is, we&rsquo;ll extract the information we want from it. The index would have one of those:</p> <blockquote> <p>IsFinalWorkFlowStage = doc.WorkflowStage.EndsWith(&ldquo;/Final&rdquo;),</p> <p>WorkflowStagePostfix = doc.WorkflowStage.Split(&lsquo;/&rsquo;).Last()</p> </blockquote> <p>The first one will check whether&nbsp;the value is final or not, while the second just gets the (one of hopefully a few) postfixes for the field. We can then query using equality instead of <em>endsWith</em>, leading to far better performance and greatly reduced memory usage, since we don&rsquo;t need to materialize any values during the query.</p>https://www.ayende.com/blog/198913-C/production-postmortem-the-server-ate-all-my-memory?Key=ed9c76e7-cf4c-4660-a3e1-188a53117d66https://www.ayende.com/blog/198913-C/production-postmortem-the-server-ate-all-my-memory?Key=ed9c76e7-cf4c-4660-a3e1-188a53117d66Fri, 27 Jan 2023 12:00:00 GMTProduction postmortem: The big server that couldn’t handle the load<p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-big-server-tha_EA92/image_2.png"><img style="border: 0px currentcolor; float: left; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-big-server-tha_EA92/image_thumb.png" alt="image" width="141" height="90" align="left" border="0" /></a> A user of ours called us, quite frantic. They are running a lot of systems on RavenDB, and have been for quite some time.</p> <p>However, very recently they started to run into severe issues. RavenDB would complain that there isn&rsquo;t sufficient memory to run.</p> <p>The system metrics, however, said that there are still gobs of GBs available (I believe that this is the appropriate technical term).</p> <p>After verifying the situation, the on-call engineer escalated the issue. The problem was <em>weird</em>. There <em>was</em> enough memory, for sure, but for some reason RavenDB would be unable to run properly.</p> <p>An important aspect is that this user is running a multi-tenant system, with each tenant being served by its own database. Each database has a few indexes as well.</p> <p>Once we figured <em>that</em> out, it was actually easy to understand what is going on.</p> <p>There are actually quite a few limits that you have to take into account. <a href="https://ayende.com/blog/197635-A/production-postmortem-out-of-memory-on-a-clear-sky">I talked about them here</a>. In that post, the issue was the maximum number of tasks defined by the system. After which, you can no longer create new threads.</p> <p>In this case, the suspect was: vm.max_map_count.</p> <p>Beyond just total memory, Linux has a limit on the number of memory <em>mappings</em> that a process may have. And RavenDB uses Voron, which is based on <em>mmap</em>(), and each database and each index typically have multiple maps going on.</p> <p>Given the number of databases involved&hellip;</p> <p>The solution was to increase the max_map_count and add a task for us, to give a warning to the user ahead of time when they are approaching the system's limits.</p>https://www.ayende.com/blog/198881-C/production-postmortem-the-big-server-that-couldnt-handle-the-load?Key=a4b4820b-d2b8-4e52-9a3c-69229409e55dhttps://www.ayende.com/blog/198881-C/production-postmortem-the-big-server-that-couldnt-handle-the-load?Key=a4b4820b-d2b8-4e52-9a3c-69229409e55dMon, 23 Jan 2023 12:00:00 GMTProduction postmortem: The heisenbug server<p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-hiesien_ABC0/image_2.png"><img style="border: 0px currentcolor; float: right; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-hiesien_ABC0/image_thumb.png" alt="image" width="284" height="284" align="right" border="0" /></a>A user reported that they observed nodes in the cluster &ldquo;going dark&rdquo;. Basically, they would stop communicating with the rest of the cluster, but would otherwise appear functional. Both the internal and external metrics were all fine, the server would just stop responding to anything over the network. The solution for the problem was to restart the service (note, the service, not the whole machine), but the problem would happen every few days.</p> <p>As you can imagine, we are taking this sort of thing <em>very</em> seriously, so we looked into the problem. And we came up short. The problem made <em>absolutely</em> no sense. The problem occurred on a (minor) version migration, but there was absolutely nothing related to this that could cause it. What was <em>really</em> weird was that the <em>service </em>itself continue to work. We could see log entries being written and it was able to execute scheduled backups, for example. It would just refuse to talk to us over the network.</p> <p>That was <em>super</em> strange, since the <em>network </em>itself was fine. All the monitoring systems were green, after all. For that matter, the user was able to SSH into the system to restart the service. This didn&rsquo;t match with any other issue we could think of. Since the user worked around the problem by restarting the server, we didn&rsquo;t have a lead.</p> <p>Then we noticed the exact same problem in one of our cloud instances, and there we have much better diagnostic capabilities. Once we had noticed a problematic server, we were able to SSH into that and try to figure out what was going on.</p> <p>Here is what we found out:</p> <ul> <li>The server will not respond to HTTP(s) communication either from outside the machine or by trying to connect from <em>inside</em> the machine.</li> <li>The server <em>will</em> respond to SNMP queries both from inside the machine and outside of it (which is how we typically monitor the system).</li> </ul> <p>When we designed RavenDB, we implemented a &ldquo;maintenance hatch&rdquo; for such scenarios, in addition to using HTTP(s) for communication, RavenDB also exposes a named pipe that allows you to connect to the server without going through the network at all. This ensures that if you have administrator privileges on the server, you are able to connect even if there are network issues, certificate problems, etc.</p> <p>Here is the kicker. Under this particular situation, we <em>could</em> <em>not </em>activate this escape hatch. That is not supposed to be possible. Named pipes on Linux, where we run into the problem, are basically Unix Sockets. A network issue such as a firewall problem or something similar isn&rsquo;t going to affect them.</p> <p>At the same time, we were able to communicate with the process using SNMP. What is the problem?</p> <p>Lacking any other options, we dumped the process, restarted the service, and tried to do the analysis offline. We couldn&rsquo;t find any problem. All the details we looked at said that everything was fine, the server <em>was</em> properly listening to new connections and it <em>should</em> work. That was&hellip; weird.</p> <p>And then it happened again, and we did the same analysis, and it came back the same. We were clueless. One of the things that we updated between versions was the .NET runtime that we were using, so we <a href="https://github.com/dotnet/runtime/issues/79446">opened an issue</a> to see if anyone ran into the same problem.</p> <p>And then it happened again. This time, we knew that just looking at the dump wouldn&rsquo;t help us, so we tried other avenues. Linux has a pretty rich set of knobs and dials that you can look at to see what was going on. We suspected that this may be an issue with running out of file descriptors, running out of memory, etc.</p> <p>We tried looking into what is going on inside the process using <em>strace</em>, and everything was <strong>fine</strong>. The trace clearly showed that the server was processing requests and was able to send and receive data properly.</p> <p>Wait, go through that statement again please!</p> <p>It is fine? But the reason we are using <em>strace</em> is that there is a problem. It looks like the problem fixed itself. That was annoying, because we were hoping to use the trace to figure out what is going on. We added more monitoring along the way, which would let us know if the server found itself isolated. And we waited.</p> <p>The next time we ran into the problem, the first thing we did was run <em>strace, </em>we needed to get the root cause as soon as possible, and we were afraid that it would fix itself before we had a chance to get to the root cause. The moment we used <em>strace</em>, the server got back online, continuing as if there was never any issue.</p> <p>Over the next few instances of this issue, we were able to confirm the following observations:</p> <ol> <li>The service would stop responding to TCP and Unix Sockets entirely.</li> <li>There were <em>no</em> firewall or network issues.</li> <li>The service was up and functional, tailing the log showed activity.</li> <li>We could query the server state using SNMP.</li> <li>Running strace on the service process would fix the problem.</li> </ol> <p>There are a few more things, the actual trigger for the fix wasn&rsquo;t strace itself. It was the <em>ptrace()</em> call, which it uses. That would cause the service to start responding again. The <em>ptrace() </em>call is basically the beginning and the end of debugging under Linux. <em>Everything </em>uses it.</p> <p>If you want to dump a memory process, you start with <em>ptrace()</em>. You want to trace the calls, <em>ptrace(). </em>You want to <em>debug </em>the process? GDB will start by calling <em>ptrace()</em>, etc.</p> <p>And doing that would alleviate the problem.</p> <p>That was&hellip; quite annoying.</p> <p>We still had absolutely no indication of what the root cause even was.</p> <p>We suspected it may be something inside Kestrel that was causing a problem. But that wouldn&rsquo;t affect the named pipes / Unix sockets that we also saw.</p> <p>Networking <em>worked</em>, because SNMP did. We thought that this may be because SNMP uses UDP instead of TCP, and looked into that, but we couldn&rsquo;t figure out how that would be any different.</p> <p>Looking at this further, we found that we have this in the code dumps:</p> <blockquote> <pre><code> ~~~~ 5072 1 Interop+Sys.WaitForSocketEvents(IntPtr, SocketEvent*, Int32*) 1 System.Net.Sockets.SocketAsyncEngine.EventLoop() 1 System.Net.Sockets.SocketAsyncEngine+&lt;&gt;c.ctor&gt;b__14_0(Object)</code></pre> </blockquote> <p>As you can see, we are waiting for this in the .NET Sockets thread. The SNMP, on the other hand, looked like:</p> <blockquote> <p><span style="font-family: 'Courier New';">Thread (0x559):<br />&nbsp;&nbsp; [Native Frames]<br />&nbsp;&nbsp; System.Net.Sockets!System.Net.Sockets.SocketPal.SysReceive()<br />&nbsp;&nbsp; System.Net.Sockets!System.Net.Sockets.SocketPal.TryCompleteReceiveFrom()<br />&nbsp;&nbsp; System.Net.Sockets!System.Net.Sockets.SocketAsyncContext.ReceiveFrom()<br />&nbsp;&nbsp; System.Net.Sockets!System.Net.Sockets.SocketPal.ReceiveFrom()<br />&nbsp;&nbsp; System.Net.Sockets!System.Net.Sockets.Socket.ReceiveFrom()<br />&nbsp;&nbsp; SharpSnmpLib.Engine!Lextm.SharpSnmpLib.Pipeline.ListenerBinding.AsyncReceive()<br /> </span></p> </blockquote> <p>That was really interesting, since it meant that for sockets (both HTTP and Unix), we were always using async calls, but for SNMP, we were using the synchronous API. We initially suspected that this may be something related to the thread pool. Maybe we had something that blocked it, but it turns out to be a lot more interesting. Here is the code that is actually <em>handling</em> the SNMP:</p> <blockquote> <p>var count = _socket.ReceiveFrom(buffer, ref remote);</p> <p>Task.Factory.StartNew(() =&gt; HandleMessage(buffer, count, (IPEndPoint)remote));</p> </blockquote> <p>In other words, we are actually reading from the socket in a blocking manner, but then processing the actual message using the thread pool. So being able to get results via SNMP meant the thread pool was well.</p> <p>At this point we resulted to hair pulling, rubber ducking and in some instances, shaking our fists to heaven.</p> <p>I reminded myself that I&rsquo;m an adult with a bit of experience solving problems, and dug deeper. We started looking into how .NET is actually <a href="https://github.com/dotnet/runtime/blob/e52462326be03fb329384b7e04a33d3eb7c16736/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs#L176">handling sockets in async mode.</a> This end up <a href="https://github.com/dotnet/runtime/blob/e52462326be03fb329384b7e04a33d3eb7c16736/src/native/libs/System.Native/pal_networking.c#L2727">here, doing a system call</a>:</p> <blockquote> <p>while ((numEvents = epoll_wait(port, events, *count, -1)) &lt; 0 &amp;&amp; errno == EINTR);</p> </blockquote> <p>Reading through the man page for <em>epoll_wait()</em> I learned how <em>epoll</em>() works, that it is complex and that we need to be aware of level-triggered and edge-triggered options. Since .NET uses <a href="https://github.com/dotnet/runtime/blob/e52462326be03fb329384b7e04a33d3eb7c16736/src/native/libs/System.Native/pal_networking.c#LL2693C60-L2693C67">edge-triggered</a> events (EPOLLET, which I keep reading as electronic chicken), we focused on that.</p> <p>There are a <em>lot</em> of edge cases and things to cover, but everything we checked was handled properly. We finally had a good smoking gun. For some reason, we weren&rsquo;t getting notifications from <em>epoll</em>(), even though we should. Using <em>strace()</em> or friends somehow fixes that.</p> <p>We actually <em>found</em> the <a href="https://stackoverflow.com/questions/20272845/strace-fixes-hung-process">exact scenario we saw in StackOverflow</a>, but without any idea what the issue was. <a href="https://xkcd.com/979/">Truly, there is an XKCD for everything</a>.</p> <p>Our current understanding of the issue:</p> <ul> <li>All async sockets in .NET are going through the same socket engine, and are using <em>epoll</em>() under the covers.</li> <li>SNMP is using <em>synchronous</em> calls, so it wasn&rsquo;t using <em>epoll()</em>.</li> </ul> <p>That covers both of the weird things that we are seeing. So what is the issue?</p> <p>It is not in .NET. Given the size &amp; scope of .NET, we wouldn&rsquo;t be the only ones seeing that. Below .NET, there is the kernel, so we looked into that. The machines we were running that on were using kernel 5.4.0-azure-1095, so we looked into that.</p> <p>And it looked like it is <a href="https://lore.kernel.org/linux-fsdevel/[email protected]/#r">a kernel bug</a>, which was fixed in the <a href="https://bugs.launchpad.net/ubuntu/+source/containerd/+bug/1996678/comments/28">next updated kernel</a>. A race condition inside the kernel would cause us to miss wakeups, and then we would basically just stall without anything to wake us up.</p> <p>We dug deeper to understand a bit more about this situation, and <a href="https://man7.org/linux/man-pages/man2/ptrace.2.html">we got this</a>:</p> <pre> Some system calls return with <strong>EINTR </strong>if a signal was sent to a tracee, but delivery was suppressed by the tracer. (This is very typical operation: it is usually done by debuggers on every attach, in order to not introduce a bogus <strong>SIGSTOP</strong>). As of Linux 3.2.9, the following system calls are affected (this list is likely incomplete): <a href="https://man7.org/linux/man-pages/man2/epoll_wait.2.html">epoll_wait(2)</a>, and <a href="https://man7.org/linux/man-pages/man2/read.2.html">read(2)</a> from an <a href="https://man7.org/linux/man-pages/man7/inotify.7.html">inotify(7)</a> file descriptor. The usual symptom of this bug is that when you attach to a quiescent process with the command strace -p &lt;process-ID&gt; then, instead of the usual and expected one-line output such as restart_syscall(&lt;... resuming interrupted call ...&gt;_ or select(6, [5], NULL, [5], NULL_ ('_' denotes the cursor position), you observe more than one line. For example: clock_gettime(CLOCK_MONOTONIC, {15370, 690928118}) = 0 epoll_wait(4,_ What is not visible here is that the process was blocked in <a href="https://man7.org/linux/man-pages/man2/epoll_wait.2.html">epoll_wait(2)</a> before <a href="https://man7.org/linux/man-pages/man1/strace.1.html">strace(1)</a> has attached to it. Attaching caused <a href="https://man7.org/linux/man-pages/man2/epoll_wait.2.html">epoll_wait(2)</a> to return to user space with the error <strong>EINTR</strong>. In this particular case, the program reacted to <strong>EINTR </strong>by checking the current time, and then executing <a href="https://man7.org/linux/man-pages/man2/epoll_wait.2.html">epoll_wait(2)</a> again. (Programs which do not expect such "stray" <strong>EINTR </strong>errors may behave in an unintended way upon an <a href="https://man7.org/linux/man-pages/man1/strace.1.html">strace(1)</a> attach.)</pre> <p>And.. that is exactly what is happening. On attaching, the <em>epoll_wait</em>() will return with <em>EINTR</em>, which will cause .NET to retry the command, and that &ldquo;fixes&rdquo; the issue.</p> <p>It makes total sense now, and concludes the discovery process of a pretty nasty bug.</p> <p>Now, if you&rsquo;ll excuse me, I need to go and apologize to a rubber duck.</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-hiesien_ABC0/image_4.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-hiesien_ABC0/image_thumb_1.png" alt="image" width="228" height="229" border="0" /></a></p>https://www.ayende.com/blog/198849-C/production-postmortem-the-heisenbug-server?Key=1eeda567-02a8-4bbb-b90f-557523973233https://www.ayende.com/blog/198849-C/production-postmortem-the-heisenbug-server?Key=1eeda567-02a8-4bbb-b90f-557523973233Mon, 16 Jan 2023 12:00:00 GMTAnswer: What does this code print?<p>I asked the <a href="https://ayende.com/blog/198689-B/challenge-what-does-this-code-print?key=57f95b74a23443828fa5f02fb82d19b4">following question</a>, about code that uses <em>AsyncLocal</em> as well as async calls. Here is the code again:</p> <blockquote> <script src="https://gist.github.com/ayende/180ac03715165f723ffed93f228c0973.js"></script> </blockquote> <p>This code prints <em>False</em> twice, the question is why. I would expect that the <em>AsyncLocal</em> value to remain the same after the call to Start(), since that is obviously the <em>point</em> of <em>AsyncLocal. </em>It turns out that this isn&rsquo;t the case.</p> <p>AsyncLocal is good if you are trying to pass a value <em>down</em> to child tasks, but it won&rsquo;t be applicable to other tasks that are called in the same level. In other words, it works for children, not siblings tasks. This is actually even more surprising in the code above, since we don&rsquo;t do any awaits in the <em>Start</em>() method.</p> <p>The question is why? <a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading.asynclocal-1?view=net-7.0">Looking at the documentation</a>, I couldn&rsquo;t see any reason for that. Digging deeper into the source code, I figured out what is going on.</p> <p>We can use <a href="https://sharplab.io/#v2:D4AQTAjAsAUCAMACEEB0AVAFgJwKYEMATASwDsBzAblgWQgFZqYaBmZMRAZQGNdT9sxAPawA3rESTkbAIIBnAJ6luAGSHd8AGwA8AIyFDNAPkQzuAF2IA3XIgC8iUrgDupxcrUad+w0YAUAJRMUtLIABzIAGxc5gLmgRJS4jAhIWaWNqgAaloArrYO5tj5wVIAvrCJkiBsIBEg0QBKuaQJKUlVqSgAnH7p1rjZebhBnSEg3TFxgaWpdL39mTma+aPtkhUwZUA===">SharpLab.io</a> to lower the high level C# code to see what is actually going on here, which gives us the following code for the <em>Start</em>() method:</p> <blockquote> <script src="https://gist.github.com/ayende/d0fbad92269e1d9dde5767af50c15151.js"></script> </blockquote> <p>Note that we call to <em>AsyncTaskMethodBuilder.Start</em>() method, which ends up in <em>AsyncMethodBuilderCore.Start</em>(). There we have a bunch of interesting code, in particular, we remember the current thread execution context <em>before</em> we execute user code, <a href="https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncMethodBuilderCore.cs#L33-L34">here</a>. After the code is done running, we restore it if this is needed, as you can see <a href="https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncMethodBuilderCore.cs#L50-L53">here</a>.</p> <p>That looks fine, but why would the execution context change here? It turns out that one of the few places that interact with it is the <em>AsyncValue</em> itself, which ends up in the <a href="https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs#L532">ExecutionContext.SetLocalValue</a>. The way it works, each time you set an async local, it creates a new <em>layer </em>in the async stack. And when you <em>exit</em> an async call, it will reset the async stack to the place it was before the async call started.</p> <p>In other words, the <em>local</em> in the name <em>AsyncLocal</em> isn&rsquo;t a match to <em>ThreadLocal</em>, but is more similar to a local <em>variable</em>, which goes out of scope on function exit.</p> <p><a href="https://stackoverflow.com/a/37309427">This isn&rsquo;t a new thing, and there are workarounds</a>, but it was interesting enough that I decided to dig deep and understand what is actually going on.</p>https://www.ayende.com/blog/198690-B/answer-what-does-this-code-print?Key=6c670721-8ab4-4dd4-8eb5-b6d3929a5a39https://www.ayende.com/blog/198690-B/answer-what-does-this-code-print?Key=6c670721-8ab4-4dd4-8eb5-b6d3929a5a39Thu, 15 Dec 2022 12:00:00 GMTChallenge: What does this code print?<p>Take a look at the following code, what do you think it will print?</p><blockquote><script src="https://gist.github.com/ayende/180ac03715165f723ffed93f228c0973.js"></script></blockquote><p>Since it obviously doesn’t print the <em>expected</em> value, why do you think this is the case?</p>https://www.ayende.com/blog/198689-B/challenge-what-does-this-code-print?Key=57f95b74-a234-4382-8fa5-f02fb82d19b4https://www.ayende.com/blog/198689-B/challenge-what-does-this-code-print?Key=57f95b74-a234-4382-8fa5-f02fb82d19b4Wed, 14 Dec 2022 12:00:00 GMTSolving support issues in other people’s products<p>A user <a href="https://github.com/ravendb/ravendb/issues/15375">contacted us</a> to tell us that RavenDB does not work in his environment. As you can imagine, we didn&rsquo;t really like to hear that, so we looked deeper into the issue. The issue in question included the actual problem, which looked something like this:</p> <blockquote> <pre>{ "Url": "/auth/", "Type": "Raven.Client.Exceptions.Routing.RouteNotFoundException", "Message": "There is no handler for path: GET /auth/", "Error": "Raven.Client.Exceptions.Routing.RouteNotFoundException: There is no handler for path: GET /auth/\n" }</pre> </blockquote> <p>My reaction to that was&hellip; huh?!</p> <p>That is a really strange error, since RavenDB does <em>not</em> have an &ldquo;/auth/&rdquo; endpoint. The problem isn&rsquo;t with RavenDB, it is with something else.</p> <p>In this case, the user ran RavenDB on port 8080 (which is the normal thing to do) and then tried to access RavenDB in the browser.</p> <p>The problem was that they <em>previously</em> ran some other software, and that software had the following interaction:</p> <blockquote> <pre>* Connected to 127.0.0.1 port 8080 &gt; GET / HTTP/1.1 &gt; Host: 127.0.0.1 &gt; User-Agent: curl/7.85.0 &gt; Accept: */* &gt; &lt; HTTP/1.1 301 Moved Permanently &lt; Location: http://127.0.0.1:8080/auth/ &lt; Content-Type: text/html; charset=UTF-8</pre> </blockquote> <p>In other words, it redirected the browser to the &ldquo;/auth/&rdquo; endpoint. It&rsquo;s critical to understand that 301 response means: Moved Permanently. That means that they are actually cached by the browser. In this case, the scenario was reusing the same endpoint for a different software product, and the browser cache meant that we got strange results.</p>https://www.ayende.com/blog/198626-A/solving-support-issues-in-other-peoples-products?Key=c33c5575-d31c-4373-b936-187722334e8bhttps://www.ayende.com/blog/198626-A/solving-support-issues-in-other-peoples-products?Key=c33c5575-d31c-4373-b936-187722334e8bTue, 06 Dec 2022 12:00:00 GMTProduction postmortem: Do you trust this server?<p>A customer called us with a problem. They set up a production cluster successfully, they could manually verify that everything is working, except that it would fail when they try to connect to it via the client API.</p> <p>The error in question looked something like this:</p> <blockquote> <p>CertificateNameMismatchException: You are trying to contact host rvn-db-72 but the hostname must match one of the CN or SAN properties of the server certificate: CN=rvn-db-72, OU=UAT, OU=Computers, OU=Operations, OU=Jam, DC=example, DC=com, DNS Name=rvn-db-72.jam.example.com</p> </blockquote> <p>That is&hellip; a really strange error. Because they <em>were</em> accessing the server using: rvn-db-72.jam.example.com, and that was the configured certificate for it. But for some reason the RavenDB client was trying to connect directly to rvn-db-72. It <em>was</em> able to connect to it, but failed on the hostname validation because the certificates didn&rsquo;t match.</p> <p>Initially, we suspected that there is some sort of a MITM or some network appliance that got in the way, but we finally figured out that we had the following sequence of events, shown in the image below. The RavenDB client was properly configured, but when it asked the server where the database is, the server would give the wrong URL, leading to this error.</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_4.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_thumb_1.png" alt="image" width="578" height="287" border="0" /></a></p> <p>This deserves some explanation. When we initialize the RavenDB client, one of the first things that the client does is query the cluster for the URLs where it can find the database it needs to work with. This is because the distribution of databases in a cluster doesn&rsquo;t have to match the nodes in the cluster.</p> <p>Consider this setup:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_8.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_thumb_3.png" alt="image" width="582" height="358" border="0" /></a></p> <p>In this case, we have three nodes in the cluster, but the &ldquo;Orders DB&rdquo; is located only on two of them. If we query the <em>rvn-db-72</em> database for the topology of &ldquo;Orders DB&rdquo;, we&rsquo;ll get nodes <em>rvn-db-73 </em>and <em>rvn-db-74</em>. Here is what this will look like:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_10.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-Do-you-trust-this-_EABB/image_thumb_4.png" alt="image" width="536" height="362" border="0" /></a></p> <p>Now that we understand what is going on, what is the root cause of the problem?</p> <p>A misconfigured server, basically. The <em>PublicServerUrl</em> for the server in question was left as the hostname, instead of the full domain name.</p> <blockquote> <script src="https://gist.github.com/ayende/5cf12c7adf7d9dd4a0e81682ad47aa4b.js"></script> </blockquote> <p>This configuration meant that the server would give the wrong URL to the client, which would then fail.</p> <p>This is something that only the client API is doing, so the Studio behaved just fine, which made it harder to figure out what exactly is going on there. The actual fix is trivial, naturally, but figuring it out took too long. We&rsquo;ll be adding an alert to detect and resolve misconfigurations like that in the future.</p>https://www.ayende.com/blog/198305-B/production-postmortem-do-you-trust-this-server?Key=3aa88ca0-ed5a-4d0a-bca6-413bbab4df27https://www.ayende.com/blog/198305-B/production-postmortem-do-you-trust-this-server?Key=3aa88ca0-ed5a-4d0a-bca6-413bbab4df27Mon, 03 Oct 2022 12:00:00 GMTProduction postmortem: The missed indexing reference<p>RavenDB has a really nice feature, it allows you to index data from <em>related</em> documents. Consider the following document structure:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_2.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_thumb.png" alt="image" width="951" height="486" border="0" /></a></p> <p>We have tickets, vehicles, and users, and we want to issue a search on all the tickets issued to Joe. Leaving aside whether this is the proper <em>way</em> to handle this, here is what the index would look like:</p> <blockquote> <script src="https://gist.github.com/ayende/f95bb7d41a128a86c26991728edba9fe.js"></script> </blockquote> <p>What we are doing here is walk the reference graph and index data from related documents. So far, so good. The cool thing about this feature is that RavenDB is in charge of ensuring that if we update the owner of the vehicle or the name of the user, the Right Thing will happen.</p> <p>Of course, I wouldn&rsquo;t be writing this blog post if we didn&rsquo;t run into a problem in this scenario.</p> <p>The way it works, for each collection referenced by the index, RavenDB maintains a list of the last document that was chceked for changes in the collection. That way, on modification of a related document,&nbsp;we can tell that we need to re-index a particular document.</p> <p>This looks something like this:</p> <blockquote> <script src="https://gist.github.com/ayende/65e85076c25fabacb2be9df5665c2e1f.js"></script> </blockquote> <p>In other words, for each document that was loaded by another during indexing, we keep a list of the referencing documents.</p> <p>Let&rsquo;s say that we update document&nbsp;<em>vehicles/200</em>. That would be written to the storage with a new etag, and the index would wake up. It would ask to get all the documents in the Vehicles collection after etag 456, get <em>vehicles/200</em> and then check the <em>ReferencedBy</em> and find that the document <em>tickets/100</em> loaded it. At this point, it will re-index <em>tickets/100</em> to ensure we have the latest values.</p> <p>There is quite a bit more to this process, of course, I&rsquo;m skipping on a lot of optimizations and detail work. For the purpose of this post, we don&rsquo;t need any of that.</p> <p>A customer reported that (very rarely), an index similar to the one above would &ldquo;miss&rdquo; on updates. That should not be possible. As much as I love this feature, conceptually, it is a very simple one, there isn&rsquo;t much here that <em>can</em> fail. And yet, it did. Figuring out what was happening required us to look very deeply into the exact series of steps that were taken to produce this output. It turns out that our approach had a hole in it.</p> <p>We assume that the writes would always happen in an orderly fashion. In other words, that the writes would be consistent. But there is no actual requirement for that.</p> <p>Consider what happens if I write just the ticket document to the database:</p> <ul> <li>RavenDB will index the ticket document</li> <li>It will attempt to load the associated vehicle, figure out that there is no such document and move on</li> <li>The related user document, of course, is not known at this point (since there is no vehicle document)</li> </ul> <p>The end result is that we have the following data internally:</p> <blockquote> <script src="https://gist.github.com/ayende/d432cec3ec432c35450095e22b9b18dc.js"></script> </blockquote> <p>That is fine, when we&rsquo;ll add the vehicle and the user, we&rsquo;ll do the appropriate wiring, no?</p> <p>In almost all cases, that is exactly what will happen. However, consider the metadata above. We are concerned here with <em>tickets/100</em>, but there is also <em>tickets/20</em>, whose references exist properly. So the structure we have right now in terms of reference tracking is:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_4.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_thumb_1.png" alt="image" width="940" height="539" border="0" /></a></p> <p>It&rsquo;s important to note that the references are always kept from the initial 'tickets' document. So even though the path from <em>tickets/20</em> to <em>users/99 </em>goes through <em>vehicles/19</em>, the relationship is a direct association.</p> <p>What will happen if we&rsquo;ll insert just the <em>users/300</em> document now? Well, there is no reference to this document, so we&rsquo;ve no reason to do anything with it. But that isn&rsquo;t a problem. When <em>vehicles/200</em> is inserted, this will be fixed.</p> <p>On the other hand, if we add just <em>vehicles/200</em> to the database (with <em>users/300</em> not being present), that is a change in a tracked document, which will cause us to index the referencing document (<em>tickets/100</em>) again and move us to this state:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_12.png"><img style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-missed-indexin_CD3A/image_thumb_5.png" alt="image" width="931" height="298" border="0" /></a></p> <p>When we will then add <em>users/300</em>,&nbsp;document <em>tickets/100</em>&nbsp;will have the record of this reference and we&rsquo;ll re-index it.</p> <p>In other words, we are covered on both sides. Except, that there is still this pesky (and impossible) problem that the user is seeing.</p> <p>Now, consider the following state of affairs, we are back in the initial state, both <em>vehicles/200 </em>and <em>users/300</em> are missing in the database and <em>tickets/20, vehicles/19 </em>and <em>users/99</em> are there.</p> <p>We add <em>vehicles/200</em> to the database, and there is a re-indexing process going on. <em>At the same time</em> that we re-index <em>tickets/100</em> because of the new <em>vehicles/200</em> document, we are adding the <em>users/300</em> document in a <strong>separate</strong> transaction.</p> <p>That means that during the indexing of <em>tickers/100</em>, we&rsquo;ll see document&nbsp;<em>vehicles/200</em>&nbsp;but not the <em>users/300</em> document (even though it exists).</p> <p>That is still not a problem, we&rsquo;ll write the referencing record and on the next batch, detect that we have a user that we haven&rsquo;t seen and re-index the document again.</p> <p>Except&hellip; what if we didn&rsquo;t update <em>just</em> the <em>users/300</em> document in this case, what if we also updated <em>users/99</em> at the same transaction (and after we insert document&nbsp;<em>users/300</em>).</p> <p>Depending on the exact timings, we may end up missing document&nbsp;<em>users/300</em>&nbsp;(because there was no reference to it at the time) but will notice that document&nbsp;<em>users/99</em>&nbsp;was updated (we already had it referenced). Since <em>users/99 </em>was modified after <em>users/300</em>, we&rsquo;ll record that we observed all the changes in the Users collection before <em>users/99</em>. That, crucially, also includes the <em>users/300</em> that we never noticed.</p> <p>This is confusing, I&rsquo;ll freely admit. In order to reproduce this bug you need a non-standard pattern for creating references, a chain of at least two references, multiple independent references with different states,&nbsp;<em>and</em> an unlucky draw from Murphy with the exact timing of transactions, indexing and order of operations.</p> <p>The root cause was that we recorded the newly added document reference in memory, and only updated them when the entire indexing batch was completed. During that time, there may have been multiple transactions that modified the documents. But because we didn&rsquo;t sync the state until the end of the batch, we would end up missing this case. Solving the problem once we knew what was going on involved moving a single line of code from the outer loop to an inner one, basically.</p> <p>Writing a reproducible test case was actually far harder, since so many things had to fall just <em>so</em>&nbsp;this would happen. I have to admit that I don&rsquo;t have any strong conclusions about this bug. It isn&rsquo;t something systematic or an issue that we missed. It is a sequence of unfortunate events with a very low probability of occurring that we&nbsp; never actually considered.</p> <p>The really good thing about this issue is that it is the first one in this particular area of the code in quite some time. That means that this has been quite stable for many scenarios.</p>https://www.ayende.com/blog/198210-C/production-postmortem-the-missed-indexing-reference?Key=5c2437cb-f78c-4d69-a562-42520c0a1ef6https://www.ayende.com/blog/198210-C/production-postmortem-the-missed-indexing-reference?Key=5c2437cb-f78c-4d69-a562-42520c0a1ef6Thu, 15 Sep 2022 12:00:00 GMTWhat bug through yonder weirdness my build breaks?<p>We have a lot of tests for RavenDB, and we are running them on plenty of environments. We semi frequently get a build failure when running on the <a href="https://github.com/ravendb/ravendb/runs/8286680144?check_suite_focus=true">&ldquo;macOS latest&rdquo; runner</a> on GitHub.</p> <p>The problem is that the information that I have is self-contradicting. Here is the most relevant piece:</p> <blockquote> <script src="https://gist.github.com/ayende/31c5cb783877d0109c093b08f73848d9.js"></script> </blockquote> <p>Here you can see the failure itself and what is causing it.</p> <p>Note that the debug message is showing that all three variables here have the same numeric value. The <em>address</em> and the <em>current</em> variables are also held on the stack, so there is no option for race conditions, or something like that.</p> <p>I can&rsquo;t figure out any reason why this would be triggered, in this case. About the only thing that pops to mind is whether&nbsp;there is some weirdness going on with pointer comparisons on MacOS, but I don&rsquo;t have a lead to follow.</p> <p>We haven&rsquo;t investigated it properly yet, I thought to throw this to the blog and see if you have any idea what may be going on here.</p>https://www.ayende.com/blog/198242-B/what-bug-through-yonder-weirdness-my-build-breaks?Key=965ff556-3ddd-4bb0-8141-93d0f07fa3f9https://www.ayende.com/blog/198242-B/what-bug-through-yonder-weirdness-my-build-breaks?Key=965ff556-3ddd-4bb0-8141-93d0f07fa3f9Tue, 13 Sep 2022 12:00:00 GMTProduction postmortem: Efficiency all the way to Out of Memory error<p>RavenDB is written in C#, and as such, uses managed memory. As a database, however, we need granular control of our memory, so we also do manual memory management.</p> <p>One of the key optimizations that we utilize to reduce the amount of overhead we have on managing our memory is using&nbsp;an arena allocator. That is a piece of memory that we allocate in one shot from the operating system and operate on. Once a particular task is done, we can discard that whole segment in one shot, rather than try to work out exactly what is going on there. That gives us a proper <em>scope</em> for operations, which means that missing a free in some cases isn&rsquo;t the end of the world.</p> <p>It also makes the code for RavenDB memory allocation super simple. Here is what this looks like:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-memory-savings_B349/image_8.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-memory-savings_B349/image_thumb_3.png" alt="image" width="346" height="274" border="0" /></a></p> <p>Whenever we need to allocate more memory, we&rsquo;ll just bump the allocator up. Initially, we didn&rsquo;t even implement freeing memory, but it turns out that there are a <em>lot</em> of long running processes inside of RavenDB, so we needed to reuse the memory inside the same operation, not just between operations.</p> <p>The implementation of freeing memory is pretty simple, as well. If we return the last item that we allocated, we can just drop the next allocation position by how many bytes were allocated. For that matter, it also allows us to do incremental allocations. We can ask for some memory, then <em>increase</em> the allocation amount on the fly very easily.</p> <p>Here is a (highly simplified) example of how this works:</p> <blockquote> <script src="https://gist.github.com/ayende/d623acc194d7adde68b26c66f6016f3a.js"></script> </blockquote> <p>As you can see, there isn&rsquo;t much <em>there</em>. A key requirement here is that you need to return the memory back in the reverse order of how you allocated it. That is <em>usually</em> how it goes, but what if it doesn&rsquo;t happen?</p> <p>Well, then we can&rsquo;t reuse the memory directly. Instead, we&rsquo;ll place them in a free list. The actual allocations are done on powers of two, so that makes things easier. Here is what this actually looks like:</p> <p><a href="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-memory-savings_B349/image_12.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="https://ayende.com/blog/Images/Open-Live-Writer/Production-postmortem-The-memory-savings_B349/image_thumb_5.png" alt="image" width="569" height="361" border="0" /></a></p> <p>So if we free, but not from the top, we remember the location and can use it again. Note that for 2048 in the image above, we don&rsquo;t have any free items.</p> <p>I&rsquo;m quite fond of this approach, since this is simple, easy to understand and has a great performance profile.&nbsp; But I wouldn&rsquo;t be writing this blog post if we didn&rsquo;t run into issues, now would I?</p> <p>A customer reported high memory usage (to the point of memory exhaustion) when doing a certain set of operations. That&hellip; didn&rsquo;t make any sense, to be honest. That was a <em>well traveled</em> code path, any issue there should have been long found out.</p> <p>They were able to send us a reproduction and the support team was able to figure out what is going on. The problem was that the code in question did a couple of things, which altogether led to an interesting issue.</p> <ul> <li>It allocated and deallocated memory, but not always in the same order &ndash; this is fine, that is why we have the free list, after all.</li> <li>It extended the memory allocation it used on the fly &ndash; perfectly fine and an important optimization for us.</li> </ul> <p>Give it a moment to consider how could these two operations together result in a problem&hellip;</p> <p>Here is the sequence of events:</p> <ul> <li>Loop:</li> <ul> <li>Allocate(1024) -&gt; $1</li> <li>Allocate(256) -&gt; $2</li> <li>Grow($1, 4096) -&gt; Success</li> <li>Allocate(128) -&gt; $3</li> <li>Free($1) (4096)</li> <li>Free($3) (128)</li> <li>Free($2) (256)</li> </ul> </ul> <p>What is going on here?</p> <p>Well, the issue is that we are allocating a 1KB buffer, but <em>return</em> a 4KB buffer. That means that we add the returned buffer to the 4KB free list, but we cannot <em>pull </em>from that free list on allocation.</p> <p>Once found, it was an easy thing to do (detect this state and handle it), but until we figured it out, it was quite a mystery.</p>https://www.ayende.com/blog/197825-C/production-postmortem-efficiency-all-the-way-to-out-of-memory-error?Key=e100f378-87a0-471d-b8f7-8c1a5f831f88https://www.ayende.com/blog/197825-C/production-postmortem-efficiency-all-the-way-to-out-of-memory-error?Key=e100f378-87a0-471d-b8f7-8c1a5f831f88Fri, 22 Jul 2022 12:00:00 GMTWhen debugging, assume an unreliable narrator<p>When we are handling a support call, we are often working with partial information about the state of the software at the customer site. Sometimes that is an unavoidable part of the job. When troubleshooting a system with patients' records, I can&rsquo;t just ask the customer to schlep the data to my laptop so I can analyze it properly. Even if we could do that, there are a <em>lot</em> of cases that simply don&rsquo;t reproduce anywhere but the live environment.</p> <p>Part of the process of debugging an issue in a production environment is to be able to gather enough information <em>on site</em> that we can draw the appropriate conclusions from. RavenDB comes with a lot of tools to do just that. One of the most useful of those tools is the idea of the debug package. That is a simple idea, in the end. It gathers all the information we have about our system and packages that into a zip file. That zip file contains a lot of metrics, but it doesn&rsquo;t contain customer data (aside from databases &amp; index names, which are usually not sensitive).</p> <p>There have been several separate cases recently where we were able to use the debug package to analyze what is going on and came back to the customer with answers. However, when hearing our explanations about what was the root cause&nbsp;of&nbsp; the issue, the customer rejected our hypothesis.</p> <p>In one case, a customer was worried about the load that they were observing in their system. Not because there <em>was</em> an issue, but the number of requests that they observed was higher than was expected. The customer switched to using concurrent subscriptions recently and deployed a couple of worker nodes to spread the load of processing documents. However, the number of requests observed was <em>far</em> higher than they expected. Whereas before they had a single worker per subscription, and a known amount of work that they could easily measure, after switching to concurrent subscriptions they observed a <em>big</em> increase in the number of requests processed by RavenDB.</p> <p>Given that they deployed their subscriptions to two workers, initially, it was expected that the amount of work that the cluster is processing would double. Instead, it was increased by tenfold. Looking at the metrics in the debug package, we could see that they had 10 instances of each subscription running, but the customer was insistent that they only deployed two workers nodes.</p> <p>Our metrics said that there were 5 subscriptions from IP-1 and 5 subscriptions from IP-2. After some back and forth it was revealed that everyone was correct, but talking past each other. The customer deployed two worker nodes, yes. But each of those spawned 5 instances of the subscriptions to take advantage of concurrency inside the same worker node.</p> <p>In the second case, we have a customer that noticed a marked increase in the amount of bandwidth that they were using. They traced that additional bandwidth to the internal communication between the nodes in the cluster. Given that they are running in the cloud, they were (rightly) concerned about the sudden jump in the bandwidth. We started the investigation process and&hellip; we didn&rsquo;t like what we saw. The cluster had gone through <em>three</em> full node rebuilds in the past month. At least, that was what the data was telling us. But that didn&rsquo;t make much sense.</p> <p>Quite concerned that there is something really bad going on, we talked to the customer, who thought about this for a while, checked their own logs and explained what was going on. They are running on Lsv2-series Azure instances, and apparently, within the space of a few weeks, all three of their instances had been moved to another physical host. The Lsv2-series instances use local ephemeral NVMe drives. When they moved an instance between hosts, the effect was as if we were given a brand new hard disk. RavenDB was able to handle that scenario more or less seamlessly, with the other nodes in the cluster filling in for the down node and sending it all the data it lost. The effect of that, of course, was a big jump in network bandwidth while that was going on.</p> <p>The customer wasn&rsquo;t actually aware that this happened until they looked at the logs, RavenDB had it handled, and it was only noticed because of the bandwidth spike.</p> <p>The point of this post isn&rsquo;t to talk about how awesome RavenDB is (even if I do think it is pretty awesome). Nor is it to extoll how good our support team is at figuring out things about the customer setup that even the customer isn&rsquo;t aware of.</p> <p><em>The</em> point of this post is that you have to take into account, quite clearly, that the details that the customer is providing may be outdated, wrong or just misleading. Not because of any malicious intention on their end, but because they give you the information they <em>have</em>, not what is actually going on.</p> <p>It reminds me of an old trick in tech support: &ldquo;Take the plug out of the socket, blow on both the socket and the plug, then insert it again&rdquo;. The point isn&rsquo;t to blow whatever dust may have been there, preventing good contact. The point is to ensure that the silly thing is actually <em>plugged</em> in, but you can&rsquo;t <em>ask</em> if this is plugged in, because the person on the other side of the call would say: &ldquo;Of course it is&rdquo; and never check.</p>https://www.ayende.com/blog/197793-C/when-debugging-assume-an-unreliable-narrator?Key=f1425369-1baa-4f76-a7a8-f61bc332716bhttps://www.ayende.com/blog/197793-C/when-debugging-assume-an-unreliable-narrator?Key=f1425369-1baa-4f76-a7a8-f61bc332716bWed, 20 Jul 2022 12:00:00 GMT