diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp index 273ccb9e1e6..aa55985c1f2 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp @@ -118,7 +118,8 @@ void Dbtup::execTUP_ABORTREQ(Signal* signal) PagePtr page; Tuple_header *tuple_ptr= (Tuple_header*) get_ptr(&page, ®OperPtr.p->m_tuple_location, regTabPtr.p); - + + Uint32 bits= tuple_ptr->m_header_bits; if(regOperPtr.p->op_struct.op_type != ZDELETE) { Tuple_header *copy= (Tuple_header*) @@ -132,7 +133,7 @@ void Dbtup::execTUP_ABORTREQ(Signal* signal) disk_page_abort_prealloc(signal, regFragPtr.p, &key, key.m_page_idx); } - Uint32 bits= tuple_ptr->m_header_bits; + Uint32 copy_bits= copy->m_header_bits; if(! (bits & Tuple_header::ALLOC)) { @@ -174,6 +175,15 @@ void Dbtup::execTUP_ABORTREQ(Signal* signal) tuple_ptr->m_header_bits |= Tuple_header::FREED; } } + else if (regOperPtr.p->is_first_operation() && + regOperPtr.p->is_last_operation()) + { + if (bits & Tuple_header::ALLOC) + { + tuple_ptr->m_header_bits &= ~(Uint32)Tuple_header::ALLOC; + tuple_ptr->m_header_bits |= Tuple_header::FREED; + } + } if(regOperPtr.p->is_first_operation() && regOperPtr.p->is_last_operation()) { diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp index ec3231f55f5..56f7fb1dd1e 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp @@ -1053,7 +1053,6 @@ Dbtup::disk_page_abort_prealloc_callback(Signal* signal, Ptr fragPtr; getFragmentrec(fragPtr, pagePtr.p->m_fragment_id, tabPtr.p); - disk_page_set_dirty(pagePtr); disk_page_abort_prealloc_callback_1(signal, fragPtr.p, pagePtr, sz); } @@ -1063,6 +1062,9 @@ Dbtup::disk_page_abort_prealloc_callback_1(Signal* signal, PagePtr pagePtr, Uint32 sz) { + jam(); + disk_page_set_dirty(pagePtr); + Disk_alloc_info& alloc= fragPtrP->m_disk_alloc_info; Uint32 page_idx = pagePtr.p->list_index; Uint32 used = pagePtr.p->uncommitted_used_space; @@ -1075,13 +1077,6 @@ Dbtup::disk_page_abort_prealloc_callback_1(Signal* signal, ddassert(alloc.calc_page_free_bits(free - used) == old_idx); Uint32 new_idx = alloc.calc_page_free_bits(free - used + sz); -#ifdef VM_TRACE - Local_key key; - key.m_page_no = pagePtr.p->m_page_no; - key.m_file_no = pagePtr.p->m_file_no; - ndbout << "disk_page_abort_prealloc_callback_1" << key << endl; -#endif - Ptr extentPtr; c_extent_pool.getPtr(extentPtr, ext); if (old_idx != new_idx) diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp index ff917c8482d..0000796d7b2 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp @@ -1408,8 +1408,6 @@ int Dbtup::handleInsertReq(Signal* signal, } req_struct->m_use_rowid = false; base->m_header_bits &= ~(Uint32)Tuple_header::FREE; - base->m_header_bits |= Tuple_header::ALLOC & - (regOperPtr.p->is_first_operation() ? ~0 : 1); } else { @@ -1418,8 +1416,6 @@ int Dbtup::handleInsertReq(Signal* signal, { ndbout_c("no mem insert but rowid (same)"); base->m_header_bits &= ~(Uint32)Tuple_header::FREE; - base->m_header_bits |= Tuple_header::ALLOC & - (regOperPtr.p->is_first_operation() ? ~0 : 1); } else { @@ -1427,6 +1423,9 @@ int Dbtup::handleInsertReq(Signal* signal, ndbrequire(false); } } + + base->m_header_bits |= Tuple_header::ALLOC & + (regOperPtr.p->is_first_operation() ? ~0 : 1); if (disk_insert) { @@ -2888,7 +2887,7 @@ Dbtup::handle_size_change_after_update(KeyReqStruct* req_struct, if(needed <= alloc) { - ndbassert(!regOperPtr->is_first_operation()); + //ndbassert(!regOperPtr->is_first_operation()); ndbout_c(" no grow"); return 0; } diff --git a/storage/ndb/test/ndbapi/testBasic.cpp b/storage/ndb/test/ndbapi/testBasic.cpp index 69f3d8daef6..d45a8ecb7b1 100644 --- a/storage/ndb/test/ndbapi/testBasic.cpp +++ b/storage/ndb/test/ndbapi/testBasic.cpp @@ -1041,6 +1041,38 @@ runMassiveRollback3(NDBT_Context* ctx, NDBT_Step* step){ HugoOperations hugoOps(*ctx->getTab()); Ndb* pNdb = GETNDB(step); + const Uint32 BATCH = 10; + const Uint32 OPS_TOTAL = 50; + const Uint32 LOOPS = 100; + + for(Uint32 loop = 0; loopgetTab()); + Ndb* pNdb = GETNDB(step); + const Uint32 BATCH = 10; const Uint32 OPS_TOTAL = 20; const Uint32 LOOPS = 100; @@ -1052,6 +1084,12 @@ runMassiveRollback3(NDBT_Context* ctx, NDBT_Step* step){ for (Uint32 i = 0; i