Allow huge Q values main
authorNick Vatamaniuc <vatamane@gmail.com>
Thu, 6 Oct 2022 14:31:37 +0000 (10:31 -0400)
committerNick Vatamaniuc <nickva@users.noreply.github.com>
Thu, 6 Oct 2022 15:16:31 +0000 (11:16 -0400)
These may not be practical but our arithmetic blowing up shouldn't be the limit
preventing it.

Use the minimum timeout when the number of shards is greater than 64.

Fixes: https://github.com/apache/couchdb/issues/4196

src/fabric/src/fabric_util.erl

index 34e095403338e32c1126691a929f5fdcd9239d59..fbba5bdf8d1440b312b85e8c7732c2b9fb8b86d6 100644 (file)
@@ -159,6 +159,9 @@ get_db_timeout(N, Factor, MinTimeout, infinity) ->
     % MaxTimeout may be infinity so we just use the largest Erlang small int to
     % avoid blowing up the arithmetic
     get_db_timeout(N, Factor, MinTimeout, 1 bsl 59);
+get_db_timeout(N, _Factor, MinTimeout, _MaxTimeout) when N > 64 ->
+    % Guard against max:pow/2 blowing from a large exponent
+    MinTimeout;
 get_db_timeout(N, Factor, MinTimeout, MaxTimeout) ->
     %
     % The progression of timeouts forms a geometric series:
@@ -446,6 +449,9 @@ get_db_timeout_test() ->
     % Q=256, N=3
     ?assertEqual(100, get_db_timeout(256 * 3, 2, 100, 60000)),
 
+    % Q=9999 N=3
+    ?assertEqual(100, get_db_timeout(9999 * 3, 2, 100, 60000)),
+
     % Large factor = 100
     ?assertEqual(100, get_db_timeout(2 * 3, 100, 100, 60000)),