List:Commits« Previous MessageNext Message »
From:jonas Date:March 23 2007 11:05am
Subject:bk commit into 5.1 tree (jonas:1.2326)
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 12:05:37+01:00, jonas@stripped +4 -0
  recommit in clean

  storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp@stripped, 2007-03-23 12:05:35+01:00, jonas@stripped +10 -1
    recommit in clean

  storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp@stripped, 2007-03-23 12:05:35+01:00, jonas@stripped +11 -9
    recommit in clean

  storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp@stripped, 2007-03-23 12:05:35+01:00, jonas@stripped +54 -45
    recommit in clean

  storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp@stripped, 2007-03-23 12:05:36+01:00, jonas@stripped +0 -13
    recommit in clean

# 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-wl1190

--- 1.5/storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp	2007-03-23 12:05:42 +01:00
+++ 1.6/storage/ndb/src/kernel/blocks/dbtup/DbtupVarAlloc.cpp	2007-03-23 12:05:42 +01:00
@@ -79,13 +79,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))
@@ -410,12 +403,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.56/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2007-03-23 12:05:42 +01:00
+++ 1.57/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2007-03-23 12:05:42 +01:00
@@ -1337,7 +1337,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.18/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp	2007-03-23 12:05:42 +01:00
+++ 1.19/storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp	2007-03-23 12:05:42 +01:00
@@ -260,26 +260,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.49/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp	2007-03-23 12:05:42 +01:00
+++ 1.50/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp	2007-03-23 12:05:42 +01:00
@@ -2504,6 +2504,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, 
@@ -2676,7 +2677,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];
@@ -2691,53 +2695,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;
@@ -2912,25 +2918,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.
@@ -3006,9 +3019,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);
@@ -3138,16 +3150,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
   {
@@ -3269,8 +3280,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])
     ;
@@ -3311,7 +3320,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.2326)jonas23 Mar