Changeset: 82dad11b6fd3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=82dad11b6fd3 Added Files: sql/test/malloc_fail/Tests/mallocs.SQL.py Removed Files: sql/test/malloc_fail/Tests/initialize.sql sql/test/malloc_fail/Tests/initialize.stable.err sql/test/malloc_fail/Tests/initialize.stable.out sql/test/malloc_fail/Tests/setmemorylimit-fail.reqtests sql/test/malloc_fail/Tests/setmemorylimit-fail.sql sql/test/malloc_fail/Tests/setmemorylimit-fail.stable.err sql/test/malloc_fail/Tests/setmemorylimit-fail.stable.out sql/test/malloc_fail/Tests/setmemorylimit-fail2.reqtests sql/test/malloc_fail/Tests/setmemorylimit-fail2.sql sql/test/malloc_fail/Tests/setmemorylimit.reqtests sql/test/malloc_fail/Tests/setmemorylimit.sql sql/test/malloc_fail/Tests/setmemorylimit.stable.err sql/test/malloc_fail/Tests/setmemorylimit.stable.out Modified Files: gdk/gdk_utils.c gdk/gdk_utils.h monetdb5/mal/mal_exception.c monetdb5/modules/mal/mal_io.c monetdb5/modules/mal/mal_io.h monetdb5/modules/mal/mal_io.mal sql/test/malloc_fail/Tests/All Branch: default Log Message:
new test case for malloc failures diffs (truncated from 527 to 300 lines): diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -319,7 +319,7 @@ int GDK_vm_trim = 1; #include "gdk_atomic.h" static volatile ATOMIC_TYPE GDK_mallocedbytes_estimate = 0; #ifndef NDEBUG -static volatile lng GDK_mallocedbytes_limit = -1; +static volatile lng GDK_malloc_success_count = -1; #endif static volatile ATOMIC_TYPE GDK_vm_cursize = 0; #ifdef GDK_VM_KEEPHISTO @@ -1639,12 +1639,17 @@ GDKmalloc_prefixsize(size_t size) return s; } +#ifndef NDEBUG +static MT_Lock mallocsuccesslock; +#endif + void -GDKsetmemorylimit(lng nbytes) +GDKsetmallocsuccesscount(lng count) { - (void) nbytes; + (void) count; #ifndef NDEBUG - GDK_mallocedbytes_limit = nbytes; + MT_lock_init(&mallocsuccesslock, "mallocsuccesslock"); + GDK_malloc_success_count = count; #endif } @@ -1668,10 +1673,15 @@ GDKmallocmax(size_t size, size_t *maxsiz } #ifndef NDEBUG /* fail malloc for testing purposes depending on set limit */ - if (GDK_mallocedbytes_limit >= 0 && - size > (size_t) GDK_mallocedbytes_limit) { + if (GDK_malloc_success_count > 0) { + MT_lock_set(&mallocsuccesslock); + if (GDK_malloc_success_count > 0) GDK_malloc_success_count--; + MT_lock_unset(&mallocsuccesslock); + } + if (GDK_malloc_success_count == 0) { return NULL; } + #endif size = (size + 7) & ~7; /* round up to a multiple of eight */ s = GDKmalloc_prefixsize(size); diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h --- a/gdk/gdk_utils.h +++ b/gdk/gdk_utils.h @@ -77,7 +77,7 @@ gdk_export void MT_init(void); /* init gdk_export int GDKinit(opt *set, int setlen); /* used for testing only */ -gdk_export void GDKsetmemorylimit(lng nbytes); +gdk_export void GDKsetmallocsuccesscount(lng count); /* * Upon closing the session, all persistent BATs should be saved and diff --git a/monetdb5/mal/mal_exception.c b/monetdb5/mal/mal_exception.c --- a/monetdb5/mal/mal_exception.c +++ b/monetdb5/mal/mal_exception.c @@ -57,7 +57,10 @@ createExceptionInternal(enum malexceptio { char *message; int len; - + // if there is an error we allow memory allocation once again +#ifndef NDEBUG + GDKsetmallocsuccesscount(-1); +#endif message = GDKmalloc(GDKMAXERRLEN); if (message == NULL) return M5OutOfMemory; /* last resort */ diff --git a/monetdb5/modules/mal/mal_io.c b/monetdb5/modules/mal/mal_io.c --- a/monetdb5/modules/mal/mal_io.c +++ b/monetdb5/modules/mal/mal_io.c @@ -779,8 +779,8 @@ IOimport(void *ret, bat *bid, str *fnme) str -IOsetmemorylimit(void *res, lng *nbytes) { +IOsetmallocsuccesscount(void *res, lng *count) { (void) res; - GDKsetmemorylimit(*nbytes); + GDKsetmallocsuccesscount(*count); return MAL_SUCCEED; } diff --git a/monetdb5/modules/mal/mal_io.h b/monetdb5/modules/mal/mal_io.h --- a/monetdb5/modules/mal/mal_io.h +++ b/monetdb5/modules/mal/mal_io.h @@ -29,6 +29,6 @@ mal_export str io_stdin(Client cntxt, Ma mal_export str io_stdout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str io_stderr(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -mal_export str IOsetmemorylimit(void *res, lng *nbytes); +mal_export str IOsetmallocsuccesscount(void *res, lng *nbytes); #endif /* _PRINT_H_ */ diff --git a/monetdb5/modules/mal/mal_io.mal b/monetdb5/modules/mal/mal_io.mal --- a/monetdb5/modules/mal/mal_io.mal +++ b/monetdb5/modules/mal/mal_io.mal @@ -62,6 +62,6 @@ comment "Import a BAT from an ASCII dump else parsing errors will occur as an exception."; # used for testing malloc failures -command setmemorylimit(nbytes:lng):void -address IOsetmemorylimit -comment "Set memory limit for testing"; +command setmallocsuccesscount(count:lng):void +address IOsetmallocsuccesscount +comment "Set number of mallocs that are allowed to succeed."; diff --git a/sql/test/malloc_fail/Tests/All b/sql/test/malloc_fail/Tests/All --- a/sql/test/malloc_fail/Tests/All +++ b/sql/test/malloc_fail/Tests/All @@ -1,4 +1,1 @@ -initialize -setmemorylimit -setmemorylimit-fail -setmemorylimit-fail2 +# mallocs not run for now since it hangs mserver diff --git a/sql/test/malloc_fail/Tests/initialize.sql b/sql/test/malloc_fail/Tests/initialize.sql deleted file mode 100644 --- a/sql/test/malloc_fail/Tests/initialize.sql +++ /dev/null @@ -1,2 +0,0 @@ -create procedure setmemorylimit(nbytes BIGINT) - external name "io"."setmemorylimit"; diff --git a/sql/test/malloc_fail/Tests/initialize.stable.err b/sql/test/malloc_fail/Tests/initialize.stable.err deleted file mode 100644 --- a/sql/test/malloc_fail/Tests/initialize.stable.err +++ /dev/null @@ -1,36 +0,0 @@ -stderr of test 'initialize` in directory 'sql/test/malloc_fail` itself: - - -# 14:30:10 > -# 14:30:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38639" "--set" "mapi_usock=/var/tmp/mtest-19224/.s.monetdb.38639" "--set" "monet_prompt=" "--forcemito" "--dbpath=/ufs/sjoerd/Monet-devel/var/MonetDB/mTests_sql_test_malloc_fail" "--set" "embedded_r=yes" "--set" "embedded_py=true" -# 14:30:10 > - -# builtin opt gdk_dbpath = /ufs/sjoerd/Monet-devel/var/monetdb5/dbfarm/demo -# builtin opt gdk_debug = 0 -# builtin opt gdk_vmtrim = no -# builtin opt monet_prompt = > -# builtin opt monet_daemon = no -# builtin opt mapi_port = 50000 -# builtin opt mapi_open = false -# builtin opt mapi_autosense = false -# builtin opt sql_optimizer = default_pipe -# builtin opt sql_debug = 0 -# cmdline opt gdk_nr_threads = 0 -# cmdline opt mapi_open = true -# cmdline opt mapi_port = 38639 -# cmdline opt mapi_usock = /var/tmp/mtest-19224/.s.monetdb.38639 -# cmdline opt monet_prompt = -# cmdline opt gdk_dbpath = /ufs/sjoerd/Monet-devel/var/MonetDB/mTests_sql_test_malloc_fail -# cmdline opt embedded_r = yes -# cmdline opt embedded_py = true -# cmdline opt gdk_debug = 536870922 - -# 14:30:11 > -# 14:30:11 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-19224" "--port=38639" -# 14:30:11 > - - -# 14:30:12 > -# 14:30:12 > "Done." -# 14:30:12 > - diff --git a/sql/test/malloc_fail/Tests/initialize.stable.out b/sql/test/malloc_fail/Tests/initialize.stable.out deleted file mode 100644 --- a/sql/test/malloc_fail/Tests/initialize.stable.out +++ /dev/null @@ -1,75 +0,0 @@ -stdout of test 'initialize` in directory 'sql/test/malloc_fail` itself: - - -# 14:30:10 > -# 14:30:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38639" "--set" "mapi_usock=/var/tmp/mtest-19224/.s.monetdb.38639" "--set" "monet_prompt=" "--forcemito" "--dbpath=/ufs/sjoerd/Monet-devel/var/MonetDB/mTests_sql_test_malloc_fail" "--set" "embedded_r=yes" "--set" "embedded_py=true" -# 14:30:10 > - -# MonetDB 5 server v11.24.0 (hg id: 9a2ff0ca8d49+) -# This is an unreleased version -# Serving database 'mTests_sql_test_malloc_fail', using 8 threads -# Compiled for x86_64-unknown-linux-gnu/64bit with 128bit integers -# Found 15.589 GiB available main-memory. -# Copyright (c) 1993-July 2008 CWI. -# Copyright (c) August 2008-2016 MonetDB B.V., all rights reserved -# Visit http://www.monetdb.org/ for further information -# Listening for connection requests on mapi:monetdb://madrid.da.cwi.nl:38639/ -# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-19224/.s.monetdb.38639 -# MonetDB/GIS module loaded -# MonetDB/SQL module loaded -# MonetDB/Python module loaded -# MonetDB/R module loaded - -Ready. -# SQL catalog created, loading sql scripts once -# loading sql script: 09_like.sql -# loading sql script: 10_math.sql -# loading sql script: 11_times.sql -# loading sql script: 12_url.sql -# loading sql script: 13_date.sql -# loading sql script: 14_inet.sql -# loading sql script: 15_querylog.sql -# loading sql script: 16_tracelog.sql -# loading sql script: 17_temporal.sql -# loading sql script: 18_index.sql -# loading sql script: 20_vacuum.sql -# loading sql script: 21_dependency_functions.sql -# loading sql script: 22_clients.sql -# loading sql script: 23_skyserver.sql -# loading sql script: 24_zorder.sql -# loading sql script: 25_debug.sql -# loading sql script: 26_sysmon.sql -# loading sql script: 27_rejects.sql -# loading sql script: 39_analytics.sql -# loading sql script: 39_analytics_hge.sql -# loading sql script: 40_geom.sql -# loading sql script: 40_json.sql -# loading sql script: 40_json_hge.sql -# loading sql script: 41_md5sum.sql -# loading sql script: 45_uuid.sql -# loading sql script: 46_gsl.sql -# loading sql script: 46_profiler.sql -# loading sql script: 51_sys_schema_extension.sql -# loading sql script: 72_fits.sql -# loading sql script: 74_netcdf.sql -# loading sql script: 75_shp.sql -# loading sql script: 75_storagemodel.sql -# loading sql script: 80_statistics.sql -# loading sql script: 80_udf.sql -# loading sql script: 80_udf_hge.sql -# loading sql script: 85_bam.sql -# loading sql script: 90_generator.sql -# loading sql script: 90_generator_hge.sql -# loading sql script: 99_system.sql - -# 14:30:11 > -# 14:30:11 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-19224" "--port=38639" -# 14:30:11 > - -#create procedure setmemorylimit(nbytes BIGINT) -# external name "io"."setmemorylimit"; - -# 14:30:12 > -# 14:30:12 > "Done." -# 14:30:12 > - diff --git a/sql/test/malloc_fail/Tests/mallocs.SQL.py b/sql/test/malloc_fail/Tests/mallocs.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/malloc_fail/Tests/mallocs.SQL.py @@ -0,0 +1,28 @@ +import pymonetdb +import os + +dbh = pymonetdb.connect(database = os.environ['TSTDB'], + port = int(os.environ['MAPIPORT']), + hostname = "localhost") + +cursor = dbh.cursor() + +q = """ + +create procedure setmallocsuccesscount(count BIGINT) + external name "io"."setmallocsuccesscount"; + +call setmallocsuccesscount(%d); +SELECT * FROM tables; +""" +i = 3300 +while i > 1000: + #print(i) + i-=1 + try: + cursor.execute(q % (i)) + except Exception as e: + #print(e) + pass + finally: + dbh.rollback() diff --git a/sql/test/malloc_fail/Tests/setmemorylimit-fail.reqtests b/sql/test/malloc_fail/Tests/setmemorylimit-fail.reqtests deleted file mode 100644 --- a/sql/test/malloc_fail/Tests/setmemorylimit-fail.reqtests +++ /dev/null @@ -1,1 +0,0 @@ -initialize diff --git a/sql/test/malloc_fail/Tests/setmemorylimit-fail.sql b/sql/test/malloc_fail/Tests/setmemorylimit-fail.sql deleted file mode 100644 --- a/sql/test/malloc_fail/Tests/setmemorylimit-fail.sql +++ /dev/null @@ -1,3 +0,0 @@ --- mserver requires a minimum amount of space -call setmemorylimit(32*1024*1024); -select name from tables where 1=0; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list