List:Internals« Previous MessageNext Message »
From:jonas Date:August 24 2005 6:50am
Subject:bk commit into 5.1 tree (jonas:1.1965)
View as plain text  
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)jonas24 Aug