Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1965 05/08/24 08:49:53 jonas@eel.(none) +13 -0
ndb diskdata
various bugfixes
storage/ndb/src/kernel/blocks/tsman.cpp
1.40 05/08/24 08:49:49 jonas@eel.(none) +6 -13
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/restore.cpp
1.21 05/08/24 08:49:49 jonas@eel.(none) +1 -1
Have 4Mb restore buffer
storage/ndb/src/kernel/blocks/print_file.cpp
1.11 05/08/24 08:49:49 jonas@eel.(none) +1 -1
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/pgman.hpp
1.27 05/08/24 08:49:49 jonas@eel.(none) +9 -0
Add hashtable for pages
storage/ndb/src/kernel/blocks/pgman.cpp
1.30 05/08/24 08:49:49 jonas@eel.(none) +66 -32
Add hash for pages
Update dirty flag when executing certain types of callbacks
storage/ndb/src/kernel/blocks/lgman.cpp
1.50 05/08/24 08:49:49 jonas@eel.(none) +4 -4
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/diskpage.hpp
1.24 05/08/24 08:49:49 jonas@eel.(none) +5 -5
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/diskpage.cpp
1.5 05/08/24 08:49:49 jonas@eel.(none) +1 -1
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/dbtup/tuppage.hpp
1.15 05/08/24 08:49:49 jonas@eel.(none) +3 -3
rename PAGE_SIZE to NDB_PAGE_SIZE to avoid #define clashes
storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp
1.55 05/08/24 08:49:49 jonas@eel.(none) +10 -10
Changes
storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
1.76 05/08/24 08:49:49 jonas@eel.(none) +12 -3
Save uncommitted used space on PageRequests
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
1.93 05/08/24 08:49:48 jonas@eel.(none) +8 -1
Fix abort of page waiting for disk
BitKeeper/etc/config
1.16 05/08/24 08:49:48 jonas@eel.(none) +1 -0
checkout
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: jonas
# Host: eel.(none)
# Root: /home/jonas/src/mysql-5.1-ndb-dd
--- 1.15/BitKeeper/etc/config 2005-08-09 09:49:29 +02:00
+++ 1.16/BitKeeper/etc/config 2005-08-24 08:49:48 +02:00
@@ -71,6 +71,7 @@
[arjen:]checkout:get
[kostja:]checkout:get
[nick:]checkout:get
+[jonas:]checkout:get
checkout:edit
eoln:unix
--- 1.14/storage/ndb/src/kernel/blocks/dbtup/tuppage.hpp 2005-08-05 01:22:06 +02:00
+++ 1.15/storage/ndb/src/kernel/blocks/dbtup/tuppage.hpp 2005-08-24 08:49:49 +02:00
@@ -51,7 +51,7 @@
Uint32 m_extent_info_ptr;
Uint32 unused_ph[9];
- STATIC_CONST( DATA_WORDS = File_formats::PAGE_SIZE_WORDS - 32 );
+ STATIC_CONST( DATA_WORDS = File_formats::NDB_PAGE_SIZE_WORDS - 32 );
Uint32 m_data[DATA_WORDS];
};
@@ -81,7 +81,7 @@
Uint32 m_extent_info_ptr;
Uint32 unused_ph[9];
- STATIC_CONST( DATA_WORDS = File_formats::PAGE_SIZE_WORDS - 32 );
+ STATIC_CONST( DATA_WORDS = File_formats::NDB_PAGE_SIZE_WORDS - 32 );
Uint32 m_data[DATA_WORDS];
@@ -125,7 +125,7 @@
Uint32 insert_pos;
Uint32 unused_ph[7];
- STATIC_CONST( DATA_WORDS = File_formats::PAGE_SIZE_WORDS - 32 );
+ STATIC_CONST( DATA_WORDS = File_formats::NDB_PAGE_SIZE_WORDS - 32 );
STATIC_CONST( CHAIN = 0x8000 );
Uint32 m_data[DATA_WORDS];
--- 1.4/storage/ndb/src/kernel/blocks/diskpage.cpp 2005-07-22 08:57:46 +02:00
+++ 1.5/storage/ndb/src/kernel/blocks/diskpage.cpp 2005-08-24 08:49:49 +02:00
@@ -13,7 +13,7 @@
{
memcpy(m_magic, "NDBDISK", 8);
m_byte_order = 0x12345678;
- m_page_size = File_formats::PAGE_SIZE;
+ m_page_size = File_formats::NDB_PAGE_SIZE;
m_ndb_version = version;
m_node_id = node_id;
m_file_type = ft;
--- 1.23/storage/ndb/src/kernel/blocks/diskpage.hpp 2005-08-05 01:22:06 +02:00
+++ 1.24/storage/ndb/src/kernel/blocks/diskpage.hpp 2005-08-24 08:49:49 +02:00
@@ -21,8 +21,8 @@
struct File_formats
{
- STATIC_CONST( PAGE_SIZE = 32768 );
- STATIC_CONST( PAGE_SIZE_WORDS = PAGE_SIZE >> 2);
+ STATIC_CONST( NDB_PAGE_SIZE = 32768 );
+ STATIC_CONST( NDB_PAGE_SIZE_WORDS = NDB_PAGE_SIZE >> 2);
enum File_type
{
@@ -59,7 +59,7 @@
int validate(File_type ft, Uint32 node_id, Uint32 version, Uint32 now);
};
- STATIC_CONST( PAGE_HEADER_WORDS = sizeof(Page_header) >> 2);
+ STATIC_CONST( NDB_PAGE_HEADER_WORDS = sizeof(Page_header) >> 2);
struct Datafile
{
@@ -106,7 +106,7 @@
Extent_header* get_header(Uint32 extent_no, Uint32 extent_size);
};
- STATIC_CONST( EXTENT_PAGE_WORDS = PAGE_SIZE_WORDS - PAGE_HEADER_WORDS );
+ STATIC_CONST( EXTENT_PAGE_WORDS = NDB_PAGE_SIZE_WORDS - NDB_PAGE_HEADER_WORDS );
struct Data_page
{
@@ -165,7 +165,7 @@
Uint32 m_type_length; // 16 bit type, 16 bit length
};
};
- STATIC_CONST( UNDO_PAGE_WORDS = PAGE_SIZE_WORDS - PAGE_HEADER_WORDS - 1);
+ STATIC_CONST( UNDO_PAGE_WORDS = NDB_PAGE_SIZE_WORDS - NDB_PAGE_HEADER_WORDS - 1);
};
--- 1.49/storage/ndb/src/kernel/blocks/lgman.cpp 2005-08-08 01:23:31 +02:00
+++ 1.50/storage/ndb/src/kernel/blocks/lgman.cpp 2005-08-24 08:49:49 +02:00
@@ -382,8 +382,8 @@
}
req->fileFlags |= FsOpenReq::OM_SYNC;
- req->page_size = File_formats::PAGE_SIZE;
- Uint64 size = (Uint64)ptr.p->m_file_size * (Uint64)File_formats::PAGE_SIZE;
+ req->page_size = File_formats::NDB_PAGE_SIZE;
+ Uint64 size = (Uint64)ptr.p->m_file_size * (Uint64)File_formats::NDB_PAGE_SIZE;
req->file_size_hi = size >> 32;
req->file_size_lo = size & 0xFFFFFFFF;
@@ -588,8 +588,8 @@
/**
* TODO use buddy allocator
*/
- Uint32 pages= (((bytes + 3) >> 2) + File_formats::PAGE_SIZE_WORDS - 1)
- / File_formats::PAGE_SIZE_WORDS;
+ Uint32 pages= (((bytes + 3) >> 2) + File_formats::NDB_PAGE_SIZE_WORDS - 1)
+ / File_formats::NDB_PAGE_SIZE_WORDS;
Uint32 requested= pages;
{
Page_map map(m_data_buffer_pool, ptr.p->m_buffer_pages);
--- 1.29/storage/ndb/src/kernel/blocks/pgman.cpp 2005-08-08 01:23:31 +02:00
+++ 1.30/storage/ndb/src/kernel/blocks/pgman.cpp 2005-08-24 08:49:49 +02:00
@@ -27,9 +27,17 @@
#include <DebuggerNames.hpp>
#endif
+/**
+ * Requests that make page dirty
+ */
+#define DIRTY_FLAGS (Page_request::COMMIT_REQ | \
+ Page_request::DIRTY_REQ | \
+ Page_request::ALLOC_REQ)
+
Pgman::Pgman(const Configuration & conf) :
SimulatedBlock(PGMAN, conf),
m_file_map(m_data_buffer_pool)
+ ,m_page_entry_hash(m_page_entry_pool)
#ifdef VM_TRACE
,debugOut(* new NullOutputStream())
#endif
@@ -52,7 +60,7 @@
m_page_entry_pool.setSize(2000);
m_page_request_pool.setSize(10000);
m_data_buffer_pool.setSize(1);
-
+ m_page_entry_hash.setSize(512);
init_page_lists();
m_lcp_on = false;
@@ -563,6 +571,8 @@
Page_list& pl_main = m_page_list[0];
page_list_insert(pl_main, ptr);
+ m_page_entry_hash.add(ptr);
+
#ifdef VM_TRACE
debugOut << "PGMAN: seize_page_entry" << endl;
debugOut << "PGMAN: " << ptr << endl;
@@ -576,13 +586,11 @@
bool
Pgman::find_page_entry(Ptr<Page_entry>& ptr, Uint32 file_no, Uint32 page_no)
{
- Page_entry key(ZNIL, 0);
+ Page_entry key;
key.m_file_no = file_no;
key.m_page_no = page_no;
-
- Pgman::Page_list& pl_main = m_page_list[0];
- bool found = page_list_find(pl_main, ptr, key);
- return found;
+
+ return m_page_entry_hash.find(ptr, key);
}
bool
@@ -623,6 +631,7 @@
set_page_state(ptr, 0);
Page_list& pl_main = m_page_list[0];
page_list_remove(pl_main, ptr);
+ m_page_entry_hash.remove(ptr);
m_page_entry_pool.release(ptr);
}
@@ -895,8 +904,8 @@
SimulatedBlock* b;
Callback callback;
- Uint16 state = ptr.p->m_state;
- if(! (state & Page_entry::PAGEOUT) && !ptr.p->m_requests.isEmpty())
+ Uint16 state = 0;
+ if(! (ptr.p->m_state & Page_entry::PAGEOUT) && !ptr.p->m_requests.isEmpty())
{
{
/**
@@ -916,15 +925,24 @@
callback = req_ptr.p->m_callback;
l.release(req_ptr);
+
+ if (req_ptr.p->m_flags & DIRTY_FLAGS)
+ {
+ state |= Page_entry::DIRTY;
+ }
}
+ ndbassert(ptr.p->m_state & Page_entry::BOUND);
+ ndbassert(ptr.p->m_state & Page_entry::MAPPED);
b->execute(signal, callback, ptr.p->m_real_page_i);
+ ptr.p->m_state &= ~Page_entry::NO_HOOK;
if (ptr.p->m_requests.isEmpty())
{
- set_page_state(ptr, ptr.p->m_state & ~ Page_entry::READREQ);
+ set_page_state(ptr, (ptr.p->m_state & ~Page_entry::READREQ) | state);
}
else
{
+ set_page_state(ptr, ptr.p->m_state | state);
signal->theData[0] = PgmanContinueB::PROCESS_REQ_DONE;
signal->theData[1] = ptr.i;
sendSignal(PGMAN_REF, GSN_CONTINUEB, signal, 2, JBB);
@@ -945,8 +963,9 @@
m_page_entry_pool.getPtr(ptr, pl_req_done.m_head_entry_i);
#ifdef VM_TRACE
- debugOut << "PGMAN: " << ptr << " : process_req_done" << endl;
+ debugOut << "PGMAN: " << ptr << " : process_req_done" << endl;
#endif
+ Uint16 state = 0;
while (! ptr.p->m_requests.isEmpty() && --max_count >= 0)
{
@@ -971,14 +990,22 @@
callback = req_ptr.p->m_callback;
list.release(req_ptr);
+
+ if (req_ptr.p->m_flags & DIRTY_FLAGS)
+ {
+ state |= Page_entry::DIRTY;
+ }
}
+ ndbassert(ptr.p->m_state & Page_entry::BOUND);
+ ndbassert(ptr.p->m_state & Page_entry::MAPPED);
b->execute(signal, callback, ptr.p->m_real_page_i);
+ ptr.p->m_state &= ~Page_entry::NO_HOOK;
}
if (ptr.p->m_requests.isEmpty())
- {
- set_page_state(ptr, ptr.p->m_state & ~ Page_entry::READREQ);
- }
+ set_page_state(ptr, (ptr.p->m_state & ~ Page_entry::READREQ) | state);
+ else if(state)
+ set_page_state(ptr, ptr.p->m_state | state);
}
}
@@ -1007,7 +1034,7 @@
debugOut << "PGMAN: fsreadconf" << endl;
debugOut << "PGMAN: " << ptr << endl;
#endif
-
+ ndbout << "PGMAN: fsreadconf" << ptr << endl;
ndbrequire(ptr.p->m_state & Page_entry::PAGEIN);
Uint16 new_state = ptr.p->m_state;
@@ -1036,11 +1063,17 @@
debugOut << "PGMAN: pageout" << endl;
debugOut << "PGMAN: " << ptr << endl;
#endif
-
- ndbrequire(! (ptr.p->m_state & Page_entry::BUSY));
- ndbrequire(! (ptr.p->m_state & Page_entry::PAGEOUT));
- set_page_state(ptr, ptr.p->m_state | Page_entry::PAGEOUT);
-
+
+ Uint16 state = ptr.p->m_state;
+ ndbassert(state & Page_entry::BOUND);
+ ndbassert(state & Page_entry::MAPPED);
+ ndbrequire(! (state & Page_entry::BUSY));
+ ndbrequire(! (state & Page_entry::PAGEOUT));
+
+ state &= ~Page_entry::NO_HOOK;
+ state |= Page_entry::PAGEOUT;
+ c_tup->disk_page_unmap_callback(ptr.p->m_real_page_i);
+
// update lsn on page prior to write
Ptr<GlobalPage> pagePtr;
m_global_page_pool.getPtr(pagePtr, ptr.p->m_real_page_i);
@@ -1058,11 +1091,12 @@
{
fswritereq(signal, ptr);
m_stats.m_current_io_waits++;
+ set_page_state(ptr, state);
}
else
{
ndbrequire(ret == 0);
- set_page_state(ptr, ptr.p->m_state | Page_entry::LOGSYNC);
+ set_page_state(ptr, state | Page_entry::LOGSYNC);
}
}
@@ -1168,6 +1202,8 @@
void
Pgman::fswritereq(Signal* signal, Ptr<Page_entry> ptr)
{
+ ndbout << "PGMAN: writereq" << ptr << endl;
+
File_map::ConstDataBufferIterator it;
m_file_map.first(it);
m_file_map.next(it, ptr.p->m_file_no);
@@ -1197,6 +1233,7 @@
Ptr<Page_entry> ptr;
m_page_entry_pool.getPtr(ptr, conf->userPointer);
+ ndbout << "PGMAN: writeconf" << ptr << endl;
fswriteconf(signal, ptr);
}
@@ -1222,7 +1259,7 @@
if (page_req.m_flags & Page_request::EMPTY_PAGE)
{
// Only one can "init" a page at a time
- ndbrequire(ptr.p->m_requests.isEmpty());
+ //ndbrequire(ptr.p->m_requests.isEmpty());
}
Uint16 old_state = ptr.p->m_state;
@@ -1248,18 +1285,17 @@
{
//
}
- else if (page_req.m_flags & Page_request::DIRTY_REQ)
- {
- new_state |= Page_entry::DIRTY;
- }
- if (! (page_req.m_flags & Page_request::STRICT_ORDER) ||
- ptr.p->m_requests.isEmpty())
+ bool empty = ptr.p->m_requests.isEmpty();
+ if (! (page_req.m_flags & Page_request::STRICT_ORDER) || empty)
{
if ((old_state & Page_entry::MAPPED) &&
(old_state & Page_entry::BOUND) &&
! (old_state & Page_entry::PAGEOUT))
{
+ if (page_req.m_flags & DIRTY_FLAGS)
+ new_state |= Page_entry::DIRTY;
+
ptr.p->m_busy_count += busy_count;
set_page_state(ptr, new_state);
@@ -1302,9 +1338,9 @@
page_req_ptr.p->m_callback = page_req.m_callback;
new_state |= Page_entry::READREQ;
- if (page_req.m_flags & Page_request::EMPTY_PAGE)
+ if (empty && page_req.m_flags & Page_request::EMPTY_PAGE)
{
- new_state |= Page_entry::NEW | Page_entry::MAPPED | Page_entry::NO_HOOK;
+ new_state |= Page_entry::NEW | Page_entry::MAPPED;
}
if (page_req.m_flags & Page_request::NO_HOOK)
@@ -1334,8 +1370,6 @@
Uint16 new_state = ptr.p->m_state;
ptr.p->m_lsn = lsn;
- new_state |= Page_entry::DIRTY;
-
if (new_state & Page_entry::BUSY)
{
ndbrequire(ptr.p->m_busy_count != 0);
@@ -1346,7 +1380,7 @@
}
}
- set_page_state(ptr, new_state);
+ set_page_state(ptr, new_state | Page_entry::DIRTY);
#ifdef VM_TRACE
debugOut << "PGMAN: " << ptr << endl;
--- 1.26/storage/ndb/src/kernel/blocks/pgman.hpp 2005-08-08 01:23:31 +02:00
+++ 1.27/storage/ndb/src/kernel/blocks/pgman.hpp 2005-08-24 08:49:49 +02:00
@@ -123,6 +123,7 @@
};
struct Page_entry {
+ Page_entry() {}
Page_entry(Uint32 file_no, Uint32 page_no);
enum State {
@@ -175,6 +176,7 @@
Uint32 m_next_entry_i[2]; // 0-main list 1-sublists
Uint32 m_prev_entry_i[2];
+ Uint32 nextHash, prevHash;
// comparisons - not implemented if LILO (simple queue)
static int m_cmp_main(const Page_entry&, const Page_entry&);
@@ -194,6 +196,12 @@
// compute sublist from state
static Uint32 get_sublist_no(Uint16 state);
+
+ Uint32 hashValue() const { return m_file_no << 16 | m_page_no; }
+ bool equal(const Page_entry& obj) const {
+ return
+ m_file_no == obj.m_file_no && m_page_no == obj.m_page_no;
+ }
};
// TODO use a real ordered list when available
@@ -229,6 +237,7 @@
File_map::DataBufferPool m_data_buffer_pool;
// 0-main list
+ DLHashTable<Page_entry> m_page_entry_hash;
Page_list m_page_list[Page_entry::LIST_COUNT];
struct Stats {
--- 1.10/storage/ndb/src/kernel/blocks/print_file.cpp 2005-08-05 01:22:06 +02:00
+++ 1.11/storage/ndb/src/kernel/blocks/print_file.cpp 2005-08-24 08:49:49 +02:00
@@ -33,7 +33,7 @@
}
int g_verbosity = 1;
-int g_page_size = File_formats::PAGE_SIZE;
+int g_page_size = File_formats::NDB_PAGE_SIZE;
int (* g_print_page)(int count, void*, Uint32 sz) = print_zero_page;
File_formats::Undofile::Zero_page g_uf_zero;
--- 1.20/storage/ndb/src/kernel/blocks/restore.cpp 2005-07-06 14:58:28 +02:00
+++ 1.21/storage/ndb/src/kernel/blocks/restore.cpp 2005-08-24 08:49:49 +02:00
@@ -30,7 +30,7 @@
#include <Dblqh.hpp>
#include <dbtup/Dbtup.hpp>
-#define PAGES 10
+#define PAGES (4*32)
Restore::Restore(const Configuration & conf) :
SimulatedBlock(RESTORE, conf),
--- 1.39/storage/ndb/src/kernel/blocks/tsman.cpp 2005-08-08 01:23:31 +02:00
+++ 1.40/storage/ndb/src/kernel/blocks/tsman.cpp 2005-08-24 08:49:49 +02:00
@@ -400,11 +400,11 @@
ndbrequire(false);
}
- req->page_size = File_formats::PAGE_SIZE;
+ req->page_size = File_formats::NDB_PAGE_SIZE;
req->file_size_hi = hi;
req->file_size_lo = lo;
- Uint64 pages = (Uint64(hi) << 32 | lo) / File_formats::PAGE_SIZE;
+ Uint64 pages = (Uint64(hi) << 32 | lo) / File_formats::NDB_PAGE_SIZE;
// Extent size in #pages
Uint32 extent_size = ts_ptr.p->m_extent_size;
@@ -428,8 +428,8 @@
* Update file size
*/
pages = 1 + extent_pages + data_pages;
- hi = (pages * File_formats::PAGE_SIZE) >> 32;
- lo = (pages * File_formats::PAGE_SIZE) & 0xFFFFFFFF;
+ hi = (pages * File_formats::NDB_PAGE_SIZE) >> 32;
+ lo = (pages * File_formats::NDB_PAGE_SIZE) & 0xFFFFFFFF;
req->file_size_hi = hi;
req->file_size_lo = lo;
@@ -451,7 +451,7 @@
m_file_pool.getPtr(ptr, req->userPointer);
m_global_page_pool.getPtr(page_ptr, req->data.pageData[0]);
- memset(page_ptr.p, 0, File_formats::PAGE_SIZE);
+ memset(page_ptr.p, 0, File_formats::NDB_PAGE_SIZE);
Uint32 page_no = req->varIndex;
Uint32 size = ptr.p->m_extent_size;
@@ -976,7 +976,7 @@
m_tablespace_id = req->filegroup_id;
m_version = req->filegroup_version;
- m_extent_size = DIV(req->tablespace.extent_size, File_formats::PAGE_SIZE);
+ m_extent_size = DIV(req->tablespace.extent_size, File_formats::NDB_PAGE_SIZE);
m_free_extent_count = 0;
}
@@ -1358,9 +1358,6 @@
* 3 = 11 - full - less than pct_free% free, pct_free=10%
*/
- ndbout_c("alloc_page_req");
- ndbout_c("page_no_in_extent: %d size: %d", page_no_in_extent, size);
-
/**
* Search
*/
@@ -1370,7 +1367,6 @@
src_bits= (* src >> shift) & ((1 << SZ) - 1);
if(src_bits <= req.bits)
{
- ndbout_c("found page no: %d (%d %d)", page_no, src_bits, req.bits);
goto found;
}
shift += SZ;
@@ -1378,8 +1374,6 @@
shift &= 31;
}
- ndbout_c("starting from beginning");
-
shift= 0;
src= header->m_page_bitmask;
for(page_no= 0; page_no<page_no_in_extent; page_no++)
@@ -1387,7 +1381,6 @@
src_bits= (* src >> shift) & ((1 << SZ) - 1);
if(src_bits <= req.bits)
{
- ndbout_c("found page no: %d (%d %d)", page_no, src_bits, req.bits);
goto found;
}
shift += SZ;
--- 1.92/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2005-08-05 01:22:06 +02:00
+++ 1.93/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2005-08-24 08:49:48 +02:00
@@ -3935,7 +3935,8 @@
ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
TcConnectionrec * const regTcPtr = tcConnectptr.p;
- if(disk_page > 0)
+ TcConnectionrec::TransactionState state = regTcPtr->transactionState;
+ if (likely(disk_page > 0 && state == TcConnectionrec::WAIT_TUP))
{
FragrecordPtr fragPtr;
c_fragment_pool.getPtr(fragPtr, regTcPtr->fragmentptr);
@@ -3943,6 +3944,12 @@
acckeyconf_tupkeyreq(signal, regTcPtr, fragPtr.p,
regTcPtr->m_local_key,
disk_page);
+ }
+ else if (state != TcConnectionrec::WAIT_TUP)
+ {
+ ndbrequire(state == TcConnectionrec::WAIT_TUP_TO_ABORT);
+ abortCommonLab(signal);
+ return;
}
else
{
--- 1.75/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-08-08 01:23:31 +02:00
+++ 1.76/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-08-24 08:49:49 +02:00
@@ -392,7 +392,8 @@
Uint16 m_list_index; // in Disk_alloc_info.m_page_requests
Uint32 m_frag_ptr_i;
Uint32 m_extent_info_ptr;
- Uint32 m_ref_count; // Waiters for page
+ Uint16 m_ref_count; // Waiters for page
+ Uint16 m_uncommitted_used_space;
union {
Uint32 nextList;
Uint32 nextPool;
@@ -2475,14 +2476,16 @@
Ptr<GlobalPage>);
void disk_page_alloc(Signal*,
- Tablerec*, Fragrecord*, Local_key*, Page*, Uint32);
+ Tablerec*, Fragrecord*, Local_key*, PagePtr, Uint32);
void disk_page_free(Signal*,
Tablerec*, Fragrecord*, Local_key*, PagePtr, Uint32);
void disk_page_update_free_space(Fragrecord*, Ptr<Page_request>,
DLList<Page_request>::Head list[],
Uint32 i, Uint32 sz);
- void disk_page_update_free_space(Fragrecord*, PagePtr, Uint32 i);
+ void disk_page_update_free_space(Fragrecord*, PagePtr, Uint32 i,
+ Int32 uncommitted_delta,
+ Int32 extent_delta);
void disk_page_commit_callback(Signal*, Uint32 opPtrI, Uint32 page_id);
@@ -2535,6 +2538,12 @@
void disk_restart_undo_update(Apply_undo*);
void disk_restart_undo_free(Apply_undo*);
void disk_restart_undo_page_bits(Apply_undo*);
+
+#ifdef VM_TRACE
+ void verify_page_lists(Disk_alloc_info&);
+#else
+ void verify_page_lists(Disk_alloc_info&) {}
+#endif
void fix_commit_order(OperationrecPtr);
void commit_operation(Signal*, Uint32, Tuple_header*, Page*,
--- 1.54/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2005-08-05 01:22:06 +02:00
+++ 1.55/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2005-08-24 08:49:49 +02:00
@@ -269,13 +269,13 @@
Uint32 logfile_group_id= regFragPtr->m_logfile_group_id;
Uint32 lcpScan_ptr_i= regFragPtr->m_lcp_scan_op;
- Page* page= (Page*)m_pgman.m_ptr.p;
- ndbassert(page->m_page_no == key.m_page_no);
- ndbassert(page->m_file_no == key.m_file_no);
+ PagePtr pagePtr = *(PagePtr*)&m_pgman.m_ptr;
+ ndbassert(pagePtr.p->m_page_no == key.m_page_no);
+ ndbassert(pagePtr.p->m_file_no == key.m_file_no);
Uint32 sz, *dst;
if(copy_bits & Tuple_header::DISK_ALLOC)
{
- disk_page_alloc(signal, regTabPtr, regFragPtr, &key, page, gci);
+ disk_page_alloc(signal, regTabPtr, regFragPtr, &key, pagePtr, gci);
if(lcpScan_ptr_i != RNIL)
{
@@ -283,7 +283,7 @@
c_scanOpPool.getPtr(scanOp, lcpScan_ptr_i);
Local_key rowid = regOperPtr->m_tuple_location;
Local_key scanpos = scanOp.p->m_scanPos.m_key;
- rowid.m_page_no = page->frag_page_id;
+ rowid.m_page_no = pagePtr.p->frag_page_id;
if(rowid >= scanpos)
{
copy_bits |= Tuple_header::LCP_SKIP;
@@ -294,17 +294,17 @@
if(regTabPtr->m_attributes[DD].m_no_of_varsize == 0)
{
sz= regTabPtr->m_offsets[DD].m_fix_header_size;
- dst= ((Fix_page*)page)->get_ptr(key.m_page_idx, sz);
+ dst= ((Fix_page*)pagePtr.p)->get_ptr(key.m_page_idx, sz);
}
else
{
- dst= ((Var_page*)page)->get_ptr(key.m_page_idx);
- sz= ((Var_page*)page)->get_entry_len(key.m_page_idx);
+ dst= ((Var_page*)pagePtr.p)->get_ptr(key.m_page_idx);
+ sz= ((Var_page*)pagePtr.p)->get_entry_len(key.m_page_idx);
}
if(! (copy_bits & Tuple_header::DISK_ALLOC))
{
- disk_page_undo_update(page, &key, dst, sz, gci, logfile_group_id);
+ disk_page_undo_update(pagePtr.p, &key, dst, sz, gci, logfile_group_id);
}
memcpy(dst, disk_ptr, 4*sz);
@@ -497,7 +497,7 @@
req.m_callback.m_callbackFunction =
safe_cast(&Dbtup::disk_page_commit_callback);
- int flags=
+ int flags= regOperPtr.p->op_struct.op_type |
Page_cache_client::COMMIT_REQ | Page_cache_client::STRICT_ORDER;
int res= m_pgman.get_page(signal, req, flags);
switch(res){
| Thread |
|---|
| • bk commit into 5.1 tree (jonas:1.1965) | jonas | 24 Aug |