List:Commits« Previous MessageNext Message »
From:jonas Date:March 23 2007 10:52am
Subject:bk commit into 5.1 tree (jonas:1.2327)
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@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)jonas23 Mar