Browse Source

Using tabling for cache, bumping up the number of workers (#6739)

* Using tabing for cache, bumping up the number of workers

* fixed db endpoint

* Reducing clutter

* Removing template

* Formatting

* Couple of >0 guards
vka 4 years ago
parent
commit
bd4b3f37e0

+ 25 - 61
frameworks/Prolog/SWI-Prolog/app/database.pl

@@ -1,87 +1,51 @@
-:- module(database, [find_random_numbers/4,
+:- module(database, [find_random_numbers/3,
                      update_random_numbers/3,
                      find_fortunes/2]).
 
 :- use_module(library(odbc)).
 :- use_module(library(random)).
 
-:- dynamic cache/2.
-:- dynamic cache/3.
+% --------------------------------------------------
 
-top_id(10001).
+find_random_numbers(_Connection, 0, []).
+find_random_numbers(Connection, N, Rows) :-
+    with_statement(Connection, world_by_id, Statement, find_random_numbers_(Statement, N, Rows)).
 
-find_random_numbers(_Connection, 0, [], _Cached).
-find_random_numbers(Connection, N, Rows, Cached) :-
-    setup_call_cleanup(
-        world_by_id_statement(Connection, Statement),
-        find_random_numbers_(Statement, N, Rows, Cached),
-        odbc_free_statement(Statement)
-    ).
-
-find_random_numbers_(_Statement, 0, [], _Cached).
-find_random_numbers_(Statement, N, [Row|Rows], Cached) :-
+find_random_numbers_(_Statement, 0, []).
+find_random_numbers_(Statement, N, [Row|Rows]) :-
     N > 0,
-    top_id(Top),
-    random(1, Top, Id),
-    odbc_execute_cached(Statement, [Id], Row, Cached),
+    random_id(Id),
+    odbc_execute(Statement, [Id], Row),
     N1 is N - 1,
-    find_random_numbers_(Statement, N1, Rows, Cached).
+    find_random_numbers_(Statement, N1, Rows).
 
 find_fortunes(Connection, Rows) :-
-    setup_call_cleanup(
-        fortune_statement(Connection, Statement),
-        findall(Row, odbc_execute(Statement, [], Row), Rows),
-        odbc_free_statement(Statement)
-    ).
+    with_statement(Connection, fortune, Statement, findall(Row, odbc_execute(Statement, [], Row), Rows)).
 
 update_random_numbers(_Connection, [], []).
 update_random_numbers(Connection, Rows0, Rows) :-
-    setup_call_cleanup(
-        update_world_statement(Connection, Statement),
-        update_random_numbers_(Statement, Rows0, Rows),
-        odbc_free_statement(Statement)
-    ).
+    with_statement(Connection, update_world, Statement, update_random_numbers_(Statement, Rows0, Rows)).
 
 update_random_numbers_(_Statement, [], []).
 update_random_numbers_(Statement, [row(Id0,_)|Rows0], [Row|Rows]) :-
-    top_id(Top),
-    random(1, Top, RandomNumber),
+    random_id(RandomNumber),
     Row = row(Id0, RandomNumber),
     odbc_execute(Statement, [RandomNumber, Id0]),
     update_random_numbers_(Statement, Rows0, Rows).
 
-% ------------------------------------------------------------------------------------
+% --------------------------------------------------
 
-world_by_id_statement(Connection, Statement) :-
-    odbc_prepare(
-        Connection, 
-        'SELECT id, randomNumber FROM World WHERE id = ?', 
-        [integer], 
-        Statement
-    ).
-    
-fortune_statement(Connection, Statement) :-
-    odbc_prepare(
-        Connection, 
-        'SELECT id, message FROM Fortune', 
-        [], 
-        Statement
-    ).
+query(world_by_id,  'SELECT id, randomNumber FROM World WHERE id = ?', [integer]).
+query(fortune,      'SELECT id, message FROM Fortune',                 []).
+query(update_world, 'UPDATE World SET randomNumber = ? WHERE id = ?',  [integer, integer]).
 
-update_world_statement(Connection, Statement) :-
-    odbc_prepare(
-        Connection, 
-        'UPDATE World SET randomNumber = ? WHERE id = ?', 
-        [integer, integer], 
-        Statement
+with_statement(Connection, Name, Statement, Goal) :-
+    setup_call_cleanup(
+        (   query(Name, Query, Params)
+        ,   odbc_prepare(Connection, Query, Params, Statement)
+        ), 
+        Goal,
+        odbc_free_statement(Statement)
     ).
 
-% ------------------------------------------------------------------------------------
-
-odbc_execute_cached(Statement, Params, Row, true) :-
-    ( cache(Params, Row)
-    ; odbc_execute(Statement, Params, Row),
-      assertz(cache(Params, Row))
-    ).
-odbc_execute_cached(Statement, Params, Row, false) :-
-    odbc_execute(Statement, Params, Row).
+random_id(N) :- random(1, 10001, N).

+ 0 - 18
frameworks/Prolog/SWI-Prolog/app/fortunes.html

@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    {{ each items, item }}
-        <tr>
-            <td>{{= item.id }}</td>
-            <td>{{= item.message }}</td>
-        </tr>
-    {{ end }}
-</table>
-</body>
-</html>

+ 3 - 3
frameworks/Prolog/SWI-Prolog/app/server.pl

@@ -14,7 +14,7 @@
 server(Port) :-
     odbc_set_option(connection_pooling(true)),
     current_prolog_flag(cpu_count, Cores),
-    Workers is 8 * Cores,
+    Workers is 256 * Cores,
     http_server(http_dispatch, [workers(Workers), port(Port), timeout(30)]).
 
 
@@ -82,8 +82,8 @@ cached_worlds_handler(Request) :-
 
 queries(Request, Queries) :-
     catch(
-        ( http_parameters(Request, [queries(Value, [integer, optional(true), default(1)])])
-        , cut_off(Value, 1, 500, Queries)
+        (   http_parameters(Request, [queries(Value, [integer, optional(true), default(1)])])
+        ,   cut_off(Value, 1, 500, Queries)
         ),
         _Caught,
         Queries = 1

+ 23 - 30
frameworks/Prolog/SWI-Prolog/app/service.pl

@@ -4,40 +4,28 @@
                     fortunes/1]).
 
 :- use_module(database).
-
 :- use_module(library(odbc)).
-:- use_module(library(solution_sequences)).
 
+:- table random_numbers_cached/2.
+
+% --------------------------------------------------
 
 random_number(Row) :-
-    setup_call_cleanup(
-        odbc_connect('benchmark', Connection, []),
-        database:find_random_numbers(Connection, 1, [Row], false),
-        odbc_disconnect(Connection)
-    ).
+    with_connection(Connection, database:find_random_numbers(Connection, 1, [Row])).
+
+random_number(Row) :-
+    with_connection(Connection, database:find_random_numbers(Connection, 1, [Row])).
 
 random_numbers(0, []).
 random_numbers(N, Rows) :-
-    setup_call_cleanup(
-        odbc_connect('benchmark', Connection, []),
-        database:find_random_numbers(Connection, N, Rows, false),
-        odbc_disconnect(Connection)
-    ).
+    N > 0,
+    with_connection(Connection, database:find_random_numbers(Connection, N, Rows)).
 
-random_numbers_cached(0, []).
 random_numbers_cached(N, Rows) :-
-    setup_call_cleanup(
-        odbc_connect('benchmark', Connection, []),
-        database:find_random_numbers(Connection, N, Rows, true),
-        odbc_disconnect(Connection)
-    ).
+    random_numbers(N, Rows).
 
 fortunes(Rows) :-
-    setup_call_cleanup(
-        odbc_connect('benchmark', Connection, []),
-        database:find_fortunes(Connection, Rows0),
-        odbc_disconnect(Connection)
-    ),
+    with_connection(Connection, database:find_fortunes(Connection, Rows0)),
     Rows1 = [row(0, 'Additional fortune added at request time.')|Rows0],
     maplist(fortune_to_pair, Rows1, Pairs),
     keysort(Pairs, SortedPairs),
@@ -45,14 +33,19 @@ fortunes(Rows) :-
 
 update(0, []).
 update(N, Rows) :-
+    N > 0,
+    with_connection(Connection, (
+        database:find_random_numbers(Connection, N, Rows0),
+        database:update_random_numbers(Connection, Rows0, Rows)
+    )).
+
+% --------------------------------------------------
+
+fortune_to_pair(row(Id, Message), Message-row(Id, Message)).
+
+with_connection(Connection, Goal) :-
     setup_call_cleanup(
         odbc_connect('benchmark', Connection, []),
-        ( database:find_random_numbers(Connection, N, Rows0, false)
-        , database:update_random_numbers(Connection, Rows0, Rows)
-        ),
+        Goal,
         odbc_disconnect(Connection)
     ).
-
-% -----------------------------------------------------------
-
-fortune_to_pair(row(Id, Message), Message-row(Id, Message)).