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.1937 05/07/11 21:22:32 joreland@stripped +5 -0
ndb diskdata
fix undo wrt create/drop table
storage/ndb/src/kernel/blocks/lgman.cpp
1.45 05/07/11 21:22:28 joreland@stripped +37 -10
Add undo of create table
storage/ndb/src/kernel/blocks/diskpage.hpp
1.21 05/07/11 21:22:28 joreland@stripped +3 -2
Add undo of create table
storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp
1.36 05/07/11 21:22:28 joreland@stripped +63 -8
Add undo of create table
storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
1.24 05/07/11 21:22:28 joreland@stripped +16 -2
Add undo of create table
storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
1.71 05/07/11 21:22:28 joreland@stripped +13 -7
Add undo of create table
# 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: joreland
# Host: eel.(none)
# Root: /home/jonas/src/mysql-5.1-ndb-dd
--- 1.23/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2005-07-11 14:47:50 +02:00
+++ 1.24/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp 2005-07-11 21:22:28 +02:00
@@ -907,6 +907,21 @@
preq.m_page.m_page_idx = rec->m_file_no_page_idx & 0xFFFF;
break;
}
+ case File_formats::Undofile::UNDO_TUP_CREATE:
+ /**
+ *
+ */
+ {
+ Disk_undo::Create* rec= (Disk_undo::Create*)ptr;
+ Ptr<Tablerec> tabPtr;
+ tabPtr.i= rec->m_table;
+ ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
+ for(Uint32 i = 0; i<MAX_FRAG_PER_NODE; i++)
+ if(tabPtr.p->fragrec[i] != RNIL)
+ disk_restart_undo_lcp(tabPtr.i, tabPtr.p->fragid[i]);
+ disk_restart_undo_next(signal);
+ return;
+ }
default:
ndbrequire(false);
}
@@ -946,7 +961,6 @@
FragrecordPtr fragPtr;
getFragmentrec(fragPtr, fragId, tabPtr.p);
- ndbrequire(!fragPtr.p->m_undo_complete);
fragPtr.p->m_undo_complete = true;
}
@@ -996,7 +1010,7 @@
default:
ndbrequire(false);
}
- lsn = f_undo.m_lsn;
+ lsn = f_undo.m_lsn;
}
else
{
--- 1.20/storage/ndb/src/kernel/blocks/diskpage.hpp 2005-04-30 13:42:59 +02:00
+++ 1.21/storage/ndb/src/kernel/blocks/diskpage.hpp 2005-07-11 21:22:28 +02:00
@@ -144,8 +144,9 @@
,UNDO_TUP_ALLOC = 3
,UNDO_TUP_UPDATE = 4
,UNDO_TUP_FREE = 5
-
- ,UNDO_END = 6
+ ,UNDO_TUP_CREATE = 6
+
+ ,UNDO_END = 0x7FFF
,UNDO_NEXT_LSN = 0x8000
};
--- 1.44/storage/ndb/src/kernel/blocks/lgman.cpp 2005-07-11 14:47:50 +02:00
+++ 1.45/storage/ndb/src/kernel/blocks/lgman.cpp 2005-07-11 21:22:28 +02:00
@@ -210,6 +210,22 @@
void
Lgman::execDUMP_STATE_ORD(Signal* signal){
jamEntry();
+ if(signal->theData[0] == 12001)
+ {
+ Ptr<Logfile_group> ptr;
+ m_logfile_group_list.first(ptr);
+ while(!ptr.isNull())
+ {
+ infoEvent("lfg %d state: %x fs: %d lsn "
+ "[ last: %lld sync_req: %lld synced: %lld lcp: %lld ] waiters: %d",
+ ptr.p->m_logfile_group_id, ptr.p->m_state,
+ ptr.p->m_outstanding_fs,
+ ptr.p->m_last_lsn, ptr.p->m_last_sync_req_lsn,
+ ptr.p->m_last_synced_lsn, ptr.p->m_last_lcp_lsn,
+ !ptr.p->m_log_sync_waiters.isEmpty());
+ m_logfile_group_list.next(ptr);
+ }
+ }
}
void
@@ -1312,7 +1328,11 @@
Uint64 last_lsn= m_last_lsn;
- if(ptr.p->m_last_lsn == last_lsn)
+ if(ptr.p->m_last_lsn == last_lsn
+#ifdef VM_TRACE
+ && ((rand() % 100) > 50)
+#endif
+ )
{
undo[2] |= File_formats::Undofile::UNDO_NEXT_LSN << 16;
Uint32 *dst= get_log_buffer(ptr, sizeof(undo) >> 2);
@@ -1528,7 +1548,11 @@
if(m_lgman->m_logfile_group_hash.find(ptr, key))
{
Uint64 last_lsn_filegroup= ptr.p->m_last_lsn;
- if(last_lsn_filegroup == last_lsn)
+ if(last_lsn_filegroup == last_lsn
+#ifdef VM_TRACE
+ && ((rand() % 100) > 50)
+#endif
+ )
{
dst= m_lgman->get_log_buffer(ptr, tot);
for(i= 0; i<cnt; i++)
@@ -1541,7 +1565,6 @@
}
else
{
- assert(false);
dst= m_lgman->get_log_buffer(ptr, tot + 2);
* dst++ = last_lsn >> 32;
* dst++ = last_lsn & 0xFFFFFFFF;
@@ -1962,6 +1985,7 @@
ptr.p->m_pos[CONSUMER].m_current_pos.m_idx = pageP->m_words_used;
ptr.p->m_pos[PRODUCER].m_current_pos.m_idx = 1;
+ ptr.p->m_last_read_lsn++;
}
/**
@@ -2178,14 +2202,12 @@
Uint32 mask= type & ~(Uint32)File_formats::Undofile::UNDO_NEXT_LSN;
switch(mask){
case File_formats::Undofile::UNDO_END:
- ndbout_c("Found end of log");
stop_run_undo_log(signal);
return;
case File_formats::Undofile::UNDO_LCP:
case File_formats::Undofile::UNDO_LCP_FIRST:
{
Uint32 lcp = * (ptr - len + 1);
- printf("Found LCP: %d looking for %d", lcp, m_latest_lcp);
if(lcp > m_latest_lcp)
{
// Just ignore
@@ -2196,7 +2218,6 @@
(lcp == m_latest_lcp &&
mask == File_formats::Undofile::UNDO_LCP_FIRST))
{
- ndbout_c(" -> end of log");
stop_run_undo_log(signal);
return;
}
@@ -2205,6 +2226,7 @@
case File_formats::Undofile::UNDO_TUP_ALLOC:
case File_formats::Undofile::UNDO_TUP_UPDATE:
case File_formats::Undofile::UNDO_TUP_FREE:
+ case File_formats::Undofile::UNDO_TUP_CREATE:
tup->disk_restart_undo(signal, lsn, mask, ptr - len + 1, len);
return;
default:
@@ -2263,14 +2285,15 @@
if(((* record) >> 16) & File_formats::Undofile::UNDO_NEXT_LSN)
{
lsn = ptr.p->m_last_read_lsn - 1;
+ ndbrequire((Int64)lsn >= 0);
}
else
{
- ndbassert(false);
ndbassert(pos >= 3);
- lsn += * (prev - 2); lsn <<= 32;
- lsn += * (prev - 1);
+ lsn += * (prev - 1); lsn <<= 32;
+ lsn += * (prev - 0);
len += 2;
+ ndbrequire((Int64)lsn >= 0);
}
@@ -2502,7 +2525,11 @@
ndbrequire(m_logfile_group_list.first(ptr));
Uint64 last_lsn= m_last_lsn;
- if(ptr.p->m_last_lsn == last_lsn)
+ if(ptr.p->m_last_lsn == last_lsn
+#ifdef VM_TRACE
+ && ((rand() % 100) > 50)
+#endif
+ )
{
undo[2] |= File_formats::Undofile::UNDO_NEXT_LSN << 16;
Uint32 *dst= get_log_buffer(ptr, sizeof(undo) >> 2);
--- 1.70/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-07-11 14:47:50 +02:00
+++ 1.71/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2005-07-11 21:22:28 +02:00
@@ -852,9 +852,10 @@
{
enum
{
- UNDO_ALLOC = File_formats::Undofile::UNDO_TUP_ALLOC,
- UNDO_UPDATE = File_formats::Undofile::UNDO_TUP_UPDATE,
- UNDO_FREE = File_formats::Undofile::UNDO_TUP_FREE
+ UNDO_ALLOC = File_formats::Undofile::UNDO_TUP_ALLOC
+ ,UNDO_UPDATE = File_formats::Undofile::UNDO_TUP_UPDATE
+ ,UNDO_FREE = File_formats::Undofile::UNDO_TUP_FREE
+ ,UNDO_CREATE = File_formats::Undofile::UNDO_TUP_CREATE
};
struct Alloc
@@ -881,6 +882,12 @@
Uint32 m_data[1];
Uint32 m_type_length; // 16 bit type, 16 bit length
};
+
+ struct Create
+ {
+ Uint32 m_table;
+ Uint32 m_type_length; // 16 bit type, 16 bit length
+ };
};
ArrayPool<Extent_info> c_extent_pool;
@@ -2342,10 +2349,6 @@
//------------------------------------------------------------------------------------------------------
// Common stored variables. Variables that have a valid value always.
//------------------------------------------------------------------------------------------------------
- Uint32 cnoOfLcpRec;
- Uint32 cnoOfParallellUndoFiles;
- Uint32 cnoOfUndoPage;
-
Attrbufrec *attrbufrec;
Uint32 cfirstfreeAttrbufrec;
Uint32 cnoOfAttrbufrec;
@@ -2471,6 +2474,9 @@
void disk_page_undo_free(Page*, const Local_key*, const Uint32*, Uint32 sz,
Uint32 gci, Uint32 logfile_group_id);
+
+ void undo_createtable_callback(Signal* signal, Uint32 opPtrI, Uint32 unused);
+
/**
* Disk restart code
*/
--- 1.35/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2005-07-07 16:56:39 +02:00
+++ 1.36/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp 2005-07-11 21:22:28 +02:00
@@ -64,8 +64,6 @@
Uint32 tablespace= signal->theData[14];
Uint32 checksumIndicator= signal->theData[11];
- if(checksumIndicator)
- printf("");
#ifndef VM_TRACE
// config mismatch - do not crash if release compiled
@@ -536,12 +534,6 @@
}
#endif
- signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
- signal->theData[1] = lastAttr;
- sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
- signal, 2, JBB);
-
-
if(regTabPtr.p->m_no_of_disk_attributes)
{
CreateFilegroupImplReq rep;
@@ -552,11 +544,74 @@
new (®FragPtr.p->m_disk_alloc_info)
Disk_alloc_info(regTabPtr.p, rep.tablespace.extent_size);
+
+ if(!(getNodeState().getSystemRestartInProgress() &&
+ getNodeState().startLevel == NodeState::SL_STARTING &&
+ getNodeState().starting.startPhase <= 4))
+ {
+ Callback cb;
+ cb.m_callbackData= fragOperPtr.i;
+ cb.m_callbackFunction =
+ safe_cast(&Dbtup::undo_createtable_callback);
+ Uint32 sz= sizeof(Disk_undo::Create) >> 2;
+
+ Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
+ int res= lgman.get_log_buffer(signal, sz, &cb);
+ switch(res){
+ case 0:
+ signal->theData[0] = 1;
+ return;
+ case -1:
+ ndbrequire("NOT YET IMPLEMENTED" == 0);
+ break;
+ }
+ execute(signal, cb, 0);
+ return;
+ }
}
+ signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
+ signal->theData[1] = lastAttr;
+ sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
+ signal, 2, JBB);
+
releaseFragoperrec(fragOperPtr);
return;
+}
+
+void
+Dbtup::undo_createtable_callback(Signal* signal, Uint32 opPtrI, Uint32 unused)
+{
+ FragrecordPtr regFragPtr;
+ FragoperrecPtr fragOperPtr;
+ TablerecPtr regTabPtr;
+
+ fragOperPtr.i= opPtrI;
+ ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
+
+ regTabPtr.i= fragOperPtr.p->tableidFrag;
+ ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
+
+ getFragmentrec(regFragPtr, fragOperPtr.p->fragidFrag, regTabPtr.p);
+ ndbrequire(regFragPtr.i != RNIL);
+
+ Logfile_client lsman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
+
+ Disk_undo::Create create;
+ create.m_type_length= Disk_undo::UNDO_CREATE << 16 | (sizeof(create) >> 2);
+ create.m_table = regTabPtr.i;
+
+ Logfile_client::Change c[1] = {{ &create, sizeof(create) >> 2 } };
+
+ Uint64 lsn= lsman.add_entry<1>(c);
+
+ signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
+ signal->theData[1] = 1;
+ sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
+ signal, 2, JBB);
+
+ releaseFragoperrec(fragOperPtr);
}
/*
| Thread |
|---|
| • bk commit into 5.1 tree (joreland:1.1937) | jonas.oreland | 11 Jul |