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@stripped, 2007-03-23 11:51:58+01:00, jonas@stripped +4 -0
ndb - wl1190
review comments part 1
storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp@stripped, 2007-03-23 11:51:56+01:00, jonas@stripped +10 -1
Add struct so that one can easily identify
where the extra word in the shrunken format is used
storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp@stripped, 2007-03-23 11:51:56+01:00, jonas@stripped +11 -9
Use new struct
Add extra assert for non MM_SHRINK tuple, sizes must match exactly
storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp@stripped, 2007-03-23 11:51:56+01:00, jonas@stripped +54 -45
1) Use new struct
2) Copy fix part first in expand_tuple
3) Add ndbrequire(false) for what I think impossible if-statement
storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp@stripped, 2007-03-23 11:51:56+01:00, jonas@stripped +0 -13
Remove fix-part from sizes[4]
Implies I dont need to subtract them from alloc_size
# 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: perch.ndb.mysql.com
# Root: /home/jonas/src/51-dynattr
--- 1.6/storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp 2007-03-23 11:52:03 +01:00
+++ 1.7/storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp 2007-03-23 11:52:03 +01:00
@@ -78,13 +78,6 @@
{
return 0;
}
-
- ndbassert(alloc_size >= tabPtr->m_offsets[MM].m_fix_header_size +
- Tuple_header::HeaderSize);
-
- alloc_size -= tabPtr->m_offsets[MM].m_fix_header_size +
- Tuple_header::HeaderSize;
-
Local_key varref;
if (likely(alloc_var_part(fragPtr, tabPtr, alloc_size, &varref) != 0))
@@ -408,12 +401,6 @@
{
return 0;
}
-
- ndbassert(alloc_size >= tabPtr->m_offsets[MM].m_fix_header_size +
- Tuple_header::HeaderSize);
-
- alloc_size -= tabPtr->m_offsets[MM].m_fix_header_size +
- Tuple_header::HeaderSize;
Local_key varref;
if (likely(alloc_var_part(fragPtr, tabPtr, alloc_size, &varref) != 0))
--- 1.57/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2007-03-23 11:52:04 +01:00
+++ 1.58/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp 2007-03-23 11:52:04 +01:00
@@ -1369,7 +1369,16 @@
return m_data;
}
};
-
+
+ /**
+ * Format of varpart after insert/update
+ */
+ struct Varpart_copy
+ {
+ Uint32 m_len;
+ Uint32 m_data[1]; // Only used for easy offset handling
+ };
+
struct KeyReqStruct {
/**
* These variables are used as temporary storage during execution of the
--- 1.19/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2007-03-23 11:52:04 +01:00
+++ 1.20/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp 2007-03-23 11:52:04 +01:00
@@ -263,26 +263,28 @@
PagePtr vpagePtr;
Uint32 *dst= get_ptr(&vpagePtr, *(Var_part_ref*)ref);
Var_page* vpagePtrP = (Var_page*)vpagePtr.p;
- Uint32 *src= copy->get_var_part_ptr(regTabPtr);
+ Varpart_copy* vp = (Varpart_copy*)copy->get_var_part_ptr(regTabPtr);
ndbassert(!(copy_bits & Tuple_header::CHAINED_ROW));
/* The first word of shrunken tuple holds the lenght in words. */
- Uint32 sz= (*((Uint16 *)src)) << 2;
- src++;
- ndbassert(4*vpagePtrP->get_entry_len(tmp.m_page_idx) >= sz);
- memcpy(dst, src, sz);
+ Uint32 len = vp->m_len;
+ memcpy(dst, vp->m_data, 4*len);
copy_bits |= Tuple_header::CHAINED_ROW;
if(copy_bits & Tuple_header::MM_SHRINK)
{
- vpagePtrP->shrink_entry(tmp.m_page_idx, (sz + 3) >> 2);
+ ndbassert(vpagePtrP->get_entry_len(tmp.m_page_idx) >= len);
+ vpagePtrP->shrink_entry(tmp.m_page_idx, len);
update_free_page_list(regFragPtr, vpagePtr);
- }
+ }
+ else
+ {
+ ndbassert(vpagePtrP->get_entry_len(tmp.m_page_idx) == len);
+ }
/*
Find disk part after header + fixed MM part + length word + varsize part.
*/
- disk_ptr = (Tuple_header*)
- (((Uint32*)copy)+Tuple_header::HeaderSize+fixsize+1+((sz + 3) >> 2));
+ disk_ptr = (Tuple_header*)(vp->m_data + len);
}
if (regTabPtr->m_no_of_disk_attributes &&
--- 1.50/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp 2007-03-23 11:52:04 +01:00
+++ 1.51/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp 2007-03-23 11:52:04 +01:00
@@ -2517,6 +2517,7 @@
* tabDesc array of attribute descriptors (used for getting max size)
* no_of_attr no of atributes to expand
*/
+static
Uint32*
expand_var_part(Dbtup::KeyReqStruct::Var_data *dst,
const Uint32* src,
@@ -2689,7 +2690,10 @@
if(mm_vars || mm_dyns)
{
- Uint32 src_len, orig_src_len;
+ // Copy fix part
+ memcpy(ptr, src, 4*(fix_size + Tuple_header::HeaderSize));
+
+ Uint32 src_len;
Uint32 step; // in bytes
const Uint32 *src_data;
KeyReqStruct::Var_data* dst= &req_struct->m_var_data[MM];
@@ -2704,53 +2708,55 @@
/* If the original tuple was grown, the old size is stored at the end. */
if(bits & Tuple_header::MM_GROWN)
{
+ ndbrequire(false);
ndbassert(src_len>0);
src_len= src_data[src_len-1];
}
- step= 4;
+ step= 1;
req_struct->m_varpart_page_ptr = var_page;
}
else
{
/* This is for the re-expansion of a shrunken row (update2 ...) */
- /* Read the total length of varpart from initial extra length word. */
- Uint16 *len_ptr= (Uint16 *)src_ptr;
- src_len= len_ptr[0];
- /* Reserve space for shrink_tuple to write the new size word. */
- src_data= src_ptr+1;
- step= 4*(1+src_len);
+ Varpart_copy* vp = (Varpart_copy*)src_ptr;
+ src_len = vp->m_len;
+ src_data= vp->m_data;
+ step= (1+src_len); // 1+ is for extra word
req_struct->m_varpart_page_ptr = req_struct->m_page_ptr;
sizes[MM]= src_len;
}
/*
- Reserve place for initial length word and offset array (with one extra
- offset). This will be filled-in in later, in shrink_tuple().
- */
- dst->m_data_ptr= (char*)(((Uint16*)dst_ptr)+2+mm_vars+1);
+ * Reserve place for initial length word and offset array (with one extra
+ * offset). This will be filled-in in later, in shrink_tuple().
+ */
+ dst_ptr++;
+ dst->m_data_ptr= (char*)(((Uint16*)dst_ptr)+mm_vars+1);
dst->m_offset_array_ptr= req_struct->var_pos_array;
dst->m_var_len_offset= mm_vars;
dst->m_max_var_offset= tabPtrP->m_offsets[MM].m_max_var_offset;
dst_ptr= expand_var_part(dst, src_data, desc, order);
- /* Find the start of the dynamic data. */
- Uint32* dyn_src_data= ALIGN_WORD((char *)src_data + 2*(mm_vars+1) +
- ((Uint16 *)src_data)[mm_vars]);
ndbassert(dst_ptr == ALIGN_WORD(dst->m_data_ptr + dst->m_max_var_offset));
- ndbassert((UintPtr(src_ptr) & 3) == 0);
- src_ptr = ALIGN_WORD(((char*)src_ptr)+step);
+
+ /**
+ * Now do dynpart
+ */
+ char* varstart = (char*)(((Uint16*)src_data)+mm_vars+1);
+ Uint32 varlen = ((Uint16*)src_data)[mm_vars];
+ Uint32* dynstart = ALIGN_WORD(varstart + varlen);
dst->m_dyn_offset_arr_ptr= req_struct->var_pos_array+2*mm_vars;
dst->m_dyn_len_offset= mm_dynvar+mm_dynfix;
dst->m_max_dyn_offset= tabPtrP->m_offsets[MM].m_max_dyn_offset;
dst->m_dyn_data_ptr= (char*)dst_ptr;
- dst_ptr= expand_dyn_part(dst, tabPtrP, dyn_src_data,
- src_len-(dyn_src_data-src_data),
+ dst_ptr= expand_dyn_part(dst, tabPtrP, dynstart,
+ src_len - (dynstart - src_data),
desc, order + mm_vars);
-
- sizes[MM] += fix_size + Tuple_header::HeaderSize;
- memcpy(ptr, src, 4*(fix_size + Tuple_header::HeaderSize));
- }
+
+ ndbassert((UintPtr(src_ptr) & 3) == 0);
+ src_ptr = src_ptr + step;
+ }
else
{
sizes[MM]= 1;
@@ -2925,25 +2931,32 @@
/* If the original tuple was grown, the old size is stored at the end. */
if(bits & Tuple_header::MM_GROWN)
{
- ndbassert(src_len>0);
- src_len= src_data[src_len-1];
+ /**
+ * This is when triggers read before value of update
+ * when original has been reallocated due to grow
+ */
+ ndbassert(src_len>0);
+ src_len= src_data[src_len-1];
}
}
else
{
- /* Total length of varpart stored in first word. */
- src_len= *((Uint16 *)src_ptr);
+ Varpart_copy* vp = (Varpart_copy*)src_ptr;
+ src_len = vp->m_len;
+ src_data = vp->m_data;
src_ptr++;
- src_data= src_ptr;
}
+
+ char* varstart = (char*)(((Uint16*)src_data)+mm_vars+1);
+ Uint32 varlen = ((Uint16*)src_data)[mm_vars];
+ Uint32* dynstart = ALIGN_WORD(varstart + varlen);
- dst->m_data_ptr= (char*)(((Uint16*)src_data)+mm_vars+1);
+ dst->m_data_ptr= varstart;
dst->m_offset_array_ptr= (Uint16*)src_data;
dst->m_var_len_offset= 1;
- dst->m_max_var_offset= ((Uint16*)src_data)[mm_vars];
- dst->m_dyn_data_ptr= (char *)
- (ALIGN_WORD(dst->m_data_ptr + dst->m_offset_array_ptr[mm_vars]));
- dst->m_dyn_part_len= src_len - ((Uint32 *)(dst->m_dyn_data_ptr)-src_data);
+ dst->m_max_var_offset= varlen;
+ dst->m_dyn_data_ptr= (char*)dynstart;
+ dst->m_dyn_part_len= src_len - (dynstart - src_data);
/*
dst->m_dyn_offset_arr_ptr and dst->m_dyn_len_offset are not used for
reading the stored/shrunken format.
@@ -3019,9 +3032,8 @@
sizes[MM]= sizes[DD]= 0;
if(mm_vars || mm_dyns)
{
- /* Skip the initial length word, we will set it at the end. */
- Uint16 *length_word= (Uint16 *)dst_ptr;
- dst_ptr++;
+ Varpart_copy* vp = (Varpart_copy*)dst_ptr;
+ dst_ptr = vp->m_data;
Uint16* dst_off_ptr= (Uint16*)dst_ptr;
char* dst_data_ptr= (char*)(dst_off_ptr + mm_vars + 1);
@@ -3151,16 +3163,15 @@
}
}
+ Uint32 varpart_len= ((Uint32 *)dyn_dst_data_ptr)-dst_ptr;
+ vp->m_len = varpart_len;
+ sizes[MM] = varpart_len;
+ dst_ptr= (Uint32 *)dyn_dst_data_ptr;
+
ndbassert(dyn_dst_data_ptr <= ((char*)ptr) + 8192);
ndbassert((UintPtr(ptr) & 3) == 0);
ndbassert((UintPtr(dyn_dst_data_ptr) & 3) == 0);
- sizes[MM]= (dyn_dst_data_ptr - ((char*)ptr) - 4) >> 2;
- dst->m_dyn_part_len=
- (dyn_dst_data_ptr - dst->m_dyn_data_ptr) >> 2;
- Uint32 varpart_len= ((Uint32 *)dyn_dst_data_ptr)-dst_ptr;
ndbassert(varpart_len < 0x10000);
- length_word[0]= varpart_len;
- dst_ptr= (Uint32 *)dyn_dst_data_ptr;
}
else
{
@@ -3282,8 +3293,6 @@
Uint32 bits= org->m_header_bits;
Uint32 copy_bits= req_struct->m_tuple_ptr->m_header_bits;
- Uint32 fix_sz = Tuple_header::HeaderSize +
- regTabPtr->m_offsets[MM].m_fix_header_size;
if(sizes[MM] == sizes[2+MM])
;
@@ -3324,7 +3333,7 @@
ndbout << *pageP << endl;
#endif
ndbassert(pageP->get_entry_chain(idx));
- needed= sizes[2+MM] - fix_sz;
+ needed= sizes[2+MM];
if(needed <= alloc)
{
| Thread |
|---|
| • bk commit into 5.1 tree (jonas:1.2327) | jonas | 23 Mar |