Commit 3821c947 authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

[t:5015], fix bug

git-svn-id: file:///svn/toku/tokudb@44223 c7de825b-a66e-492c-adef-691d508d4ae1
parent 116ddb32
......@@ -207,6 +207,7 @@ if(BUILD_TESTING)
test_4015.c
test_4368.c
test_4657.c
test_5015.c
test_abort1.c
test_abort4.c
test_abort5.c
......
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: expandtab:ts=8:sw=4:softtabstop=4:
#ident "Copyright (c) 2007 Tokutek Inc. All rights reserved."
#include "test.h"
#include <stdlib.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <db.h>
#include <errno.h>
// ENVDIR is defined in the Makefile
int
test_main(int argc, char *const argv[]) {
parse_args(argc, argv);
DB_TXN * const null_txn = 0;
const char * const fname = "test.already.exists.ft_handle";
int r;
r = system("rm -rf " ENVDIR);
CKERR(r);
r=toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); assert(r==0);
DB_ENV *env;
r = db_env_create(&env, 0); assert(r == 0);
r = env->open(env, ENVDIR, DB_CREATE | DB_PRIVATE | DB_INIT_MPOOL | DB_INIT_TXN | DB_INIT_LOCK | DB_INIT_LOG, 0); assert(r == 0);
DB *db;
r = db_create(&db, env, 0);
CKERR(r);
db->set_errfile(db,0); // Turn off those annoying errors
r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666);
CKERR(r);
DB_TXN* parent_txn = NULL;
DB_TXN* child_txn = NULL;
r = env->txn_begin(env, 0, &parent_txn, 0);
CKERR(r);
r = env->txn_begin(env, parent_txn, &child_txn, 0);
CKERR(r);
DBT key,val;
r = db->put(db, child_txn, dbt_init(&key, "a", 2), dbt_init(&val, "a", 2), 0);
CKERR(r);
u_int8_t gid[DB_GID_SIZE];
memset(gid, 0, DB_GID_SIZE);
gid[0]='a';
r = child_txn->prepare(child_txn, gid);
CKERR(r);
r = env->txn_checkpoint(env, 0, 0, 0);
CKERR(r);
r = child_txn->commit(child_txn, 0);
CKERR(r);
r = parent_txn->commit(parent_txn, 0);
CKERR(r);
r = db->close(db, 0); CKERR(r);
r = env->close(env, 0); CKERR(r);
return 0;
}
......@@ -203,8 +203,17 @@ toku_txn_abort_only(DB_TXN * txn,
// released here before the fsync.
static int
toku_txn_xa_prepare (DB_TXN *txn, TOKU_XA_XID *xid) {
if (!txn) return EINVAL;
if (txn->parent) return 0; // make this a NO-OP, MySQL calls this
int r = 0;
if (!txn) {
toku_multi_operation_client_unlock();
r = EINVAL;
goto exit;
}
if (txn->parent) {
toku_multi_operation_client_unlock();
r = 0; // make this a NO-OP, MySQL calls this
goto exit;
}
HANDLE_PANICKED_ENV(txn->mgrp);
//Recursively commit any children.
if (db_txn_struct_i(txn)->child) {
......@@ -218,7 +227,7 @@ toku_txn_xa_prepare (DB_TXN *txn, TOKU_XA_XID *xid) {
}
assert(!db_txn_struct_i(txn)->child);
TOKUTXN ttxn = db_txn_struct_i(txn)->tokutxn;
int r = toku_txn_prepare_txn(ttxn, xid);
r = toku_txn_prepare_txn(ttxn, xid);
TOKULOGGER logger = txn->mgrp->i->logger;
LSN do_fsync_lsn;
bool do_fsync;
......@@ -226,6 +235,7 @@ toku_txn_xa_prepare (DB_TXN *txn, TOKU_XA_XID *xid) {
// release the multi operation lock before fsyncing the log
toku_multi_operation_client_unlock();
toku_txn_maybe_fsync_log(logger, do_fsync_lsn, do_fsync);
exit:
return r;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment