summaryrefslogtreecommitdiff
path: root/libs/libmdbx
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2018-09-16 18:35:44 +0300
committerGeorge Hazan <ghazan@miranda.im>2018-09-16 18:35:44 +0300
commitcee72905099ee7be2bc7327907e09a28f2220d15 (patch)
tree032f8d06707e2e4fd57f8bb9c9a3c086fbc847ac /libs/libmdbx
parent50d176bfe78d4b5ffd829a874e503facef398e7d (diff)
libmdbx: fix for GC
Diffstat (limited to 'libs/libmdbx')
-rw-r--r--libs/libmdbx/src/appveyor.yml20
-rw-r--r--libs/libmdbx/src/src/mdbx.c109
-rw-r--r--libs/libmdbx/src/test/log.cc6
-rw-r--r--libs/libmdbx/src/test/log.h2
-rw-r--r--libs/libmdbx/src/test/osal-windows.cc5
-rw-r--r--libs/libmdbx/src/test/test.vcxproj4
6 files changed, 92 insertions, 54 deletions
diff --git a/libs/libmdbx/src/appveyor.yml b/libs/libmdbx/src/appveyor.yml
index 1ee3a467c8..10a9ab2915 100644
--- a/libs/libmdbx/src/appveyor.yml
+++ b/libs/libmdbx/src/appveyor.yml
@@ -19,7 +19,7 @@ configuration:
platform:
- x86
-#- x64
+- x64
#- ARM
build_script:
@@ -32,21 +32,23 @@ build_script:
test_script:
- ps: |
- if (($env:PLATFORM -eq "x86") -and (Test-Path "C:\projects\libmdbx\Win32\$env:CONFIGURATION\test.exe" -PathType Leaf)) {
- $test = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\test.exe"
+ if (($env:PLATFORM -eq "x86") -and (Test-Path "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_test.exe" -PathType Leaf)) {
+ $mdbx_test = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_test.exe"
$mdbx_chk = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_chk.exe"
} elseif (($env:PLATFORM -ne "ARM") -and ($env:PLATFORM -ne "ARM64")) {
- $test = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\test.exe"
+ $mdbx_test = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\mdbx_test.exe"
$mdbx_chk = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\mdbx_chk.exe"
} else {
- $test = ""
+ $mdbx_test = ""
$mdbx_chk = ""
}
- if ($test -ne "") {
- & "$test" --pathname=tmp.db --dont-cleanup-after basic | Tee-Object -file test.log | Select-Object -last 42
- & "$mdbx_chk" -nvv tmp.db | Tee-Object -file chk.log | Select-Object -last 42
+ if ($mdbx_test -ne "") {
+ & "$mdbx_test" --pathname=test.db --dont-cleanup-after basic | Tee-Object -file test.log | Select-Object -last 42
+ & "$mdbx_chk" -nvv test.db | Tee-Object -file chk.log | Select-Object -last 42
}
on_failure:
-- ps: Push-AppveyorArtifact test.log chk.log
+- ps: Push-AppveyorArtifact test.log
+- ps: Push-AppveyorArtifact test.db
+- ps: Push-AppveyorArtifact chk.log
diff --git a/libs/libmdbx/src/src/mdbx.c b/libs/libmdbx/src/src/mdbx.c
index 3d576eca68..82e0959134 100644
--- a/libs/libmdbx/src/src/mdbx.c
+++ b/libs/libmdbx/src/src/mdbx.c
@@ -2408,7 +2408,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
last, txn->mt_dbs[FREE_DBI].md_root, repg_pos);
unsigned i;
for (i = repg_pos; i; i--)
- mdbx_debug_extra_print(" %" PRIaPGNO "", re_pnl[i]);
+ mdbx_debug_extra_print(" %" PRIaPGNO, re_pnl[i]);
mdbx_debug_extra_print("\n");
}
@@ -2511,7 +2511,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
* just for resume reclaiming only, not for data consistency. */
mdbx_debug("kick-gc: head %" PRIaTXN "-%s, tail %" PRIaTXN
- "-%s, oldest %" PRIaTXN "",
+ "-%s, oldest %" PRIaTXN,
mdbx_meta_txnid_stable(env, head), mdbx_durable_str(head),
mdbx_meta_txnid_stable(env, steady),
mdbx_durable_str(steady), oldest);
@@ -3576,7 +3576,7 @@ static int mdbx_prep_backlog(MDBX_txn *txn, MDBX_cursor *mc) {
/* Count all the pages in each DB and in the freelist and make sure
* it matches the actual number of pages being used.
* All named DBs must be open for a correct count. */
-static int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) {
+static __cold int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) {
MDBX_val key, data;
const pgno_t pending =
@@ -3674,12 +3674,11 @@ static int mdbx_update_gc(MDBX_txn *txn) {
(void)dbg_prefix_mode;
mdbx_trace("\n>>> @%" PRIaTXN, txn->mt_txnid);
+ unsigned befree_stored = 0, loop = 0;
MDBX_cursor mc;
int rc = mdbx_cursor_init(&mc, txn, FREE_DBI);
if (unlikely(rc != MDBX_SUCCESS))
- return rc;
-
- unsigned befree_stored = 0, loop = 0;
+ goto bailout;
retry:
mdbx_trace(" >> restart");
@@ -3762,6 +3761,11 @@ retry:
// handle loose pages - put ones into the reclaimed- or befree-list
mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true));
+ if (mdbx_audit_enabled()) {
+ rc = mdbx_audit(txn, befree_stored);
+ if (unlikely(rc != MDBX_SUCCESS))
+ goto bailout;
+ }
if (txn->mt_loose_pages) {
/* Return loose page numbers to me_reclaimed_pglist,
* though usually none are left at this point.
@@ -3772,7 +3776,7 @@ retry:
* since unable to return them to me_reclaimed_pglist. */
if (unlikely((rc = mdbx_pnl_need(&txn->mt_befree_pages,
txn->mt_loose_count)) != 0))
- return rc;
+ goto bailout;
for (MDBX_page *mp = txn->mt_loose_pages; mp; mp = NEXT_LOOSE_PAGE(mp))
mdbx_pnl_xappend(txn->mt_befree_pages, mp->mp_pgno);
mdbx_trace("%s: append %u loose-pages to befree-pages", dbg_prefix_mode,
@@ -3851,6 +3855,11 @@ retry:
txn->mt_loose_pages = NULL;
txn->mt_loose_count = 0;
+ if (mdbx_audit_enabled()) {
+ rc = mdbx_audit(txn, befree_stored);
+ if (unlikely(rc != MDBX_SUCCESS))
+ goto bailout;
+ }
}
// handle reclaimed pages - return suitable into unallocated space
@@ -3884,6 +3893,11 @@ retry:
dbg_prefix_mode, txn->mt_next_pgno - tail, tail, txn->mt_next_pgno);
txn->mt_next_pgno = tail;
mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true));
+ if (mdbx_audit_enabled()) {
+ rc = mdbx_audit(txn, befree_stored);
+ if (unlikely(rc != MDBX_SUCCESS))
+ goto bailout;
+ }
}
}
@@ -3920,7 +3934,7 @@ retry:
" num %u, PNL",
txn->mt_txnid, txn->mt_dbs[FREE_DBI].md_root, i);
for (; i; i--)
- mdbx_debug_extra_print(" %" PRIaPGNO "", txn->mt_befree_pages[i]);
+ mdbx_debug_extra_print(" %" PRIaPGNO, txn->mt_befree_pages[i]);
mdbx_debug_extra_print("\n");
}
continue;
@@ -3931,6 +3945,11 @@ retry:
mdbx_tassert(txn, txn->mt_loose_count == 0);
mdbx_trace(" >> reserving");
+ if (mdbx_audit_enabled()) {
+ rc = mdbx_audit(txn, befree_stored);
+ if (unlikely(rc != MDBX_SUCCESS))
+ goto bailout;
+ }
const unsigned amount =
env->me_reclaimed_pglist ? MDBX_PNL_SIZE(env->me_reclaimed_pglist) : 0;
const unsigned left = amount - settled;
@@ -4213,6 +4232,11 @@ retry:
(unsigned)(to - env->me_reclaimed_pglist), to[-1], fill_gc_id);
left -= chunk;
+ if (mdbx_audit_enabled()) {
+ rc = mdbx_audit(txn, befree_stored + amount - left);
+ if (unlikely(rc != MDBX_SUCCESS))
+ goto bailout;
+ }
if (left == 0) {
rc = MDBX_SUCCESS;
break;
@@ -4240,11 +4264,12 @@ retry:
goto retry;
}
+ mdbx_tassert(txn,
+ txn->mt_lifo_reclaimed == NULL ||
+ cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed));
+
bailout:
if (txn->mt_lifo_reclaimed) {
- mdbx_tassert(txn,
- rc != MDBX_SUCCESS ||
- cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed));
MDBX_PNL_SIZE(txn->mt_lifo_reclaimed) = 0;
if (txn != env->me_txn0) {
mdbx_txl_free(txn->mt_lifo_reclaimed);
@@ -4328,7 +4353,7 @@ static int mdbx_page_flush(MDBX_txn *txn, pgno_t keep) {
wpos = pos;
wsize = 0;
}
- mdbx_debug("committing page %" PRIaPGNO "", pgno);
+ mdbx_debug("committing page %" PRIaPGNO, pgno);
next_pos = pos + size;
iov[n].iov_len = size;
iov[n].iov_base = (char *)dp;
@@ -6289,15 +6314,15 @@ int __cold mdbx_env_open(MDBX_env *env, const char *path, unsigned flags,
mdbx_debug("opened database version %u, pagesize %u",
(uint8_t)meta->mm_magic_and_version, env->me_psize);
- mdbx_debug("using meta page %" PRIaPGNO ", txn %" PRIaTXN "",
+ mdbx_debug("using meta page %" PRIaPGNO ", txn %" PRIaTXN,
container_of(meta, MDBX_page, mp_data)->mp_pgno,
mdbx_meta_txnid_fluid(env, meta));
mdbx_debug("depth: %u", db->md_depth);
- mdbx_debug("entries: %" PRIu64 "", db->md_entries);
- mdbx_debug("branch pages: %" PRIaPGNO "", db->md_branch_pages);
- mdbx_debug("leaf pages: %" PRIaPGNO "", db->md_leaf_pages);
- mdbx_debug("overflow pages: %" PRIaPGNO "", db->md_overflow_pages);
- mdbx_debug("root: %" PRIaPGNO "", db->md_root);
+ mdbx_debug("entries: %" PRIu64, db->md_entries);
+ mdbx_debug("branch pages: %" PRIaPGNO, db->md_branch_pages);
+ mdbx_debug("leaf pages: %" PRIaPGNO, db->md_leaf_pages);
+ mdbx_debug("overflow pages: %" PRIaPGNO, db->md_overflow_pages);
+ mdbx_debug("root: %" PRIaPGNO, db->md_root);
}
#endif
@@ -6576,7 +6601,7 @@ static MDBX_node *__hot mdbx_node_search(MDBX_cursor *mc, MDBX_val *key,
const unsigned nkeys = NUMKEYS(mp);
- mdbx_debug("searching %u keys in %s %spage %" PRIaPGNO "", nkeys,
+ mdbx_debug("searching %u keys in %s %spage %" PRIaPGNO, nkeys,
IS_LEAF(mp) ? "leaf" : "branch", IS_SUBP(mp) ? "sub-" : "",
mp->mp_pgno);
@@ -6779,7 +6804,7 @@ static int mdbx_page_search_root(MDBX_cursor *mc, MDBX_val *key, int flags) {
* while in the process of rebalancing a FreeDB branch page; we must
* let that proceed. ITS#8336 */
mdbx_cassert(mc, !mc->mc_dbi || NUMKEYS(mp) > 1);
- mdbx_debug("found index 0 to page %" PRIaPGNO "", NODEPGNO(NODEPTR(mp, 0)));
+ mdbx_debug("found index 0 to page %" PRIaPGNO, NODEPGNO(NODEPTR(mp, 0)));
if (flags & (MDBX_PS_FIRST | MDBX_PS_LAST)) {
i = 0;
@@ -7714,8 +7739,10 @@ int mdbx_cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
return MDBX_INCOMPATIBLE;
/* FALLTHRU */
case MDBX_SET:
+#ifndef SLAPD_LMDB_LEGACY
if (op == MDBX_SET && unlikely(data != NULL))
return MDBX_EINVAL;
+#endif /* SLAPD_LMDB_LEGACY */
/* FALLTHRU */
case MDBX_SET_KEY:
case MDBX_SET_RANGE:
@@ -8351,7 +8378,8 @@ new_sub:
} else {
/* There is room already in this leaf page. */
if (IS_LEAF2(mc->mc_pg[mc->mc_top])) {
- mdbx_cassert(mc, nflags == 0 && rdata->iov_len == 0);
+ mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0 &&
+ rdata->iov_len == 0);
rc = mdbx_node_add_leaf2(mc, mc->mc_ki[mc->mc_top], key);
} else
rc = mdbx_node_add_leaf(mc, mc->mc_ki[mc->mc_top], key, rdata, nflags);
@@ -8837,7 +8865,7 @@ static int __must_check_result mdbx_node_add_leaf(MDBX_cursor *mc,
int rc = mdbx_page_new(mc, P_OVERFLOW, ovpages, &largepage);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
- mdbx_debug("allocated overflow page %" PRIaPGNO "", largepage->mp_pgno);
+ mdbx_debug("allocated overflow page %" PRIaPGNO, largepage->mp_pgno);
flags |= F_BIGDATA;
node_size += sizeof(pgno_t);
mdbx_cassert(mc, mdbx_leaf_size(mc->mc_txn->mt_env, key, data) ==
@@ -8960,7 +8988,7 @@ static int mdbx_node_add(MDBX_cursor *mc, unsigned indx, const MDBX_val *key,
goto full;
if ((rc = mdbx_page_new(mc, P_OVERFLOW, ovpages, &ofp)))
return rc;
- mdbx_debug("allocated overflow page %" PRIaPGNO "", ofp->mp_pgno);
+ mdbx_debug("allocated overflow page %" PRIaPGNO, ofp->mp_pgno);
flags |= F_BIGDATA;
goto update;
} else {
@@ -9020,9 +9048,9 @@ update:
full:
mdbx_debug("not enough room in page %" PRIaPGNO ", got %u ptrs", mp->mp_pgno,
NUMKEYS(mp));
- mdbx_debug("upper-lower = %u - %u = %" PRIiPTR "", mp->mp_upper, mp->mp_lower,
+ mdbx_debug("upper-lower = %u - %u = %" PRIiPTR, mp->mp_upper, mp->mp_lower,
room);
- mdbx_debug("node size = %" PRIuPTR "", node_size);
+ mdbx_debug("node size = %" PRIuPTR, node_size);
mc->mc_txn->mt_flags |= MDBX_TXN_ERROR;
return MDBX_PAGE_FULL;
}
@@ -9039,7 +9067,7 @@ static void mdbx_node_del(MDBX_cursor *mc, size_t ksize) {
MDBX_node *node;
char *base;
- mdbx_debug("delete node %u on %s page %" PRIaPGNO "", indx,
+ mdbx_debug("delete node %u on %s page %" PRIaPGNO, indx,
IS_LEAF(mp) ? "leaf" : "branch", mp->mp_pgno);
numkeys = NUMKEYS(mp);
mdbx_cassert(mc, indx < numkeys);
@@ -9210,7 +9238,7 @@ static int mdbx_xcursor_init1(MDBX_cursor *mc, MDBX_node *node) {
mx->mx_db.md_flags |= MDBX_INTEGERKEY;
}
}
- mdbx_debug("Sub-db -%u root page %" PRIaPGNO "", mx->mx_cursor.mc_dbi,
+ mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi,
mx->mx_db.md_root);
mx->mx_dbflag = DB_VALID | DB_USRVALID | DB_DUPDATA;
/* FIXME: #if UINT_MAX < SIZE_MAX
@@ -9248,7 +9276,7 @@ static int mdbx_xcursor_init2(MDBX_cursor *mc, MDBX_xcursor *src_mx,
}
mx->mx_db = src_mx->mx_db;
mx->mx_cursor.mc_pg[0] = src_mx->mx_cursor.mc_pg[0];
- mdbx_debug("Sub-db -%u root page %" PRIaPGNO "", mx->mx_cursor.mc_dbi,
+ mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi,
mx->mx_db.md_root);
return MDBX_SUCCESS;
}
@@ -9478,8 +9506,8 @@ static int mdbx_update_key(MDBX_cursor *mc, const MDBX_val *key) {
char kbuf2[DKBUF_MAXKEYSIZE * 2 + 1];
k2.iov_base = NODEKEY(node);
k2.iov_len = node->mn_ksize;
- mdbx_debug("update key %u (ofs %u) [%s] to [%s] on page %" PRIaPGNO "",
- indx, ptr, mdbx_dkey(&k2, kbuf2, sizeof(kbuf2)), DKEY(key),
+ mdbx_debug("update key %u (ofs %u) [%s] to [%s] on page %" PRIaPGNO, indx,
+ ptr, mdbx_dkey(&k2, kbuf2, sizeof(kbuf2)), DKEY(key),
mp->mp_pgno);
}
@@ -9814,7 +9842,7 @@ static int mdbx_page_merge(MDBX_cursor *csrc, MDBX_cursor *cdst) {
MDBX_page *const psrc = csrc->mc_pg[csrc->mc_top];
MDBX_page *const pdst = cdst->mc_pg[cdst->mc_top];
- mdbx_debug("merging page %" PRIaPGNO " into %" PRIaPGNO "", psrc->mp_pgno,
+ mdbx_debug("merging page %" PRIaPGNO " into %" PRIaPGNO, psrc->mp_pgno,
pdst->mp_pgno);
mdbx_cassert(csrc, PAGETYPE(psrc) == PAGETYPE(pdst));
@@ -10542,7 +10570,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,
if ((rc = mdbx_page_new(mc, mp->mp_flags, 1, &rp)))
return rc;
rp->mp_leaf2_ksize = mp->mp_leaf2_ksize;
- mdbx_debug("new right sibling: page %" PRIaPGNO "", rp->mp_pgno);
+ mdbx_debug("new right sibling: page %" PRIaPGNO, rp->mp_pgno);
/* Usually when splitting the root page, the cursor
* height is 1. But when called from mdbx_update_key,
@@ -10560,7 +10588,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,
mc->mc_pg[0] = pp;
mc->mc_ki[0] = 0;
mc->mc_db->md_root = pp->mp_pgno;
- mdbx_debug("root split! new root = %" PRIaPGNO "", pp->mp_pgno);
+ mdbx_debug("root split! new root = %" PRIaPGNO, pp->mp_pgno);
foliage = mc->mc_db->md_depth++;
/* Add left (implicit) pointer. */
@@ -10578,7 +10606,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,
ptop = 0;
} else {
ptop = mc->mc_top - 1;
- mdbx_debug("parent branch page is %" PRIaPGNO "", mc->mc_pg[ptop]->mp_pgno);
+ mdbx_debug("parent branch page is %" PRIaPGNO, mc->mc_pg[ptop]->mp_pgno);
}
mdbx_cursor_copy(mc, &mn);
@@ -10797,16 +10825,17 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,
mc->mc_ki[mc->mc_top] = 0;
switch (PAGETYPE(rp)) {
case P_BRANCH: {
- mdbx_cassert(mc, nflags == 0);
+ mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0);
+ mdbx_cassert(mc, newpgno != 0 || newpgno != P_INVALID);
rc = mdbx_node_add_branch(mc, 0, newkey, newpgno);
} break;
case P_LEAF: {
- mdbx_cassert(mc, newpgno == 0);
+ mdbx_cassert(mc, newpgno == 0 || newpgno == P_INVALID);
rc = mdbx_node_add_leaf(mc, 0, newkey, newdata, nflags);
} break;
case P_LEAF | P_LEAF2: {
- mdbx_cassert(mc, nflags == 0);
- mdbx_cassert(mc, newpgno == 0);
+ mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0);
+ mdbx_cassert(mc, newpgno == 0 || newpgno == P_INVALID);
rc = mdbx_node_add_leaf2(mc, 0, newkey);
} break;
default:
@@ -10860,7 +10889,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,
rc = mdbx_node_add_leaf(mc, n, &rkey, rdata, flags);
} break;
/* case P_LEAF | P_LEAF2: {
- mdbx_cassert(mc, 0 == (uint16_t)flags);
+ mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0);
mdbx_cassert(mc, gno == 0);
rc = mdbx_node_add_leaf2(mc, n, &rkey);
} break; */
@@ -12348,7 +12377,7 @@ int __cold mdbx_reader_check0(MDBX_env *env, int rdt_locked, int *dead) {
/* clean it */
for (unsigned j = i; j < snap_nreaders; j++) {
if (lck->mti_readers[j].mr_pid == pid) {
- mdbx_debug("clear stale reader pid %" PRIuPTR " txn %" PRIaTXN "",
+ mdbx_debug("clear stale reader pid %" PRIuPTR " txn %" PRIaTXN,
(size_t)pid, lck->mti_readers[j].mr_txnid);
lck->mti_readers[j].mr_pid = 0;
lck->mti_readers_refresh_flag = true;
diff --git a/libs/libmdbx/src/test/log.cc b/libs/libmdbx/src/test/log.cc
index 7bc3ecf613..0e325e3add 100644
--- a/libs/libmdbx/src/test/log.cc
+++ b/libs/libmdbx/src/test/log.cc
@@ -57,7 +57,7 @@ static void mdbx_logger(int type, const char *function, int line,
if (logging::output(
level,
strncmp(function, "mdbx_", 5) == 0 ? "%s: " : "mdbx: %s: ", function))
- logging::feed(msg, args);
+ logging::feed_ap(msg, args);
if (type & MDBX_DBG_ASSERT)
abort();
}
@@ -193,7 +193,7 @@ bool output(const logging::loglevel priority, const char *format, va_list ap) {
return true;
}
-bool feed(const char *format, va_list ap) {
+bool feed_ap(const char *format, va_list ap) {
if (!last)
return false;
@@ -212,7 +212,7 @@ bool feed(const char *format, ...) {
va_list ap;
va_start(ap, format);
- feed(format, ap);
+ feed_ap(format, ap);
va_end(ap);
return true;
}
diff --git a/libs/libmdbx/src/test/log.h b/libs/libmdbx/src/test/log.h
index 7350f1b9b1..ecdd91bf88 100644
--- a/libs/libmdbx/src/test/log.h
+++ b/libs/libmdbx/src/test/log.h
@@ -42,7 +42,7 @@ void setlevel(loglevel level);
bool output(const loglevel priority, const char *format, va_list ap);
bool __printf_args(2, 3)
output(const loglevel priority, const char *format, ...);
-bool feed(const char *format, va_list ap);
+bool feed_ap(const char *format, va_list ap);
bool __printf_args(1, 2) feed(const char *format, ...);
class local_suffix {
diff --git a/libs/libmdbx/src/test/osal-windows.cc b/libs/libmdbx/src/test/osal-windows.cc
index b8cdb53513..81f1da7f86 100644
--- a/libs/libmdbx/src/test/osal-windows.cc
+++ b/libs/libmdbx/src/test/osal-windows.cc
@@ -268,9 +268,12 @@ int osal_actor_start(const actor_config &config, mdbx_pid_t &pid) {
&exename_size))
failure_perror("QueryFullProcessImageName()", GetLastError());
- std::string cmdline = "test_mdbx.child ";
+ std::string cmdline = "$ ";
ArgvQuote(cmdline, thunk_param(config));
+ if (cmdline.size() >= 32767)
+ return ERROR_BAD_LENGTH;
+
PROCESS_INFORMATION ProcessInformation;
if (!CreateProcessA(exename, const_cast<char *>(cmdline.c_str()),
NULL, // Retuned process handle is not inheritable.
diff --git a/libs/libmdbx/src/test/test.vcxproj b/libs/libmdbx/src/test/test.vcxproj
index 3ee13cf8cf..a8c21d38c5 100644
--- a/libs/libmdbx/src/test/test.vcxproj
+++ b/libs/libmdbx/src/test/test.vcxproj
@@ -78,21 +78,25 @@
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+ <TargetName>mdbx_test</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+ <TargetName>mdbx_test</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+ <TargetName>mdbx_test</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+ <TargetName>mdbx_test</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>