aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2018-10-19 20:08:22 +0200
committerSverker Eriksson <[email protected]>2018-10-23 12:36:29 +0200
commit822b60430eeae0ae32aca52019762566fec1acce (patch)
treea78ed76ffacefd19fdaf2b727e741126af7ac21e /erts
parentbe9fd1bfaa30ba25b6d3a3a39159c81172964010 (diff)
downloadotp-822b60430eeae0ae32aca52019762566fec1acce.tar.gz
otp-822b60430eeae0ae32aca52019762566fec1acce.tar.bz2
otp-822b60430eeae0ae32aca52019762566fec1acce.zip
erts: Provoke random catree split/join for DEBUG emulator
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/erl_db_catree.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c
index 5069e1e531..c3bebefbdf 100644
--- a/erts/emulator/beam/erl_db_catree.c
+++ b/erts/emulator/beam/erl_db_catree.c
@@ -630,6 +630,31 @@ static TreeDbTerm* join_trees(TreeDbTerm *left_root_param,
}
}
+#ifdef DEBUG
+# define FORCE_RANDOM_SPLIT_JOIN
+#endif
+#ifdef FORCE_RANDOM_SPLIT_JOIN
+static int dbg_fastrand(void)
+{
+ static int g_seed = 648835;
+ g_seed = (214013*g_seed+2531011);
+ return (g_seed>>16)&0x7FFF;
+}
+
+static void dbg_maybe_force_splitjoin(DbTableCATreeNode* base_node)
+{
+ switch (dbg_fastrand() % 8) {
+ case 1:
+ base_node->u.base.lock_statistics = 1+ERL_DB_CATREE_HIGH_CONTENTION_LIMIT;
+ break;
+ case 2:
+ base_node->u.base.lock_statistics = -1+ERL_DB_CATREE_LOW_CONTENTION_LIMIT;
+ break;
+ }
+}
+#else
+# define dbg_maybe_force_splitjoin(N)
+#endif /* FORCE_RANDOM_SPLIT_JOIN */
static ERTS_INLINE
int try_wlock_base_node(DbTableCATreeBaseNode *base_node)
@@ -676,6 +701,7 @@ void wunlock_adapt_base_node(DbTableCATree* tb,
DbTableCATreeNode* parent,
int current_level)
{
+ dbg_maybe_force_splitjoin(base_node);
if (base_node->u.base.lock_statistics > ERL_DB_CATREE_HIGH_CONTENTION_LIMIT
&& current_level < ERL_DB_CATREE_MAX_ROUTE_NODE_LAYER_HEIGHT) {
split_catree(tb, base_node, parent);