<p></p>
<p dir="auto">Well if I knew what the problem was then I would have done so! That change was based on a test script that I ran in production but I wasn't seeing exactly the same semantics on my development machine possibly because it's ruby 3.2 and production is 3.0 so things may be different.</p>
<p dir="auto">What I do know is that in at least some cases there is a difference between this:</p>
<div class="highlight highlight-source-ruby" dir="auto"><pre class="notranslate"><span class="pl-v">Timeout</span><span class="pl-kos">.</span><span class="pl-en">timeout</span><span class="pl-kos">(</span><span class="pl-c1">10</span><span class="pl-kos">,</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span><span class="pl-kos">)</span> <span class="pl-k">do</span>
<span class="pl-k">rescue</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span>
<span class="pl-k">end</span></pre></div>
<p dir="auto">and this:</p>
<div class="highlight highlight-source-ruby" dir="auto"><pre class="notranslate"><span class="pl-k">begin</span>
  <span class="pl-v">Timeout</span><span class="pl-kos">.</span><span class="pl-en">timeout</span><span class="pl-kos">(</span><span class="pl-c1">10</span><span class="pl-kos">,</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span><span class="pl-kos">)</span> <span class="pl-k">do</span>
  <span class="pl-k">end</span>
<span class="pl-k">rescue</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span>
<span class="pl-k">end</span></pre></div>
<p dir="auto">with the second one sometimes catching a timeout that is missed by the first one and that getting rid of the explicit class seems to change that.</p>
<p dir="auto">I did also try and write a test - that was actually my first attempt to reproduce it. That's actually hard to do in itself as you can't just make a query go slowly so I had to resort to extracting the timeout code to a library and then tried to write a lib test using <code class="notranslate">pg_sleep()</code> in a query but I didn't have much luck reproducing the problem which is why I moved to running variants of this in production:</p>
<div class="highlight highlight-source-ruby" dir="auto"><pre class="notranslate"><span class="pl-en">require</span> <span class="pl-s">"/srv/www.openstreetmap.org/rails/config/environment"</span>

<span class="pl-k">def</span> <span class="pl-en">api_call_timeout</span><span class="pl-kos">(</span>&<span class="pl-s1">block</span><span class="pl-kos">)</span>
  <span class="pl-k">begin</span>
    <span class="pl-v">Timeout</span><span class="pl-kos">.</span><span class="pl-en">timeout</span><span class="pl-kos">(</span><span class="pl-c1">10</span><span class="pl-kos">,</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span><span class="pl-kos">,</span> &<span class="pl-s1">block</span><span class="pl-kos">)</span>
  <span class="pl-k">end</span>
<span class="pl-k">rescue</span> <span class="pl-v">ActionView</span>::<span class="pl-v">Template</span>::<span class="pl-v">Error</span> <span class="pl-c1">=></span> <span class="pl-en">e</span>
  <span class="pl-s1">e</span> <span class="pl-c1">=</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">cause</span>

  <span class="pl-k">if</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">is_a?</span><span class="pl-kos">(</span><span class="pl-v">Timeout</span>::<span class="pl-v">Error</span><span class="pl-kos">)</span> ||
     <span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">is_a?</span><span class="pl-kos">(</span><span class="pl-v">ActiveRecord</span>::<span class="pl-v">StatementInvalid</span><span class="pl-kos">)</span> && <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">message</span><span class="pl-kos">.</span><span class="pl-en">include?</span><span class="pl-kos">(</span><span class="pl-s">"execution expired"</span><span class="pl-kos">)</span><span class="pl-kos">)</span>
    <span class="pl-v">ActiveRecord</span>::<span class="pl-v">Base</span><span class="pl-kos">.</span><span class="pl-en">connection</span><span class="pl-kos">.</span><span class="pl-en">raw_connection</span><span class="pl-kos">.</span><span class="pl-en">cancel</span>
    <span class="pl-en">raise</span> <span class="pl-c1">OSM</span>::<span class="pl-v">APITimeoutError</span>
  <span class="pl-k">else</span>
    <span class="pl-en">raise</span>
  <span class="pl-k">end</span>
<span class="pl-k">rescue</span> <span class="pl-v">Timeout</span>::<span class="pl-v">Error</span>
  <span class="pl-v">ActiveRecord</span>::<span class="pl-v">Base</span><span class="pl-kos">.</span><span class="pl-en">connection</span><span class="pl-kos">.</span><span class="pl-en">raw_connection</span><span class="pl-kos">.</span><span class="pl-en">cancel</span>
  <span class="pl-en">raise</span> <span class="pl-c1">OSM</span>::<span class="pl-v">APITimeoutError</span>
<span class="pl-k">end</span>

<span class="pl-s1">params</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
  <span class="pl-pds">:bbox</span><span class="pl-c1">=></span> <span class="pl-s">"-118.1879,33.4086,-117.6889,33.9076"</span><span class="pl-kos">,</span>
  <span class="pl-pds">:page</span><span class="pl-c1">=></span> <span class="pl-s">"1"</span> <span class="pl-c"># 526</span>
<span class="pl-kos">}</span>

<span class="pl-s1">page</span> <span class="pl-c1">=</span> <span class="pl-s1">params</span><span class="pl-kos">[</span><span class="pl-s">"page"</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">to_s</span><span class="pl-kos">.</span><span class="pl-en">to_i</span>
<span class="pl-s1">offset</span> <span class="pl-c1">=</span> <span class="pl-s1">page</span> * <span class="pl-v">Settings</span><span class="pl-kos">.</span><span class="pl-en">tracepoints_per_page</span>
<span class="pl-s1">bbox</span> <span class="pl-c1">=</span> <span class="pl-v">BoundingBox</span><span class="pl-kos">.</span><span class="pl-en">from_bbox_params</span><span class="pl-kos">(</span><span class="pl-s1">params</span><span class="pl-kos">)</span>

<span class="pl-s1">ordered_points</span> <span class="pl-c1">=</span> <span class="pl-v">Tracepoint</span><span class="pl-kos">.</span><span class="pl-s1">bbox</span><span class="pl-kos">(</span><span class="pl-s1">bbox</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">joins</span><span class="pl-kos">(</span><span class="pl-pds">:trace</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">where</span><span class="pl-kos">(</span><span class="pl-pds">:gpx_files</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-pds">:visibility</span> <span class="pl-c1">=></span> <span class="pl-kos">%w[</span><span class="pl-s">trackable</span> <span class="pl-s">identifiable</span><span class="pl-kos">]</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">order</span><span class="pl-kos">(</span><span class="pl-s">"gpx_id DESC, trackid ASC, timestamp ASC"</span><span class="pl-kos">)</span>
<span class="pl-s1">unordered_points</span> <span class="pl-c1">=</span> <span class="pl-v">Tracepoint</span><span class="pl-kos">.</span><span class="pl-s1">bbox</span><span class="pl-kos">(</span><span class="pl-s1">bbox</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">joins</span><span class="pl-kos">(</span><span class="pl-pds">:trace</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">where</span><span class="pl-kos">(</span><span class="pl-pds">:gpx_files</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-pds">:visibility</span> <span class="pl-c1">=></span> <span class="pl-kos">%w[</span><span class="pl-s">public</span> <span class="pl-s">private</span><span class="pl-kos">]</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">order</span><span class="pl-kos">(</span><span class="pl-s">"gps_points.latitude"</span><span class="pl-kos">,</span> <span class="pl-s">"gps_points.longitude"</span><span class="pl-kos">,</span> <span class="pl-s">"gps_points.timestamp"</span><span class="pl-kos">)</span>
<span class="pl-s1">points</span> <span class="pl-c1">=</span> <span class="pl-s1">ordered_points</span><span class="pl-kos">.</span><span class="pl-en">union_all</span><span class="pl-kos">(</span><span class="pl-s1">unordered_points</span><span class="pl-kos">)</span>

<span class="pl-en">api_call_timeout</span> <span class="pl-k">do</span>
  <span class="pl-s1">points</span><span class="pl-kos">.</span><span class="pl-s1">offset</span><span class="pl-kos">(</span><span class="pl-s1">offset</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">limit</span><span class="pl-kos">(</span><span class="pl-v">Settings</span><span class="pl-kos">.</span><span class="pl-en">tracepoints_per_page</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">preload</span><span class="pl-kos">(</span><span class="pl-pds">:trace</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">each</span> <span class="pl-k">do</span> |<span class="pl-s1">point</span>|
    <span class="pl-en">puts</span> <span class="pl-s1">point</span><span class="pl-kos">.</span><span class="pl-en">id</span>
  <span class="pl-k">end</span>
<span class="pl-k">end</span></pre></div>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />Reply to this email directly, <a href="https://github.com/openstreetmap/openstreetmap-website/commit/24f579562fbaf1ec9138014b0f2ed8e219eb75f7#commitcomment-138114539">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AAK2OLJ3XUELV7I4G3BXEU3YRIRRRAVCNFSM6AAAAABCS3KPFKVHI2DSMVQWIX3LMV43OQ3PNVWWS5CDN5WW2ZLOOQ5TCMZYGEYTINJTHE">unsubscribe</a>.<br />You are receiving this because you are subscribed to this thread.<img src="https://github.com/notifications/beacon/AAK2OLKZI5V6Q25W5ZVOYMTYRIRRRA5CNFSM6AAAAABCS3KPFKWGG33NNVSW45C7OR4XAZNNINXW23LJORBW63LNMVXHJKTDN5WW2ZLOORPWSZGOBA5XL2Y.gif" height="1" width="1" alt="" /><span style="color: transparent; font-size: 0; display: none; visibility: hidden; overflow: hidden; opacity: 0; width: 0; height: 0; max-width: 0; max-height: 0; mso-hide: all">Message ID: <span><openstreetmap/openstreetmap-website/commit/24f579562fbaf1ec9138014b0f2ed8e219eb75f7/138114539</span><span>@</span><span>github</span><span>.</span><span>com></span></span></p>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/openstreetmap/openstreetmap-website/commit/24f579562fbaf1ec9138014b0f2ed8e219eb75f7#commitcomment-138114539",
"url": "https://github.com/openstreetmap/openstreetmap-website/commit/24f579562fbaf1ec9138014b0f2ed8e219eb75f7#commitcomment-138114539",
"name": "View Commit"
},
"description": "View this Commit on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>