Changeset: e2a346a9df13 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e2a346a9df13 Added Files: gdk/Tests/caprss.py gdk/Tests/prologue.mal gdk/Tests/push_and_check_rss.sql Removed Files: gdk/Tests/caprss.prologue5 gdk/Tests/caprss.sql Modified Files: gdk/gdk_utils.c Branch: configurable_working_set Log Message:
Implementation seems to be working on Windows as output of test suggests. diffs (113 lines): diff --git a/gdk/Tests/caprss.py b/gdk/Tests/caprss.py new file mode 100644 --- /dev/null +++ b/gdk/Tests/caprss.py @@ -0,0 +1,39 @@ +import os, sys +try: + from MonetDBtesting import process +except ImportError: + import process + +def server_start(args): + sys.stderr.write('#mserver: "%s"\n' % ' '.join(args)) + sys.stderr.flush() + srv = process.server(args = args, stdin = process.PIPE, + stdout = process.PIPE, stderr = process.PIPE) + return srv + +def client(lang, file): + sys.stderr.write('#client: "%s"\n' % file) + sys.stderr.flush() + clt = process.client(lang.lower(), stdin = open(file), + stdout = process.PIPE, stderr = process.PIPE) + return clt.communicate() + +def main(): + srv = server_start(["--set", "gdk_mem_maxsize=70000000"]) + + out, err = client('MAL', + os.path.join(os.getenv('RELSRCDIR'), + 'prologue.mal')) + sys.stdout.write(out) + sys.stderr.write(err) + + out, err = client('SQL', + os.path.join(os.getenv('RELSRCDIR'), + 'push_and_check_rss.sql')) + sys.stdout.write(out) + sys.stderr.write(err) + out, err = srv.communicate() + sys.stdout.write(out) + sys.stderr.write(err) + +main() diff --git a/gdk/Tests/caprss.prologue5 b/gdk/Tests/prologue.mal rename from gdk/Tests/caprss.prologue5 rename to gdk/Tests/prologue.mal diff --git a/gdk/Tests/caprss.sql b/gdk/Tests/push_and_check_rss.sql rename from gdk/Tests/caprss.sql rename to gdk/Tests/push_and_check_rss.sql --- a/gdk/Tests/caprss.sql +++ b/gdk/Tests/push_and_check_rss.sql @@ -8,22 +8,21 @@ create table test(a int, b int, c double insert into test VALUES (1, 0, 1); -select getrss() as resident_set_size, getvm() as virtual_memory_size; - -create procedure loop_insert(n bigint) +create procedure loop_insert(maximum_size bigint) BEGIN - declare run BIGINT; - set run = (select count(*) from test); + declare size BIGINT; + set size = (select count(*) from test); - WHILE run < n DO + WHILE size < maximum_size DO insert into test (select a+1, b+2, rand()*c from test); - set run = (select count(*) from test); + set size = (select count(*) from test); END WHILE; END; call loop_insert(10000000); -select count(*) from test; +-- It seems that it requires an analytical query to keep memory in RAM. +select count(*) as record_count from test; select getrss() as resident_set_size, getvm() as virtual_memory_size; diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -51,8 +51,6 @@ static char THRprintbuf[BUFSIZ]; # include <Windows.h> #endif -#define MIN_WORKING_SET 1 << 26 // Minimum memory working/resident set size - static volatile ATOMIC_FLAG GDKstopped = ATOMIC_FLAG_INIT; static void GDKunlockHome(int farmid); @@ -554,15 +552,14 @@ GDKinit(opt *set, int setlen) for (i = 0; i < nlen; i++) { if (strcmp("gdk_mem_maxsize", n[i].name) == 0) { GDK_mem_maxsize = (size_t) strtoll(n[i].value, NULL, 10); - GDK_mem_maxsize = MAX(MIN_WORKING_SET, GDK_mem_maxsize); + GDK_mem_maxsize = MAX(1 << 26, GDK_mem_maxsize); #ifdef WIN32 // On windows we can use a system call to limit the maximum working set size. const HANDLE process = GetCurrentProcess(); - printf("MonetDb says Hello, world!\"\n\n"); - - if (!SetProcessWorkingSetSizeEx(process, MIN_WORKING_SET, GDK_mem_maxsize, QUOTA_LIMITS_HARDWS_MAX_ENABLE)) + if (!SetProcessWorkingSetSizeEx(process, 1, GDK_mem_maxsize, QUOTA_LIMITS_HARDWS_MAX_ENABLE)) { printf("Something went wrong while setting the limits on the working set: %d\n", GetLastError()); + return 1; } #endif _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list