Configurable timeout for view group get_info/1

A busy view group server might take longer than 5 seconds to respond, so make
the timeout configurable. "infinity" is also a valid configuration value.

Configuration section, key and default value (in milliseconds):

   `query_server_config.group_info_timeout = 5000`

COUCHDB-3242
diff --git a/src/couch_index.erl b/src/couch_index.erl
index 57dddee..b339010 100644
--- a/src/couch_index.erl
+++ b/src/couch_index.erl
@@ -55,7 +55,7 @@
 
 
 get_info(Pid) ->
-    gen_server:call(Pid, get_info).
+    gen_server:call(Pid, get_info, group_info_timeout_msec()).
 
 
 trigger_update(Pid, UpdateSeq) ->
@@ -415,6 +415,16 @@
     config:get_integer("query_server_config", "commit_freq", 5) * 1000.
 
 
+group_info_timeout_msec() ->
+    Timeout = config:get("query_server_config", "group_info_timeout", "5000"),
+    case Timeout of
+        "infinity" ->
+            infinity;
+        Milliseconds ->
+            list_to_integer(Milliseconds)
+    end.
+
+
 -ifdef(TEST).
 -include_lib("couch/include/couch_eunit.hrl").
 
@@ -532,4 +542,37 @@
     Settings1 = [to_string(Value) || Value <- Settings0],
     "[ " ++ lists:flatten(string:join(Settings1, " , ")) ++ " ]".
 
+
+get_group_timeout_info_test_() ->
+    {
+        foreach,
+        fun() -> ok end,
+        fun(_) -> meck:unload() end,
+        [
+            t_group_timeout_info_integer(),
+            t_group_timeout_info_infinity()
+        ]
+    }.
+
+
+t_group_timeout_info_integer() ->
+     ?_test(begin
+        meck:expect(config, get,
+            fun("query_server_config", "group_info_timeout", _) ->
+               "5001"
+            end),
+        ?assertEqual(5001, group_info_timeout_msec())
+    end).
+
+
+t_group_timeout_info_infinity() ->
+     ?_test(begin
+        meck:expect(config, get,
+            fun("query_server_config", "group_info_timeout", _) ->
+                "infinity"
+            end),
+        ?assertEqual(infinity, group_info_timeout_msec())
+    end).
+
+
 -endif.