From 7ab049b119bb20f11ea24790a1cafed4f36d806a Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Sun, 17 Jul 2011 23:50:40 +0400 Subject: [PATCH 01/16] Bump up BerkeleyDB version to 5.1.25 --- Makefile | 8 +++ rebar | Bin 0 -> 102307 bytes rebar.config | 13 +++++ test/bdberl_SUITE.erl | 8 +-- test/stress_SUITE.erl | 110 ++++++++++++++++++++++++++++++++++++++++++ test/thrash_SUITE.erl | 80 ++++++++++++++++++++++++++++++ 6 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 Makefile create mode 100755 rebar create mode 100644 rebar.config create mode 100644 test/stress_SUITE.erl create mode 100644 test/thrash_SUITE.erl diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a4845c1 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +all: c_src/system/lib/libdb.a + ./rebar compile eunit ct + +c_src/system/lib/libdb.a: + c_src/buildlib.sh +clean: + ./rebar clean + diff --git a/rebar b/rebar new file mode 100755 index 0000000000000000000000000000000000000000..c4c44f587e100efc235f620cc12b41b56f372825 GIT binary patch literal 102307 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 literal 0 HcmV?d00001 diff --git a/rebar.config b/rebar.config new file mode 100644 index 0000000..8aca7c1 --- /dev/null +++ b/rebar.config @@ -0,0 +1,13 @@ +{port_envs, [ + {"DRV_CFLAGS", "$DRV_CFLAGS -Werror -I c_src/system/include -lpthread -DDEBUG"}, + {"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libdb.a -lpthread"} + ]}. + +{port_pre_script, {"c_src/buildlib.sh", + "c_src/system/lib/libdb.a"}}. + +{cover_enabled, true}. + +{ct_extra_params, "-boot start_sasl -s snmp"}. + +{clean_files, ["c_src/system/lib/libdb.a"]}. diff --git a/test/bdberl_SUITE.erl b/test/bdberl_SUITE.erl index 75a3a2f..6373e18 100644 --- a/test/bdberl_SUITE.erl +++ b/test/bdberl_SUITE.erl @@ -26,7 +26,7 @@ -compile(export_all). --include_lib("ct.hrl"). +-include_lib("common_test/include/ct.hrl"). all() -> [open_should_create_database_if_none_exists, @@ -65,9 +65,11 @@ all() -> dbconfig(Config) -> - Cfg = [{set_data_dir, ?config(priv_dir, Config)}, + Cfg = [ + {set_data_dir, ?config(priv_dir, Config)}, {set_flags, 'DB_TXN_NOSYNC'}, - {set_log_config, 'DB_LOG_IN_MEMORY'}], + {log_set_config, 'DB_LOG_IN_MEMORY'} + ], list_to_binary(lists:flatten([io_lib:format("~s ~s\n", [K,V]) || {K, V} <- Cfg])). diff --git a/test/stress_SUITE.erl b/test/stress_SUITE.erl new file mode 100644 index 0000000..0829187 --- /dev/null +++ b/test/stress_SUITE.erl @@ -0,0 +1,110 @@ +%% ------------------------------------------------------------------- +%% +%% bdberl: Port Driver Stress tests +%% Copyright (c) 2008 The Hive. All rights reserved. +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% +%% ------------------------------------------------------------------- +-module(stress_SUITE). +-compile(export_all). +-include_lib("common_test/include/ct.hrl"). + +%% NOTE: all of the tests are set for a low number of iterations to guarantee +%% that they all pass and run in a reasonable amount of time. That kinda defeats +%% the purpose of the test, tho. Work is ongoing to make this a useful test suite. + +all() -> + [rewrite_array_test, + rewrite_bytes_test, + write_array_test, + write_bytes_test]. + +init_per_suite(Config) -> + {ok, Cwd} = file:get_cwd(), + {ok, _} = file:copy(lists:append([Cwd, "/../../int_test/DB_CONFIG"]), + lists:append([Cwd, "/DB_CONFIG"])), + crypto:start(), + Config. + +end_per_suite(_Config) -> + ok. + +init_per_testcase(TestCase, Config) -> + Size = 1024 * 1024, + Chunk = crypto:rand_bytes(Size), + Name = io_lib:format("~p.db", [TestCase]), + {ok, Db} = bdberl:open(Name, hash), + [{size, Size}, {chunk, Chunk}, {db, Db}|Config]. + +end_per_testcase(_TestCase, Config) -> + bdberl:close(?config(db, Config)), + ok. + +%%--------------------------------------------------------------------------- + +rewrite_array_test(Config) -> + %% If you try to run this one for more than 2K iterations than the Erlang + %% VM will die with a memory allocation error when creating the binary. + ct:print("Running rewrite_array test for 2000 iterations..."), + Chunk = ?config(chunk, Config), + rewrite_array(?config(db, Config), Chunk, [Chunk], 20). + +rewrite_array(_Db, _Block, _Bytes, 0) -> + ok; +rewrite_array(Db, Block, Bytes, Iter) -> + bdberl:put(Db, 1, Bytes), + rewrite_array(Db, Block, [Block|Bytes], Iter - 1). + +%%--------------------------------------------------------------------------- + +rewrite_bytes_test(Config) -> + ct:print("Running rewrite_bytes test for 2500 iterations..."), + rewrite_bytes(?config(db, Config), ?config(chunk, Config), 25). + +rewrite_bytes(_Db, _Bytes, 0) -> + ok; +rewrite_bytes(Db, Bytes, Iter) -> + bdberl:put(Db, 1, Bytes), + rewrite_bytes(Db, Bytes, Iter - 1). + +%%--------------------------------------------------------------------------- + +write_array_test(Config) -> + ct:print("Running write_array test for 150 iterations..."), + Chunk = ?config(chunk, Config), + write_array(?config(db, Config), Chunk, [Chunk], 15). + +write_array(_Db, _Block, _Bytes, 0) -> + ok; +write_array(Db, Block, Bytes, Iter) -> + bdberl:put(Db, Iter, Bytes), + write_array(Db, Block, [Block|Bytes], Iter - 1). + +%%--------------------------------------------------------------------------- + +write_bytes_test(Config) -> + ct:print("Running write_bytes test for 2500 iterations..."), + write_bytes(?config(db, Config), ?config(chunk, Config), 25). + +write_bytes(_Db, _Bytes, 0) -> + ok; +write_bytes(Db, Bytes, Iter) -> + bdberl:put(Db, Iter, Bytes), + write_bytes(Db, Bytes, Iter - 1). diff --git a/test/thrash_SUITE.erl b/test/thrash_SUITE.erl new file mode 100644 index 0000000..31b9bed --- /dev/null +++ b/test/thrash_SUITE.erl @@ -0,0 +1,80 @@ +%% ------------------------------------------------------------------- +%% +%% bdberl: Port Driver Thrash tests +%% Copyright (c) 2008 The Hive. All rights reserved. +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% +%% ------------------------------------------------------------------- +-module(thrash_SUITE). + +-compile(export_all). + +all() -> + [test_thrash]. + +-define(PROCS, 10). + +test_thrash(_Config) -> + %% Spin up 15 processes (async thread pool is 10) + start_procs(?PROCS), + wait_for_finish(?PROCS). + +start_procs(0) -> + ok; +start_procs(Count) -> + spawn_link(?MODULE, thrash_run, [self()]), + start_procs(Count-1). + +wait_for_finish(0) -> + ok; +wait_for_finish(Count) -> + receive + {finished, Pid} -> + ct:print("~p is done; ~p remaining.\n", [Pid, Count-1]), + wait_for_finish(Count-1) + end. + +thrash_run(Owner) -> + %% Seed the RNG + {A1, A2, A3} = now(), + random:seed(A1, A2, A3), + + %% Open up a port and database + {ok, 0} = bdberl:open("thrash", btree), + + %% Start thrashing + thrash_incr_loop(Owner, 1000). + +thrash_incr_loop(Owner, 0) -> + Owner ! {finished, self()}; +thrash_incr_loop(Owner, Count) -> + % ct:print("~p", [Count]), + %% Choose random key + Key = random:uniform(1200), + + %% Start a txn that will read the current value of the key and increment by 1 + F = fun(_Key, Value) -> + case Value of + not_found -> 0; + Value -> Value + 1 + end + end, + {ok, _} = bdberl:update(0, Key, F), + thrash_incr_loop(Owner, Count-1). From a765b458414236eb128b50cf67e779a5fac5c041 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Sun, 17 Jul 2011 23:55:48 +0400 Subject: [PATCH 02/16] Changes --- .gitignore | 1 + c_src/buildlib.sh | 12 +- include/bdberl.hrl | 506 ++++++++++++++++++++------------------ int_test/stress_SUITE.erl | 110 --------- int_test/thrash_SUITE.erl | 80 ------ src/bdberl.erl | 2 + test/cover.spec | 3 - 7 files changed, 283 insertions(+), 431 deletions(-) delete mode 100644 int_test/stress_SUITE.erl delete mode 100644 int_test/thrash_SUITE.erl delete mode 100644 test/cover.spec diff --git a/.gitignore b/.gitignore index c5b7e0f..62f69bc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ int_test/test.cover bdberl-* priv/mibs c_src/db-*.tar.gz +.eunit diff --git a/c_src/buildlib.sh b/c_src/buildlib.sh index 1caf8cb..c22be69 100755 --- a/c_src/buildlib.sh +++ b/c_src/buildlib.sh @@ -1,9 +1,15 @@ #!/bin/sh -WORKDIR=`pwd`/system -TARGETDIR=`(cd .. && pwd)`/priv +if [ `basename $PWD` != "c_src" ]; then + pushd c_src +fi -DB_VER="4.7.25" +BASEDIR="$PWD" + +WORKDIR=$BASEDIR/system +TARGETDIR=$BASEDIR/../priv + +DB_VER="5.1.25" ## Check for necessary tarball if [ ! -f "db-${DB_VER}.tar.gz" ]; then diff --git a/include/bdberl.hrl b/include/bdberl.hrl index d5c7454..3a4f564 100644 --- a/include/bdberl.hrl +++ b/include/bdberl.hrl @@ -65,6 +65,8 @@ -define(DB_TYPE_BTREE, 1). -define(DB_TYPE_HASH, 2). +-define(DB_TYPE_RECNO, 3). +-define(DB_TYPE_QUEUE, 4). -define(DB_TYPE_UNKNOWN, 5). -define(SYSP_CACHESIZE_GET, 1). @@ -88,243 +90,277 @@ -define(ERROR_INVALID_DB_TYPE,-29009). % Invalid database type %% DB (user visible) error return codes. --define(DB_BUFFER_SMALL, -30999). % User memory too small for return --define(DB_DONOTINDEX, -30998). % "Null" return from 2ndary callbk --define(DB_FOREIGN_CONFLICT, -30997). % A foreign db constraint triggered --define(DB_KEYEMPTY, -30996). % Key/data deleted or never created --define(DB_KEYEXIST, -30995). % The key/data pair already exists --define(DB_LOCK_DEADLOCK, -30994). % Deadlock occurred --define(DB_LOCK_NOTGRANTED, -30993). % Lock unavailable --define(DB_LOG_BUFFER_FULL, -30992). % In-memory log buffer full --define(DB_NOSERVER, -30991). % Server panic return --define(DB_NOSERVER_HOME, -30990). % Bad home sent to server --define(DB_NOSERVER_ID, -30989). % Bad ID sent to server --define(DB_NOTFOUND, -30988). % Key/data pair not found (EOF) --define(DB_OLD_VERSION, -30987). % Out-of-date version --define(DB_PAGE_NOTFOUND, -30986). % Requested page not found --define(DB_REP_DUPMASTER, -30985). % There are two masters --define(DB_REP_HANDLE_DEAD, -30984). % Rolled back a commit --define(DB_REP_HOLDELECTION, -30983). % Time to hold an election --define(DB_REP_IGNORE, -30982). % This msg should be ignored --define(DB_REP_ISPERM, -30981). % Cached not written perm written --define(DB_REP_JOIN_FAILURE, -30980). % Unable to join replication group --define(DB_REP_LEASE_EXPIRED, -30979). % Master lease has expired --define(DB_REP_LOCKOUT, -30978). % API/Replication lockout now --define(DB_REP_NEWSITE, -30977). % New site entered system --define(DB_REP_NOTPERM, -30976). % Permanent log record not written --define(DB_REP_UNAVAIL, -30975). % Site cannot currently be reached --define(DB_RUNRECOVERY, -30974). % Panic return --define(DB_SECONDARY_BAD, -30973). % Secondary index corrupt --define(DB_VERIFY_BAD, -30972). % Verify failed; bad format --define(DB_VERSION_MISMATCH, -30971). % Environment version mismatch +-define(DB_BUFFER_SMALL, -30999). % User memory too small for return. +-define(DB_DONOTINDEX, -30998). % "Null" return from 2ndary callbk. +-define(DB_FOREIGN_CONFLICT, -30997). % A foreign db constraint triggered. +-define(DB_KEYEMPTY, -30996). % Key/data deleted or never created. +-define(DB_KEYEXIST, -30995). % The key/data pair already exists. +-define(DB_LOCK_DEADLOCK, -30994). % Deadlock. +-define(DB_LOCK_NOTGRANTED, -30993). % Lock unavailable. +-define(DB_LOG_BUFFER_FULL, -30992). % In-memory log buffer full. +-define(DB_LOG_VERIFY_BAD, -30991). % Log verification failed. +-define(DB_NOSERVER, -30990). % Server panic return. +-define(DB_NOSERVER_HOME, -30989). % Bad home sent to server. +-define(DB_NOSERVER_ID, -30988). % Bad ID sent to server. +-define(DB_NOTFOUND, -30987). % Key/data pair not found (EOF). +-define(DB_OLD_VERSION, -30986). % Out-of-date version. +-define(DB_PAGE_NOTFOUND, -30985). % Requested page not found. +-define(DB_REP_DUPMASTER, -30984). % There are two masters. +-define(DB_REP_HANDLE_DEAD, -30983). % Rolled back a commit. +-define(DB_REP_HOLDELECTION, -30982). % Time to hold an election. +-define(DB_REP_IGNORE, -30981). % This msg should be ignored. +-define(DB_REP_ISPERM, -30980). % Cached not written perm written. +-define(DB_REP_JOIN_FAILURE, -30979). % Unable to join replication group. +-define(DB_REP_LEASE_EXPIRED, -30978). % Master lease has expired. +-define(DB_REP_LOCKOUT, -30977). % API/Replication lockout now. +-define(DB_REP_NEWSITE, -30976). % New site entered system. +-define(DB_REP_NOTPERM, -30975). % Permanent log record not written. +-define(DB_REP_UNAVAIL, -30974). % Site cannot currently be reached. +-define(DB_RUNRECOVERY, -30973). % Panic return. +-define(DB_SECONDARY_BAD, -30972). % Secondary index corrupt. +-define(DB_TIMEOUT, -30971). % Timed out on read consistency. +-define(DB_VERIFY_BAD, -30970). % Verify failed; bad format. +-define(DB_VERSION_MISMATCH, -30969). % Environment version mismatch. %% DB API flags --define(DB_AGGRESSIVE, 16#00000001). --define(DB_ARCH_ABS, 16#00000001). --define(DB_ARCH_DATA, 16#00000002). --define(DB_ARCH_LOG, 16#00000004). --define(DB_ARCH_REMOVE, 16#00000008). --define(DB_AUTO_COMMIT, 16#00000100). --define(DB_CDB_ALLDB, 16#00000004). --define(DB_CHKSUM, 16#00000004). --define(DB_CKP_INTERNAL, 16#00000002). --define(DB_CREATE, 16#00000001). --define(DB_CXX_NO_EXCEPTIONS, 16#00000002). --define(DB_DIRECT, 16#00000002). --define(DB_DIRECT_DB, 16#00000040). --define(DB_DSYNC_DB, 16#00000080). --define(DB_DUP, 16#00000008). --define(DB_DUPSORT, 16#00000002). --define(DB_DURABLE_UNKNOWN, 16#00000020). --define(DB_ENCRYPT, 16#00000001). --define(DB_ENCRYPT_AES, 16#00000001). --define(DB_EXCL, 16#00000400). --define(DB_EXTENT, 16#00000004). --define(DB_FAST_STAT, 16#00000001). --define(DB_FCNTL_LOCKING, 16#00001000). --define(DB_FLUSH, 16#00000001). --define(DB_FORCE, 16#00000001). --define(DB_FOREIGN_ABORT, 16#00000001). --define(DB_FOREIGN_CASCADE, 16#00000002). --define(DB_FOREIGN_NULLIFY, 16#00000004). --define(DB_FREELIST_ONLY, 16#00000001). --define(DB_FREE_SPACE, 16#00000002). --define(DB_IGNORE_LEASE, 16#00001000). --define(DB_IMMUTABLE_KEY, 16#00000002). --define(DB_INIT_CDB, 16#00000020). --define(DB_INIT_LOCK, 16#00000040). --define(DB_INIT_LOG, 16#00000080). --define(DB_INIT_MPOOL, 16#00000100). --define(DB_INIT_REP, 16#00000200). --define(DB_INIT_TXN, 16#00000400). --define(DB_INORDER, 16#00000010). --define(DB_JOIN_NOSORT, 16#00000001). --define(DB_LOCKDOWN, 16#00000800). --define(DB_LOCK_NOWAIT, 16#00000001). --define(DB_LOCK_RECORD, 16#00000002). --define(DB_LOCK_SET_TIMEOUT, 16#00000004). --define(DB_LOCK_SWITCH, 16#00000008). --define(DB_LOCK_UPGRADE, 16#00000010). --define(DB_LOG_AUTO_REMOVE, 16#00000004). --define(DB_LOG_CHKPNT, 16#00000002). --define(DB_LOG_COMMIT, 16#00000004). --define(DB_LOG_DIRECT, 16#00000001). --define(DB_LOG_DSYNC, 16#00000002). --define(DB_LOG_IN_MEMORY, 16#00000008). --define(DB_LOG_NOCOPY, 16#00000008). --define(DB_LOG_NOT_DURABLE, 16#00000010). --define(DB_LOG_WRNOSYNC, 16#00000020). --define(DB_LOG_ZERO, 16#00000010). --define(DB_MPOOL_CREATE, 16#00000001). --define(DB_MPOOL_DIRTY, 16#00000002). --define(DB_MPOOL_DISCARD, 16#00000001). --define(DB_MPOOL_EDIT, 16#00000004). --define(DB_MPOOL_FREE, 16#00000008). --define(DB_MPOOL_LAST, 16#00000010). --define(DB_MPOOL_NEW, 16#00000020). --define(DB_MPOOL_NOFILE, 16#00000001). --define(DB_MPOOL_NOLOCK, 16#00000002). --define(DB_MPOOL_UNLINK, 16#00000002). --define(DB_MULTIPLE, 16#00002000). --define(DB_MULTIPLE_KEY, 16#00000100). --define(DB_MULTIVERSION, 16#00000008). --define(DB_MUTEX_ALLOCATED, 16#00000001). --define(DB_MUTEX_LOCKED, 16#00000002). --define(DB_MUTEX_LOGICAL_LOCK, 16#00000004). --define(DB_MUTEX_PROCESS_ONLY, 16#00000008). --define(DB_MUTEX_SELF_BLOCK, 16#00000010). --define(DB_NOLOCKING, 16#00000200). --define(DB_NOMMAP, 16#00000010). --define(DB_NOORDERCHK, 16#00000002). --define(DB_NOPANIC, 16#00000400). --define(DB_NO_AUTO_COMMIT, 16#00002000). --define(DB_ODDFILESIZE, 16#00000040). --define(DB_ORDERCHKONLY, 16#00000004). --define(DB_OVERWRITE, 16#00001000). --define(DB_PANIC_ENVIRONMENT, 16#00002000). --define(DB_PRINTABLE, 16#00000008). --define(DB_PRIVATE, 16#00001000). --define(DB_PR_PAGE, 16#00000010). --define(DB_PR_RECOVERYTEST, 16#00000020). --define(DB_RDONLY, 16#00000080). --define(DB_RDWRMASTER, 16#00004000). --define(DB_READ_COMMITTED, 16#00000400). --define(DB_READ_UNCOMMITTED, 16#00000200). --define(DB_RECNUM, 16#00000020). --define(DB_RECOVER, 16#00000010). --define(DB_RECOVER_FATAL, 16#00002000). --define(DB_REGION_INIT, 16#00004000). --define(DB_REGISTER, 16#00004000). --define(DB_RENUMBER, 16#00000040). --define(DB_REPMGR_CONF_2SITE_STRICT, 16#00000001). --define(DB_REPMGR_PEER, 16#00000001). --define(DB_REP_ANYWHERE, 16#00000001). --define(DB_REP_CLIENT, 16#00000001). --define(DB_REP_CONF_BULK, 16#00000002). --define(DB_REP_CONF_DELAYCLIENT, 16#00000004). --define(DB_REP_CONF_LEASE, 16#00000008). --define(DB_REP_CONF_NOAUTOINIT, 16#00000010). --define(DB_REP_CONF_NOWAIT, 16#00000020). --define(DB_REP_ELECTION, 16#00000004). --define(DB_REP_MASTER, 16#00000002). --define(DB_REP_NOBUFFER, 16#00000002). --define(DB_REP_PERMANENT, 16#00000004). --define(DB_REP_REREQUEST, 16#00000008). --define(DB_REVSPLITOFF, 16#00000080). --define(DB_RMW, 16#00000800). --define(DB_RPCCLIENT, 16#00000001). --define(DB_SALVAGE, 16#00000040). --define(DB_SA_SKIPFIRSTKEY, 16#00010000). --define(DB_SEQ_DEC, 16#00000001). --define(DB_SEQ_INC, 16#00000002). --define(DB_SEQ_RANGE_SET, 16#00000004). --define(DB_SEQ_WRAP, 16#00000008). --define(DB_SEQ_WRAPPED, 16#00000010). --define(DB_SET_LOCK_TIMEOUT, 16#00000002). --define(DB_SET_TXN_NOW, 16#00000004). --define(DB_SET_TXN_TIMEOUT, 16#00000001). --define(DB_SNAPSHOT, 16#00000100). --define(DB_STAT_ALL, 16#00000002). --define(DB_STAT_CLEAR, 16#00000001). --define(DB_STAT_LOCK_CONF, 16#00000004). --define(DB_STAT_LOCK_LOCKERS, 16#00000008). --define(DB_STAT_LOCK_OBJECTS, 16#00000010). --define(DB_STAT_LOCK_PARAMS, 16#00000020). --define(DB_STAT_MEMP_HASH, 16#00000004). --define(DB_STAT_MEMP_NOERROR, 16#00000008). --define(DB_STAT_SUBSYSTEM, 16#00000004). --define(DB_ST_DUPOK, 16#00000100). --define(DB_ST_DUPSET, 16#00000200). --define(DB_ST_DUPSORT, 16#00000400). --define(DB_ST_IS_RECNO, 16#00000800). --define(DB_ST_OVFL_LEAF, 16#00001000). --define(DB_ST_RECNUM, 16#00002000). --define(DB_ST_RELEN, 16#00004000). --define(DB_ST_TOPLEVEL, 16#00008000). --define(DB_SYSTEM_MEM, 16#00008000). --define(DB_THREAD, 16#00000004). --define(DB_TIME_NOTGRANTED, 16#00008000). --define(DB_TRUNCATE, 16#00008000). --define(DB_TXN_NOSYNC, 16#00000001). --define(DB_TXN_NOT_DURABLE, 16#00000200). --define(DB_TXN_NOWAIT, 16#00000002). --define(DB_TXN_SNAPSHOT, 16#00000800). --define(DB_TXN_SYNC, 16#00000004). --define(DB_TXN_WAIT, 16#00000008). --define(DB_TXN_WRITE_NOSYNC, 16#00000020). --define(DB_UNREF, 16#00000080). --define(DB_UPGRADE, 16#00000001). --define(DB_USE_ENVIRON, 16#00000002). --define(DB_USE_ENVIRON_ROOT, 16#00000008). --define(DB_VERB_DEADLOCK, 16#00000001). --define(DB_VERB_FILEOPS, 16#00000002). --define(DB_VERB_FILEOPS_ALL, 16#00000004). --define(DB_VERB_RECOVERY, 16#00000008). --define(DB_VERB_REGISTER, 16#00000010). --define(DB_VERB_REPLICATION, 16#00000020). --define(DB_VERB_REPMGR_CONNFAIL, 16#00000040). --define(DB_VERB_REPMGR_MISC, 16#00000080). --define(DB_VERB_REP_ELECT, 16#00000100). --define(DB_VERB_REP_LEASE, 16#00000200). --define(DB_VERB_REP_MISC, 16#00000400). --define(DB_VERB_REP_MSGS, 16#00000800). --define(DB_VERB_REP_SYNC, 16#00001000). --define(DB_VERB_WAITSFOR, 16#00002000). --define(DB_VERIFY, 16#00000002). --define(DB_WRITEOPEN, 16#00010000). --define(DB_XA_CREATE, 16#00000800). --define(DB_YIELDCPU, 16#00010000). +-define(DB_AGGRESSIVE, 16#00000001). +-define(DB_ARCH_ABS, 16#00000001). +-define(DB_ARCH_DATA, 16#00000002). +-define(DB_ARCH_LOG, 16#00000004). +-define(DB_ARCH_REMOVE, 16#00000008). +-define(DB_AUTO_COMMIT, 16#00000100). +-define(DB_CDB_ALLDB, 16#00000040). +-define(DB_CHKSUM, 16#00000008). +-define(DB_CKP_INTERNAL, 16#00000002). +-define(DB_CREATE, 16#00000001). +-define(DB_CURSOR_BULK, 16#00000001). +-define(DB_CURSOR_TRANSIENT, 16#00000004). +-define(DB_CXX_NO_EXCEPTIONS, 16#00000002). +-define(DB_DATABASE_LOCKING, 16#00000080). +-define(DB_DIRECT, 16#00000010). +-define(DB_DIRECT_DB, 16#00000200). +-define(DB_DSYNC_DB, 16#00000400). +-define(DB_DUP, 16#00000010). +-define(DB_DUPSORT, 16#00000004). +-define(DB_DURABLE_UNKNOWN, 16#00000020). +-define(DB_ENCRYPT, 16#00000001). +-define(DB_ENCRYPT_AES, 16#00000001). +-define(DB_EXCL, 16#00000040). +-define(DB_EXTENT, 16#00000040). +-define(DB_FAILCHK, 16#00000020). +-define(DB_FAST_STAT, 16#00000001). +-define(DB_FCNTL_LOCKING, 16#00000800). +-define(DB_FLUSH, 16#00000001). +-define(DB_FORCE, 16#00000001). +-define(DB_FORCESYNC, 16#00000001). +-define(DB_FOREIGN_ABORT, 16#00000001). +-define(DB_FOREIGN_CASCADE, 16#00000002). +-define(DB_FOREIGN_NULLIFY, 16#00000004). +-define(DB_FREELIST_ONLY, 16#00000001). +-define(DB_FREE_SPACE, 16#00000002). +-define(DB_HOTBACKUP_IN_PROGRESS, 16#00000800). +-define(DB_IGNORE_LEASE, 16#00001000). +-define(DB_IMMUTABLE_KEY, 16#00000002). +-define(DB_INIT_CDB, 16#00000040). +-define(DB_INIT_LOCK, 16#00000080). +-define(DB_INIT_LOG, 16#00000100). +-define(DB_INIT_MPOOL, 16#00000200). +-define(DB_INIT_REP, 16#00000400). +-define(DB_INIT_TXN, 16#00000800). +-define(DB_INORDER, 16#00000020). +-define(DB_JOIN_NOSORT, 16#00000001). +-define(DB_LOCKDOWN, 16#00001000). +-define(DB_LOCK_CHECK, 16#00000001). +-define(DB_LOCK_NOWAIT, 16#00000002). +-define(DB_LOCK_RECORD, 16#00000004). +-define(DB_LOCK_SET_TIMEOUT, 16#00000008). +-define(DB_LOCK_SWITCH, 16#00000010). +-define(DB_LOCK_UPGRADE, 16#00000020). +-define(DB_LOG_AUTO_REMOVE, 16#00000001). +-define(DB_LOG_CHKPNT, 16#00000002). +-define(DB_LOG_COMMIT, 16#00000004). +-define(DB_LOG_DIRECT, 16#00000002). +-define(DB_LOG_DSYNC, 16#00000004). +-define(DB_LOG_IN_MEMORY, 16#00000008). +-define(DB_LOG_NOCOPY, 16#00000008). +-define(DB_LOG_NOT_DURABLE, 16#00000010). +-define(DB_LOG_NO_DATA, 16#00000004). +-define(DB_LOG_VERIFY_CAF, 16#00000001). +-define(DB_LOG_VERIFY_DBFILE, 16#00000002). +-define(DB_LOG_VERIFY_ERR, 16#00000004). +-define(DB_LOG_VERIFY_FORWARD, 16#00000008). +-define(DB_LOG_VERIFY_INTERR, 16#00000010). +-define(DB_LOG_VERIFY_PARTIAL, 16#00000020). +-define(DB_LOG_VERIFY_VERBOSE, 16#00000040). +-define(DB_LOG_VERIFY_WARNING, 16#00000080). +-define(DB_LOG_WRNOSYNC, 16#00000020). +-define(DB_LOG_ZERO, 16#00000010). +-define(DB_MPOOL_CREATE, 16#00000001). +-define(DB_MPOOL_DIRTY, 16#00000002). +-define(DB_MPOOL_DISCARD, 16#00000001). +-define(DB_MPOOL_EDIT, 16#00000004). +-define(DB_MPOOL_FREE, 16#00000008). +-define(DB_MPOOL_LAST, 16#00000010). +-define(DB_MPOOL_NEW, 16#00000020). +-define(DB_MPOOL_NOFILE, 16#00000001). +-define(DB_MPOOL_NOLOCK, 16#00000002). +-define(DB_MPOOL_TRY, 16#00000040). +-define(DB_MPOOL_UNLINK, 16#00000002). +-define(DB_MULTIPLE, 16#00000800). +-define(DB_MULTIPLE_KEY, 16#00004000). +-define(DB_MULTIVERSION, 16#00000004). +-define(DB_MUTEX_ALLOCATED, 16#00000001). +-define(DB_MUTEX_LOCKED, 16#00000002). +-define(DB_MUTEX_LOGICAL_LOCK, 16#00000004). +-define(DB_MUTEX_PROCESS_ONLY, 16#00000008). +-define(DB_MUTEX_SELF_BLOCK, 16#00000010). +-define(DB_MUTEX_SHARED, 16#00000020). +-define(DB_NOERROR, 16#00001000). +-define(DB_NOFLUSH, 16#00001000). +-define(DB_NOLOCKING, 16#00002000). +-define(DB_NOMMAP, 16#00000008). +-define(DB_NOORDERCHK, 16#00000002). +-define(DB_NOPANIC, 16#00004000). +-define(DB_NOSYNC, 16#00000001). +-define(DB_NO_AUTO_COMMIT, 16#00002000). +-define(DB_NO_CHECKPOINT, 16#00002000). +-define(DB_ODDFILESIZE, 16#00000080). +-define(DB_ORDERCHKONLY, 16#00000004). +-define(DB_OVERWRITE, 16#00008000). +-define(DB_PANIC_ENVIRONMENT, 16#00010000). +-define(DB_PRINTABLE, 16#00000008). +-define(DB_PRIVATE, 16#00004000). +-define(DB_PR_PAGE, 16#00000010). +-define(DB_PR_RECOVERYTEST, 16#00000020). +-define(DB_RDONLY, 16#00000400). +-define(DB_RDWRMASTER, 16#00004000). +-define(DB_READ_COMMITTED, 16#00000400). +-define(DB_READ_UNCOMMITTED, 16#00000200). +-define(DB_RECNUM, 16#00000040). +-define(DB_RECOVER, 16#00000002). +-define(DB_RECOVER_FATAL, 16#00008000). +-define(DB_REGION_INIT, 16#00020000). +-define(DB_REGISTER, 16#00010000). +-define(DB_RENUMBER, 16#00000080). +-define(DB_REPMGR_CONF_2SITE_STRICT, 16#00000001). +-define(DB_REPMGR_CONF_ELECTIONS, 16#00000002). +-define(DB_REPMGR_PEER, 16#00000001). +-define(DB_REP_ANYWHERE, 16#00000001). +-define(DB_REP_CLIENT, 16#00000001). +-define(DB_REP_CONF_AUTOINIT, 16#00000004). +-define(DB_REP_CONF_BULK, 16#00000008). +-define(DB_REP_CONF_DELAYCLIENT, 16#00000010). +-define(DB_REP_CONF_INMEM, 16#00000020). +-define(DB_REP_CONF_LEASE, 16#00000040). +-define(DB_REP_CONF_NOWAIT, 16#00000080). +-define(DB_REP_ELECTION, 16#00000004). +-define(DB_REP_MASTER, 16#00000002). +-define(DB_REP_NOBUFFER, 16#00000002). +-define(DB_REP_PERMANENT, 16#00000004). +-define(DB_REP_REREQUEST, 16#00000008). +-define(DB_REVSPLITOFF, 16#00000100). +-define(DB_RMW, 16#00002000). +-define(DB_SALVAGE, 16#00000040). +-define(DB_SA_SKIPFIRSTKEY, 16#00000080). +-define(DB_SA_UNKNOWNKEY, 16#00000100). +-define(DB_SEQ_DEC, 16#00000001). +-define(DB_SEQ_INC, 16#00000002). +-define(DB_SEQ_RANGE_SET, 16#00000004). +-define(DB_SEQ_WRAP, 16#00000008). +-define(DB_SEQ_WRAPPED, 16#00000010). +-define(DB_SET_LOCK_TIMEOUT, 16#00000001). +-define(DB_SET_REG_TIMEOUT, 16#00000004). +-define(DB_SET_TXN_NOW, 16#00000008). +-define(DB_SET_TXN_TIMEOUT, 16#00000002). +-define(DB_SHALLOW_DUP, 16#00000100). +-define(DB_SNAPSHOT, 16#00000200). +-define(DB_STAT_ALL, 16#00000004). +-define(DB_STAT_CLEAR, 16#00000001). +-define(DB_STAT_LOCK_CONF, 16#00000008). +-define(DB_STAT_LOCK_LOCKERS, 16#00000010). +-define(DB_STAT_LOCK_OBJECTS, 16#00000020). +-define(DB_STAT_LOCK_PARAMS, 16#00000040). +-define(DB_STAT_MEMP_HASH, 16#00000008). +-define(DB_STAT_MEMP_NOERROR, 16#00000010). +-define(DB_STAT_SUBSYSTEM, 16#00000002). +-define(DB_ST_DUPOK, 16#00000200). +-define(DB_ST_DUPSET, 16#00000400). +-define(DB_ST_DUPSORT, 16#00000800). +-define(DB_ST_IS_RECNO, 16#00001000). +-define(DB_ST_OVFL_LEAF, 16#00002000). +-define(DB_ST_RECNUM, 16#00004000). +-define(DB_ST_RELEN, 16#00008000). +-define(DB_ST_TOPLEVEL, 16#00010000). +-define(DB_SYSTEM_MEM, 16#00020000). +-define(DB_THREAD, 16#00000010). +-define(DB_TIME_NOTGRANTED, 16#00040000). +-define(DB_TRUNCATE, 16#00008000). +-define(DB_TXN_BULK, 16#00000008). +-define(DB_TXN_FAMILY, 16#00000040). +-define(DB_TXN_NOSYNC, 16#00000001). +-define(DB_TXN_NOT_DURABLE, 16#00000002). +-define(DB_TXN_NOWAIT, 16#00000002). +-define(DB_TXN_SNAPSHOT, 16#00000010). +-define(DB_TXN_SYNC, 16#00000004). +-define(DB_TXN_WAIT, 16#00000080). +-define(DB_TXN_WRITE_NOSYNC, 16#00000020). +-define(DB_UNREF, 16#00020000). +-define(DB_UPGRADE, 16#00000001). +-define(DB_USE_ENVIRON, 16#00000004). +-define(DB_USE_ENVIRON_ROOT, 16#00000008). +-define(DB_VERB_DEADLOCK, 16#00000001). +-define(DB_VERB_FILEOPS, 16#00000002). +-define(DB_VERB_FILEOPS_ALL, 16#00000004). +-define(DB_VERB_RECOVERY, 16#00000008). +-define(DB_VERB_REGISTER, 16#00000010). +-define(DB_VERB_REPLICATION, 16#00000020). +-define(DB_VERB_REPMGR_CONNFAIL, 16#00000040). +-define(DB_VERB_REPMGR_MISC, 16#00000080). +-define(DB_VERB_REP_ELECT, 16#00000100). +-define(DB_VERB_REP_LEASE, 16#00000200). +-define(DB_VERB_REP_MISC, 16#00000400). +-define(DB_VERB_REP_MSGS, 16#00000800). +-define(DB_VERB_REP_SYNC, 16#00001000). +-define(DB_VERB_REP_SYSTEM, 16#00002000). +-define(DB_VERB_REP_TEST, 16#00004000). +-define(DB_VERB_WAITSFOR, 16#00008000). +-define(DB_VERIFY, 16#00000002). +-define(DB_VERIFY_PARTITION, 16#00040000). +-define(DB_WRITECURSOR, 16#00000008). +-define(DB_WRITELOCK, 16#00000020). +-define(DB_WRITEOPEN, 16#00010000). +-define(DB_YIELDCPU, 16#00080000). %% DB access method and cursor operation values. Each value is an operation %% code to which additional bit flags are added. --define(DB_AFTER, 1). --define(DB_APPEND, 2). --define(DB_BEFORE, 3). --define(DB_CONSUME, 4). --define(DB_CONSUME_WAIT, 5). --define(DB_CURRENT, 6). --define(DB_FIRST, 7). --define(DB_GET_BOTH, 8). --define(DB_GET_BOTHC, 9). --define(DB_GET_BOTH_RANGE, 10). --define(DB_GET_RECNO, 11). --define(DB_JOIN_ITEM, 12). --define(DB_KEYFIRST, 13). --define(DB_KEYLAST, 14). --define(DB_LAST, 15). --define(DB_NEXT, 16). --define(DB_NEXT_DUP, 17). --define(DB_NEXT_NODUP, 18). --define(DB_NODUPDATA, 19). --define(DB_NOOVERWRITE, 20). --define(DB_NOSYNC, 21). --define(DB_POSITION, 22). --define(DB_PREV, 23). --define(DB_PREV_DUP, 24). --define(DB_PREV_NODUP, 25). --define(DB_SET, 26). --define(DB_SET_RANGE, 27). --define(DB_SET_RECNO, 28). --define(DB_UPDATE_SECONDARY, 29). --define(DB_WRITECURSOR, 30). --define(DB_WRITELOCK, 31). +-define(DB_AFTER, 1). +-define(DB_APPEND, 2). +-define(DB_BEFORE, 3). +-define(DB_CONSUME, 4). +-define(DB_CONSUME_WAIT, 5). +-define(DB_CURRENT, 6). +-define(DB_FIRST, 7). +-define(DB_GET_BOTH, 8). +-define(DB_GET_BOTHC, 9). +-define(DB_GET_BOTH_RANGE, 10). +-define(DB_GET_RECNO, 11). +-define(DB_JOIN_ITEM, 12). +-define(DB_KEYFIRST, 13). +-define(DB_KEYLAST, 14). +-define(DB_LAST, 15). +-define(DB_NEXT, 16). +-define(DB_NEXT_DUP, 17). +-define(DB_NEXT_NODUP, 18). +-define(DB_NODUPDATA, 19). +-define(DB_NOOVERWRITE, 20). +-define(DB_OVERWRITE_DUP, 21). +-define(DB_POSITION, 22). +-define(DB_PREV, 23). +-define(DB_PREV_DUP, 24). +-define(DB_PREV_NODUP, 25). +-define(DB_SET, 26). +-define(DB_SET_RANGE, 27). +-define(DB_SET_RECNO, 28). +-define(DB_UPDATE_SECONDARY, 29). +-define(DB_SET_LTE, 30). +-define(DB_GET_BOTH_LTE, 31). diff --git a/int_test/stress_SUITE.erl b/int_test/stress_SUITE.erl deleted file mode 100644 index a787a62..0000000 --- a/int_test/stress_SUITE.erl +++ /dev/null @@ -1,110 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% bdberl: Port Driver Stress tests -%% Copyright (c) 2008 The Hive. All rights reserved. -%% -%% Permission is hereby granted, free of charge, to any person obtaining a copy -%% of this software and associated documentation files (the "Software"), to deal -%% in the Software without restriction, including without limitation the rights -%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -%% copies of the Software, and to permit persons to whom the Software is -%% furnished to do so, subject to the following conditions: -%% -%% The above copyright notice and this permission notice shall be included in -%% all copies or substantial portions of the Software. -%% -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -%% THE SOFTWARE. -%% -%% ------------------------------------------------------------------- --module(stress_SUITE). --compile(export_all). --include_lib("ct.hrl"). - -%% NOTE: all of the tests are set for a low number of iterations to guarantee -%% that they all pass and run in a reasonable amount of time. That kinda defeats -%% the purpose of the test, tho. Work is ongoing to make this a useful test suite. - -all() -> - [rewrite_array_test, - rewrite_bytes_test, - write_array_test, - write_bytes_test]. - -init_per_suite(Config) -> - {ok, Cwd} = file:get_cwd(), - {ok, _} = file:copy(lists:append([Cwd, "/../../int_test/DB_CONFIG"]), - lists:append([Cwd, "/DB_CONFIG"])), - crypto:start(), - Config. - -end_per_suite(_Config) -> - ok. - -init_per_testcase(TestCase, Config) -> - Size = 1024 * 1024, - Chunk = crypto:rand_bytes(Size), - Name = io_lib:format("~p.db", [TestCase]), - {ok, Db} = bdberl:open(Name, hash), - [{size, Size}, {chunk, Chunk}, {db, Db}|Config]. - -end_per_testcase(_TestCase, Config) -> - bdberl:close(?config(db, Config)), - ok. - -%%--------------------------------------------------------------------------- - -rewrite_array_test(Config) -> - %% If you try to run this one for more than 2K iterations than the Erlang - %% VM will die with a memory allocation error when creating the binary. - ct:print("Running rewrite_array test for 2000 iterations..."), - Chunk = ?config(chunk, Config), - rewrite_array(?config(db, Config), Chunk, [Chunk], 20). - -rewrite_array(_Db, _Block, _Bytes, 0) -> - ok; -rewrite_array(Db, Block, Bytes, Iter) -> - bdberl:put(Db, 1, Bytes), - rewrite_array(Db, Block, [Block|Bytes], Iter - 1). - -%%--------------------------------------------------------------------------- - -rewrite_bytes_test(Config) -> - ct:print("Running rewrite_bytes test for 2500 iterations..."), - rewrite_bytes(?config(db, Config), ?config(chunk, Config), 25). - -rewrite_bytes(_Db, _Bytes, 0) -> - ok; -rewrite_bytes(Db, Bytes, Iter) -> - bdberl:put(Db, 1, Bytes), - rewrite_bytes(Db, Bytes, Iter - 1). - -%%--------------------------------------------------------------------------- - -write_array_test(Config) -> - ct:print("Running write_array test for 150 iterations..."), - Chunk = ?config(chunk, Config), - write_array(?config(db, Config), Chunk, [Chunk], 15). - -write_array(_Db, _Block, _Bytes, 0) -> - ok; -write_array(Db, Block, Bytes, Iter) -> - bdberl:put(Db, Iter, Bytes), - write_array(Db, Block, [Block|Bytes], Iter - 1). - -%%--------------------------------------------------------------------------- - -write_bytes_test(Config) -> - ct:print("Running write_bytes test for 2500 iterations..."), - write_bytes(?config(db, Config), ?config(chunk, Config), 25). - -write_bytes(_Db, _Bytes, 0) -> - ok; -write_bytes(Db, Bytes, Iter) -> - bdberl:put(Db, Iter, Bytes), - write_bytes(Db, Bytes, Iter - 1). diff --git a/int_test/thrash_SUITE.erl b/int_test/thrash_SUITE.erl deleted file mode 100644 index 31b9bed..0000000 --- a/int_test/thrash_SUITE.erl +++ /dev/null @@ -1,80 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% bdberl: Port Driver Thrash tests -%% Copyright (c) 2008 The Hive. All rights reserved. -%% -%% Permission is hereby granted, free of charge, to any person obtaining a copy -%% of this software and associated documentation files (the "Software"), to deal -%% in the Software without restriction, including without limitation the rights -%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -%% copies of the Software, and to permit persons to whom the Software is -%% furnished to do so, subject to the following conditions: -%% -%% The above copyright notice and this permission notice shall be included in -%% all copies or substantial portions of the Software. -%% -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -%% THE SOFTWARE. -%% -%% ------------------------------------------------------------------- --module(thrash_SUITE). - --compile(export_all). - -all() -> - [test_thrash]. - --define(PROCS, 10). - -test_thrash(_Config) -> - %% Spin up 15 processes (async thread pool is 10) - start_procs(?PROCS), - wait_for_finish(?PROCS). - -start_procs(0) -> - ok; -start_procs(Count) -> - spawn_link(?MODULE, thrash_run, [self()]), - start_procs(Count-1). - -wait_for_finish(0) -> - ok; -wait_for_finish(Count) -> - receive - {finished, Pid} -> - ct:print("~p is done; ~p remaining.\n", [Pid, Count-1]), - wait_for_finish(Count-1) - end. - -thrash_run(Owner) -> - %% Seed the RNG - {A1, A2, A3} = now(), - random:seed(A1, A2, A3), - - %% Open up a port and database - {ok, 0} = bdberl:open("thrash", btree), - - %% Start thrashing - thrash_incr_loop(Owner, 1000). - -thrash_incr_loop(Owner, 0) -> - Owner ! {finished, self()}; -thrash_incr_loop(Owner, Count) -> - % ct:print("~p", [Count]), - %% Choose random key - Key = random:uniform(1200), - - %% Start a txn that will read the current value of the key and increment by 1 - F = fun(_Key, Value) -> - case Value of - not_found -> 0; - Value -> Value + 1 - end - end, - {ok, _} = bdberl:update(0, Key, F), - thrash_incr_loop(Owner, Count-1). diff --git a/src/bdberl.erl b/src/bdberl.erl index 76e71e5..23227bb 100644 --- a/src/bdberl.erl +++ b/src/bdberl.erl @@ -182,6 +182,8 @@ open(Name, Type, Opts) -> case Type of btree -> TypeCode = ?DB_TYPE_BTREE; hash -> TypeCode = ?DB_TYPE_HASH; + recno -> TypeCode = ?DB_TYPE_RECNO; + queue -> TypeCode = ?DB_TYPE_QUEUE; unknown -> TypeCode = ?DB_TYPE_UNKNOWN %% BDB automatically determines if file exists end, Flags = process_flags(lists:umerge(Opts, [auto_commit, threaded])), diff --git a/test/cover.spec b/test/cover.spec deleted file mode 100644 index e6d48cb..0000000 --- a/test/cover.spec +++ /dev/null @@ -1,3 +0,0 @@ -{export, ["test/test.cover"]}. -{level, details}. -{incl_dirs_r, ["ebin"]}. From 0163145b5bbe2e2583dc2f1b3545c7f13d84c9e7 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 10:59:48 +0400 Subject: [PATCH 03/16] Auto download Berkeley DB from Oralce then needed --- Makefile | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index a4845c1..62ad2ac 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,25 @@ -all: c_src/system/lib/libdb.a - ./rebar compile eunit ct +BDB_VERSION=5.1.25 +BDB_DIST=db-$(BDB_VERSION).tar.gz +BDB_LOCAL_DIST=c_src/$(BDB_DIST) +BDB_LOCAL_LIB=c_src/system/lib/libdb.a +BDB_DIST_URL=http://download.oracle.com/berkeley-db/$(BDB_DIST) -c_src/system/lib/libdb.a: +ERL = erl +REBAR = ./rebar +REBAR_FLAGS= + +all: $(BDB_LOCAL_LIB) + $(REBAR) $(REBAR_FLAGS) compile eunit ct + +$(BDB_LOCAL_DIST): + $(ERL) -noshell -s inets -eval 'httpc:request(get, {"$(BDB_DIST_URL)", []}, [], [{stream, "$(BDB_LOCAL_DIST)"}])' -s init stop + +$(BDB_LOCAL_LIB): $(BDB_LOCAL_DIST) c_src/buildlib.sh clean: - ./rebar clean + $(REBAR) $(REBAR_FLAGS) clean +distclean: clean + -rm -rf $(BDB_LOCAL_DIST) + -rm -rf c_src/sources + -rm -rf priv From e3e0c7c3ee4573cda974a6db32559fbee5cadc65 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 11:18:29 +0400 Subject: [PATCH 04/16] Add erlang flags --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 62ad2ac..67e64c1 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,16 @@ BDB_LOCAL_DIST=c_src/$(BDB_DIST) BDB_LOCAL_LIB=c_src/system/lib/libdb.a BDB_DIST_URL=http://download.oracle.com/berkeley-db/$(BDB_DIST) -ERL = erl -REBAR = ./rebar +ERL=erl +ERL_FLAGS=+A10 +REBAR=./rebar REBAR_FLAGS= all: $(BDB_LOCAL_LIB) - $(REBAR) $(REBAR_FLAGS) compile eunit ct + ERL_FLAGS=$(ERL_FLAGS) $(REBAR) $(REBAR_FLAGS) compile eunit ct $(BDB_LOCAL_DIST): - $(ERL) -noshell -s inets -eval 'httpc:request(get, {"$(BDB_DIST_URL)", []}, [], [{stream, "$(BDB_LOCAL_DIST)"}])' -s init stop + ERL_FLAGS=$(ERL_FLAGS) $(ERL) -noshell -s inets -eval 'httpc:request(get, {"$(BDB_DIST_URL)", []}, [], [{stream, "$(BDB_LOCAL_DIST)"}])' -s init stop $(BDB_LOCAL_LIB): $(BDB_LOCAL_DIST) c_src/buildlib.sh From 91350213d2ef6e88a659e66859312b43445c4abb Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 11:18:43 +0400 Subject: [PATCH 05/16] Cleanup --- rebar.config | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rebar.config b/rebar.config index 8aca7c1..caec78c 100644 --- a/rebar.config +++ b/rebar.config @@ -3,11 +3,6 @@ {"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libdb.a -lpthread"} ]}. -{port_pre_script, {"c_src/buildlib.sh", - "c_src/system/lib/libdb.a"}}. - {cover_enabled, true}. {ct_extra_params, "-boot start_sasl -s snmp"}. - -{clean_files, ["c_src/system/lib/libdb.a"]}. From fa4ef58c021e5e730b858bd3c1ef78deebbab885 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 11:23:55 +0400 Subject: [PATCH 06/16] Add myself --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 8aa3b05..3a30188 100644 --- a/README +++ b/README @@ -4,3 +4,4 @@ Authors: Dave "dizzyd" Smith Phil Toland Jon Meredith + Sergey Yelin From 9673962a87e0b21c85d49f4481089e8ad1d935cd Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 11:28:38 +0400 Subject: [PATCH 07/16] More cleanups --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 67e64c1..b1cf7b8 100644 --- a/Makefile +++ b/Makefile @@ -24,3 +24,4 @@ distclean: clean -rm -rf $(BDB_LOCAL_DIST) -rm -rf c_src/sources -rm -rf priv + -rm -rf logs From 5f73c3f32ec4f5f90ebba585d7798cd1af48ba74 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 11:50:39 +0400 Subject: [PATCH 08/16] Make this run on Debian/Ubuntu --- c_src/buildlib.sh | 2 +- rebar | Bin 102307 -> 102303 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/c_src/buildlib.sh b/c_src/buildlib.sh index c22be69..5ded133 100755 --- a/c_src/buildlib.sh +++ b/c_src/buildlib.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash if [ `basename $PWD` != "c_src" ]; then pushd c_src diff --git a/rebar b/rebar index c4c44f587e100efc235f620cc12b41b56f372825..65facb525027fe166407f31ee77a81954ebcbe93 100755 GIT binary patch delta 2079 zcmZuy3rv$&6uyT?6|5}^0~8P#4^CV% z2;N#)f7oU?94BHiDPe^tmIL+;qSNfi-!A52?2%^XXr0YZtjOr=<;~gIyYI&vgyx!tA_3GTVaKjpn zVmQfj@7B1LO3QHK_()*rh-ufmm-GP}v`h1r9`8tQ@4UU<&Aa?!maQo(dY#O6!6upL zx*TAWe|-B=e{*d1x!?4ctr5XKhAGjr-NM7(zM}nnn=e#^`e5bTn|JXAf88RTkDjZ? zQr!@Qc3u@BnCSiHIRxhi`(`1~4(;O`e|+tUGkPA~7~>}}I#$Mm%=>qF!S$0jQO6$O z3L7xrE)zpJ4&HuqAq=2`y=@V+p{PAE1l&D1ReSnMIEACOOA}xV?!&$#73R&ss5%SQ zVDa{@Y$ycINBwibg29el*n)eb6EbMPSiKy25X39seFVb_7)EwaK4hSPebz1*;HAEO z6KW*f3P&H+uFhdsW)GncwBSc83Sc*;-zk6t2r5-jf#7cy+(*IjLO96RrY(kZScv^4 z4eaI*=_`Y4I1_5#4`Y~6S_!3ma9j%q_zLz_K|RX4>L3b1y?oNcVg~=Ca-i z0sJP!TttXkDVM496lIZerK~u8GdOvX>31q2He|o~u{R-S784?MNOh-awXg`!EvW@R zh^FSJb|XVN;dN?WE78w@k1gQmNiOQ(K#MuQQ!h zna7?$uH5OSuFzjh5Q!r58kopVIqhi#A9_*_b7*>lFvL7A<>-YOy_m)*1= zhhEHOd|Fx)%*QL2deC#!#wcI1EAqSpHJ|F5AR0->a+I&dFv1D;1UrzD>E$M2fcn9K uFLD^+5PL-(2Y6b`&!er1?efKDz<&`mwVAcCwQ4#frj};#5dB!iG|0ckz?9tp delta 2068 zcmZ8hdrXs86u*ZmB5wr*N_jsF=xhwA9Uu;6*$8z$r$!+gt)MN%DIf#HP@q6tpdBDP z3~{#kQMtBEx4FW5X`XCCFk{S%^&fe3C?UXK#{Un`_0RMr zuvK2-LEu+~CV;@(Gb<+&I5oT8i@=-dBi;nYb2=vw=*Yb(x;8J*71NKc{LFJQSI#Os zrK(LFE?##&psw<4#-g2#*~9vT1&SzZ!2Q2&&r43T6`k+ZgHPgGvm>f!cwd!%0m?Y_h~PS7&Rx(=}(uP2DM& ze*eV64|iDi*)m>aUEdfo9JFxBVN-svGvejE)ag*kHgV8dRSBWQylXEOTmH5qU@9>e z`WH_o5HonmlfcvAb0GvykB&?tP<^pR9R11VaTzg>uiX)MaQ#k&2$tRZLln$(UMC$# z_(aI2d`E#VRMP4lSLASp6dZj~u!lq)3*x~$P*8QKQ{fmb+u@T1YB~|e+Ql%%hrFBC zKsq(=_;M}iLEtbfAKJ;eHy_k=a`?0mtmHFk;1B_o7JB@J<2gBa($dGTLkXZ=15r4x zg@cqmxE@xJphH#+XGH1I4bVX8?`(ulKOx;Y_r{Y|JiQZ*b)dk4Ht86k(jjCxo=ptK$`#h7|nMBr~1P&L4OVyYS-^W_!B z;|-7&EzGPpmH)ZIm$9L#jQR1|83X!d%!YxDprB-BBSi3Bvn%6D(b;EMkp6IGT1oa$=K1!j0q3-WjW`8F6H1fEHO#x zH6~u;GJb4=Xv)mlSG3eLiLo9Z#zNdO_l$O391X?$uFPjb=4uRWf+XtpjV5ki!u%$P zB)e9yf5M(7NTC%R33VKQ%Zsrcd<}dH|Lf@}jx|9n1_p2j6odB$?NK;t$URjX=$4o$P7_V^^$iT5$It zS9OL?WUPU&Nba_!=6t+mfp9!%0ebg%k_+(jy=j42B`R8j_$~gl?F>b|e z6_lbtwGF0_()%{9RJ=_p@QF<-FeK1Fp4S>2|64Tsx;%))6ho SJ$2xP7CQub-m2r{v;P2Eq63Zq From 08c55326fe01ad5cbd6ff8eed00ed2db9716a5fd Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 12:19:17 +0400 Subject: [PATCH 09/16] Remove DEBUG flag --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index caec78c..42b773e 100644 --- a/rebar.config +++ b/rebar.config @@ -1,5 +1,5 @@ {port_envs, [ - {"DRV_CFLAGS", "$DRV_CFLAGS -Werror -I c_src/system/include -lpthread -DDEBUG"}, + {"DRV_CFLAGS", "$DRV_CFLAGS -Werror -I c_src/system/include -lpthread"}, {"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libdb.a -lpthread"} ]}. From a1291880df7f6021558ad959f669156c262677f0 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 15:37:32 +0400 Subject: [PATCH 10/16] Disable stress test for now --- {test => int_test}/stress_SUITE.erl | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) rename {test => int_test}/stress_SUITE.erl (87%) diff --git a/test/stress_SUITE.erl b/int_test/stress_SUITE.erl similarity index 87% rename from test/stress_SUITE.erl rename to int_test/stress_SUITE.erl index 0829187..3b93631 100644 --- a/test/stress_SUITE.erl +++ b/int_test/stress_SUITE.erl @@ -36,11 +36,21 @@ all() -> write_array_test, write_bytes_test]. +dbconfig(Config) -> + Cfg = [ + {set_data_dir, ?config(priv_dir, Config)}, + {set_flags, 'DB_TXN_WRITE_NOSYNC'}, + {set_cachesize, '0 536870912 1'}, + {set_lg_max, '1048576000'}, + {set_lg_bsize, '5368709120'}, + {set_log_config, 'DB_LOG_IN_MEMORY'} + ], + list_to_binary(lists:flatten([io_lib:format("~s ~s\n", [K,V]) || {K, V} <- Cfg])). + init_per_suite(Config) -> - {ok, Cwd} = file:get_cwd(), - {ok, _} = file:copy(lists:append([Cwd, "/../../int_test/DB_CONFIG"]), - lists:append([Cwd, "/DB_CONFIG"])), - crypto:start(), + DbHome = ?config(priv_dir, Config), + os:putenv("DB_HOME", DbHome), + ok = file:write_file(DbHome ++ "DB_CONFIG", dbconfig(Config)), Config. end_per_suite(_Config) -> From 38643c5fb4bad6d1315e843d7e8e9e290a03974a Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 15:47:57 +0400 Subject: [PATCH 11/16] More cleanups --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index b1cf7b8..6f09f14 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ $(BDB_LOCAL_LIB): $(BDB_LOCAL_DIST) c_src/buildlib.sh clean: $(REBAR) $(REBAR_FLAGS) clean + -rm test/*.beam distclean: clean -rm -rf $(BDB_LOCAL_DIST) From 7768ac22e0ccabae248227c65a14d6387ab71fe4 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 16:04:06 +0400 Subject: [PATCH 12/16] Fix statrt for cases when application not running. --- src/bdberl.erl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/bdberl.erl b/src/bdberl.erl index 23227bb..70e766c 100644 --- a/src/bdberl.erl +++ b/src/bdberl.erl @@ -2106,7 +2106,7 @@ stop() -> %% ==================================================================== init() -> - case erl_ddll:load_driver(code:priv_dir(bdberl), bdberl_drv) of + case erl_ddll:load_driver(priv_dir(), bdberl_drv) of ok -> ok; {error, permanent} -> ok % Means that the driver is already active end, @@ -2125,6 +2125,15 @@ init() -> erlang:put(bdb_port, Port), Port. +priv_dir() -> + case code:priv_dir(?MODULE) of + Name when is_list(Name) -> + Name; + {error, bad_name} -> + {ok, Cwd} = file:get_cwd(), + filename:absname(filename:join(Cwd, "../priv")) + end. + get_port() -> case erlang:get(bdb_port) of undefined -> init(); From e874dbf319d33e7837fe55f0064ef07698f777fc Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 18:26:48 +0400 Subject: [PATCH 13/16] Do not force pthread and add more diagnostic --- c_src/buildlib.sh | 2 +- rebar.config | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/c_src/buildlib.sh b/c_src/buildlib.sh index 5ded133..6592ef8 100755 --- a/c_src/buildlib.sh +++ b/c_src/buildlib.sh @@ -27,7 +27,7 @@ rm -rf system db-${DB_VER} tar -xzf db-${DB_VER}.tar.gz && \ ##(cd db-${DB_VER} && patch -p0 < ../bdb-align.patch ) && \ (cd db-${DB_VER}/build_unix && \ - ../dist/configure --prefix=$WORKDIR --enable-diagnostic --enable-debug --disable-replication --disable-shared --with-pic && make && ranlib libdb-*.a && make install) && \ + ../dist/configure --prefix=$WORKDIR --enable-diagnostic --enable-debug --disable-shared --enable-perfmon-statistics --enable-dtrace && make && ranlib libdb-*.a && make install) && \ rm -rf db-${DB_VER} diff --git a/rebar.config b/rebar.config index 42b773e..d502df1 100644 --- a/rebar.config +++ b/rebar.config @@ -1,6 +1,6 @@ {port_envs, [ - {"DRV_CFLAGS", "$DRV_CFLAGS -Werror -I c_src/system/include -lpthread"}, - {"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libdb.a -lpthread"} + {"DRV_CFLAGS", "$DRV_CFLAGS -Werror -I c_src/system/include"}, + {"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libdb.a"} ]}. {cover_enabled, true}. From 7bdfbacdc9449d094de7f692486b63f1c3d5be6a Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 19:37:57 +0400 Subject: [PATCH 14/16] Fix flags (changed in 5.x) --- int_test/DB_CONFIG | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/int_test/DB_CONFIG b/int_test/DB_CONFIG index d52a847..ef9b21b 100644 --- a/int_test/DB_CONFIG +++ b/int_test/DB_CONFIG @@ -2,4 +2,6 @@ set_flags DB_TXN_WRITE_NOSYNC set_cachesize 0 536870912 1 set_lg_max 104857600 set_lg_bsize 536870912 -set_log_config DB_LOG_IN_MEMORY +log_set_config DB_LOG_IN_MEMORY +set_flags DB_LOG_AUTOREMOVE + From fad7dd51292d7af80e70c627240feca21b2db81e Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 19:39:14 +0400 Subject: [PATCH 15/16] Sync flags and DB codes --- c_src/bdberl_drv.h | 2 ++ include/bdberl.hrl | 1 + 2 files changed, 3 insertions(+) diff --git a/c_src/bdberl_drv.h b/c_src/bdberl_drv.h index ae294eb..9af783f 100644 --- a/c_src/bdberl_drv.h +++ b/c_src/bdberl_drv.h @@ -84,6 +84,8 @@ */ #define DB_TYPE_BTREE DB_BTREE /* 1 */ #define DB_TYPE_HASH DB_HASH /* 2 */ +#define DB_TYPE_RECNO DB_RECNO /* 3 */ +#define DB_TYPE_QUEUE DB_QUEUE /* 4 */ /** * Error codes -- chosen so that we do not conflict with other packages, particularly diff --git a/include/bdberl.hrl b/include/bdberl.hrl index 3a4f564..670f666 100644 --- a/include/bdberl.hrl +++ b/include/bdberl.hrl @@ -88,6 +88,7 @@ -define(ERROR_DB_ACTIVE, -29007). % Database is currently active; operation requires otherwise -define(ERROR_INVALID_CMD, -29008). % Invalid command -define(ERROR_INVALID_DB_TYPE,-29009). % Invalid database type +-define(ERROR_INVALID_VALUE, -29010). % Invalid CRC-32 on value %% DB (user visible) error return codes. -define(DB_BUFFER_SMALL, -30999). % User memory too small for return. From 5b3f7fb6e2f9df96f0dfce075afcd56fea157fe6 Mon Sep 17 00:00:00 2001 From: Sergey Yelin Date: Mon, 18 Jul 2011 19:43:56 +0400 Subject: [PATCH 16/16] Remove diagnostic flags - unneeded --- c_src/buildlib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c_src/buildlib.sh b/c_src/buildlib.sh index 6592ef8..09e671c 100755 --- a/c_src/buildlib.sh +++ b/c_src/buildlib.sh @@ -27,7 +27,7 @@ rm -rf system db-${DB_VER} tar -xzf db-${DB_VER}.tar.gz && \ ##(cd db-${DB_VER} && patch -p0 < ../bdb-align.patch ) && \ (cd db-${DB_VER}/build_unix && \ - ../dist/configure --prefix=$WORKDIR --enable-diagnostic --enable-debug --disable-shared --enable-perfmon-statistics --enable-dtrace && make && ranlib libdb-*.a && make install) && \ + ../dist/configure --prefix=$WORKDIR --disable-shared && make && ranlib libdb-*.a && make install) && \ rm -rf db-${DB_VER}