List:Commits« Previous MessageNext Message »
From:Pekka Nousiainen Date:November 26 2009 7:23pm
Subject:bzr commit into mysql-5.1-telco-6.2 branch (pekka:3040) Bug#48910
View as plain text  
#At file:///export/space/pekka/ndb/version/my51-bug48910/ based on revid:pekka@stripped

 3040 Pekka Nousiainen	2009-11-26
      bug#48910 03_pgman.diff
      In get_page() move lirs_reference() to the end.
      Avoids calling set_page_state() when the state is not ready.
      Fixes assert "is_locked == ! is_lirs".

    modified:
      storage/ndb/src/kernel/blocks/pgman.cpp
      storage/ndb/src/kernel/blocks/pgman.hpp
=== modified file 'storage/ndb/src/kernel/blocks/pgman.cpp'
--- a/storage/ndb/src/kernel/blocks/pgman.cpp	2009-11-26 19:22:12 +0000
+++ b/storage/ndb/src/kernel/blocks/pgman.cpp	2009-11-26 19:22:55 +0000
@@ -1657,7 +1657,7 @@ Pgman::execFSWRITEREF(Signal* signal)
 // client methods
 
 int
-Pgman::get_page(Signal* signal, Ptr<Page_entry> ptr, Page_request page_req)
+Pgman::get_page_no_lirs(Signal* signal, Ptr<Page_entry> ptr, Page_request page_req)
 {
   jamEntry();
 #ifdef VM_TRACE
@@ -1698,16 +1698,6 @@ Pgman::get_page(Signal* signal, Ptr<Page
     jam();
   }
 
-  // update LIRS
-  if (! (state & Page_entry::LOCKED) &&
-      ! (req_flags & Page_request::CORR_REQ))
-  {
-    jam();
-    set_page_state(ptr, state);
-    lirs_reference(ptr);
-    state = ptr.p->m_state;
-  }
-
   const Page_state LOCKED = Page_entry::LOCKED | Page_entry::MAPPED;
   if ((state & LOCKED) == LOCKED && 
       ! (req_flags & Page_request::UNLOCK_PAGE))
@@ -1794,8 +1784,6 @@ Pgman::get_page(Signal* signal, Ptr<Page
   ptr.p->m_busy_count += busy_count;
   ptr.p->m_dirty_count += !!(req_flags & DIRTY_FLAGS);
   set_page_state(ptr, state);
-  
-  do_busy_loop(signal, true);
 
 #ifdef VM_TRACE
   debugOut << "PGMAN: " << req_ptr << endl;
@@ -1804,6 +1792,37 @@ Pgman::get_page(Signal* signal, Ptr<Page
   return 0;
 }
 
+int
+Pgman::get_page(Signal* signal, Ptr<Page_entry> ptr, Page_request page_req)
+{
+  int i = get_page_no_lirs(signal, ptr, page_req);
+  if (unlikely(i == -1))
+  {
+    jam();
+    return -1;
+  }
+
+  Uint32 req_flags = page_req.m_flags;
+  Page_state state = ptr.p->m_state;
+
+  // update LIRS
+  if (! (state & Page_entry::LOCKED) &&
+      ! (req_flags & Page_request::CORR_REQ))
+  {
+    jam();
+    lirs_reference(ptr);
+  }
+
+  // start processing if request was queued
+  if (i == 0)
+  {
+    jam();
+    do_busy_loop(signal, true);
+  }
+
+  return i;
+}
+
 void
 Pgman::update_lsn(Ptr<Page_entry> ptr, Uint32 block, Uint64 lsn)
 {

=== modified file 'storage/ndb/src/kernel/blocks/pgman.hpp'
--- a/storage/ndb/src/kernel/blocks/pgman.hpp	2009-11-26 19:21:10 +0000
+++ b/storage/ndb/src/kernel/blocks/pgman.hpp	2009-11-26 19:22:55 +0000
@@ -482,6 +482,7 @@ private:
   void fswritereq(Signal*, Ptr<Page_entry>);
   void fswriteconf(Signal*, Ptr<Page_entry>);
 
+  int get_page_no_lirs(Signal*, Ptr<Page_entry>, Page_request page_req);
   int get_page(Signal*, Ptr<Page_entry>, Page_request page_req);
   void update_lsn(Ptr<Page_entry>, Uint32 block, Uint64 lsn);
   Uint32 create_data_file();


Attachment: [text/bzr-bundle] bzr/pekka@mysql.com-20091126192255-vhis3umjaijdxwdx.bundle
Thread
bzr commit into mysql-5.1-telco-6.2 branch (pekka:3040) Bug#48910Pekka Nousiainen26 Nov