aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_db_catree.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2018-10-11 23:34:49 +0200
committerSverker Eriksson <[email protected]>2018-10-23 12:36:28 +0200
commit129e61564807c0ad43faf9d0c36260c793501920 (patch)
tree26822017b645e14403c5e7989d9a4d536217e063 /erts/emulator/beam/erl_db_catree.c
parent375a1f5c29fd2d3b537e117149e78b0ac61e263f (diff)
downloadotp-129e61564807c0ad43faf9d0c36260c793501920.tar.gz
otp-129e61564807c0ad43faf9d0c36260c793501920.tar.bz2
otp-129e61564807c0ad43faf9d0c36260c793501920.zip
erts: Add erts_debug feature 'ets_force_split'
to easier generate a routing tree for test without having to spend cpu to provoke actual repeated lock conflicts.
Diffstat (limited to 'erts/emulator/beam/erl_db_catree.c')
-rw-r--r--erts/emulator/beam/erl_db_catree.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c
index f467230ced..975e19a878 100644
--- a/erts/emulator/beam/erl_db_catree.c
+++ b/erts/emulator/beam/erl_db_catree.c
@@ -885,7 +885,8 @@ static DbTableCATreeNode *create_base_node(DbTableCATree *tb,
"erl_db_catree_base_node",
lc_key,
ERTS_LOCK_FLAGS_CATEGORY_DB);
- p->u.base.lock_statistics = 0;
+ p->u.base.lock_statistics = ((tb->common.status & DB_CATREE_FORCE_SPLIT)
+ ? INT_MAX : 0);
p->u.base.is_valid = 1;
return p;
}
@@ -1205,7 +1206,8 @@ static void split_catree(DbTableCATree *tb,
DbTableCATreeNode* ERTS_RESTRICT new_route;
if (less_than_two_elements(base->u.base.root)) {
- base->u.base.lock_statistics = 0;
+ if (!(tb->common.status & DB_CATREE_FORCE_SPLIT))
+ base->u.base.lock_statistics = 0;
wunlock_base_node(&base->u.base);
return;
} else {
@@ -2118,6 +2120,25 @@ void erts_lcnt_enable_db_catree_lock_count(DbTableCATree *tb, int enable)
}
#endif /* ERTS_ENABLE_LOCK_COUNT */
+void db_catree_force_split(DbTableCATree* tb, int on)
+{
+ CATreeRootIterator iter;
+ TreeDbTerm** root;
+
+ init_root_iterator(tb, &iter, 1);
+ root = catree_find_first_root(&iter);
+ do {
+ iter.locked_bnode->lock_statistics = (on ? INT_MAX : 0);
+ root = catree_find_next_root(&iter);
+ } while (root);
+ ASSERT(!iter.locked_bnode);
+
+ if (on)
+ tb->common.status |= DB_CATREE_FORCE_SPLIT;
+ else
+ tb->common.status &= ~DB_CATREE_FORCE_SPLIT;
+}
+
void db_calc_stats_catree(DbTableCATree* tb, DbCATreeStats* stats)
{
DbTableCATreeNode* stack[ERL_DB_CATREE_MAX_ROUTE_NODE_LAYER_HEIGHT];