List:Maria Storage Engine« Previous MessageNext Message »
From:Michael Widenius Date:November 4 2008 10:54am
Subject:bzr commit into MySQL/Maria:mysql-maria branch (monty:2698)
View as plain text  
#At bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-maria/

 2698 Michael Widenius	2008-11-04
      Fixed that packed transid can be compared byte per byte and we get them in increasing order
      The old way to store the length prefix was (256 - length); This is now changed to (length -249)
      Fixed also that some defines to have a MARIA_ prefix
modified:
  storage/maria/ma_control_file.c
  storage/maria/ma_key.c
  storage/maria/ma_open.c
  storage/maria/maria_def.h

per-file messages:
  storage/maria/ma_control_file.c
    Added comment
  storage/maria/ma_key.c
    Added MARIA_ prefix to some defines
    Changed how packed transid length was stored
  storage/maria/ma_open.c
    Added MARIA_ prefix to some defines
  storage/maria/maria_def.h
    Added MARIA_ prefix to some defines
    Changed how packed transid length was stored
=== modified file 'storage/maria/ma_control_file.c'
--- a/storage/maria/ma_control_file.c	2008-06-02 20:53:25 +0000
+++ b/storage/maria/ma_control_file.c	2008-11-04 10:54:04 +0000
@@ -185,8 +185,12 @@ static CONTROL_FILE_ERROR create_control
     files around (indeed it could be that the control file alone was deleted
     or not restored, and we should not go on with life at this point).
 
-    TODO: For now we trust (this is alpha version), but for beta if would
-    be great to verify.
+    Things should still be relatively safe as if someone tries to use
+    an old table with a new control file the different uuid:s between
+    the files will cause ma_open() to generate an HA_ERR_OLD_FILE
+    error. When used from mysqld this will cause the table to be open
+    in repair mode which will remove all dependencies between the
+    table and the old control file.
 
     We could have a tool which can rebuild the control file, by reading the
     directory of logs, finding the newest log, reading it to find last

=== modified file 'storage/maria/ma_key.c'
--- a/storage/maria/ma_key.c	2008-06-26 15:10:11 +0000
+++ b/storage/maria/ma_key.c	2008-11-04 10:54:04 +0000
@@ -61,7 +61,7 @@ static int _ma_put_key_in_record(MARIA_H
   if trid < 256-12
     one byte
   else
-    one byte prefix (256-length_of_trid_in_bytes) followed by data
+    one byte prefix length_of_trid_in_bytes + 249 followed by data
     in high-byte-first order
 
   Prefix bytes 244 to 249 are reserved for negative transid, that can be used
@@ -69,6 +69,25 @@ static int _ma_put_key_in_record(MARIA_H
 
   We have to store transid in high-byte-first order to be able to do a
   fast byte-per-byte comparision of them without packing them up.
+
+  For example, assuming we the following data:
+
+  key_data:               1                (4 byte integer)
+  pointer_to_row:         2 << 8 + 3 = 515 (page 2, row 3)
+  table_create_transid    1000             Defined at create table time
+  transid                 1010	           Transaction that created row
+  delete_transid          2011             Transaction that deleted row
+
+  In addition we assume the table is created with a data pointer length
+  of 4 bytes (this is automatically calculated based on the medium
+  length of rows and the given max number of rows)
+
+  The binary data for the key would then look like this in hex:
+
+  00 00 00 01     Key data (1 stored high byte first)
+  00 00 00 47	  (515 << 1) + 1         ;  The last 1 is marker that key cont.
+  15              ((1000-1010) << 1) + 1 ;  The last 1 is marker that key cont.
+  FB 07 E6        length byte and  ((2011 - 1000) << 1) = 07 E6
 */
 
 uint transid_store_packed(MARIA_HA *info, uchar *to, ulonglong trid)
@@ -76,7 +95,7 @@ uint transid_store_packed(MARIA_HA *info
   uchar *start;
   uint length;
   uchar buff[8];
-  DBUG_ASSERT(trid < (LL(1) << (MAX_PACK_TRANSID_SIZE*8)));
+  DBUG_ASSERT(trid < (LL(1) << (MARIA_MAX_PACK_TRANSID_SIZE*8)));
   DBUG_ASSERT(trid >= info->s->state.create_trid);
 
   trid= (trid - info->s->state.create_trid) << 1;
@@ -84,7 +103,7 @@ uint transid_store_packed(MARIA_HA *info
   /* Mark that key contains transid */
   to[-1]|= 1;
 
-  if (trid < MIN_TRANSID_PACK_PREFIX)
+  if (trid < MARIA_MIN_TRANSID_PACK_OFFSET)
   {
     to[0]= (uchar) trid;
     return 1;
@@ -100,7 +119,8 @@ uint transid_store_packed(MARIA_HA *info
   } while (trid);
 
   length= (uint) (to - buff);
-  start[0]= (uchar) (256 - length);             /* Store length prefix */
+  /* Store length prefix */
+  start[0]= (uchar) (length + MARIA_TRANSID_PACK_OFFSET);
   start++;
   /* Copy things in high-byte-first order to output buffer */
   do
@@ -127,12 +147,13 @@ ulonglong transid_get_packed(MARIA_SHARE
   ulonglong value;
   uint length;
 
-  if (from[0] < MIN_TRANSID_PACK_PREFIX)
+  if (from[0] < MARIA_MIN_TRANSID_PACK_OFFSET)
     value= (ulonglong) from[0];
   else
   {
     value= 0;
-    for (length= (uint) (256 - from[0]), value= (ulonglong) from[1], from+=2;
+    for (length= (uint) (from[0] - MARIA_TRANSID_PACK_OFFSET),
+           value= (ulonglong) from[1], from+=2;
          --length ;
          from++)
       value= (value << 8) + ((ulonglong) *from);

=== modified file 'storage/maria/ma_open.c'
--- a/storage/maria/ma_open.c	2008-10-31 23:14:58 +0000
+++ b/storage/maria/ma_open.c	2008-11-04 10:54:04 +0000
@@ -449,7 +449,7 @@ MARIA_HA *maria_open(const char *name, i
     /* Ensure we have space in the key buffer for transaction id's */
     if (share->base.born_transactional)
       share->base.max_key_length= ALIGN_SIZE(share->base.max_key_length +
-                                             MAX_PACK_TRANSID_SIZE);
+                                             MARIA_MAX_PACK_TRANSID_SIZE);
 
     /*
       If page cache is not initialized, then assume we will create the

=== modified file 'storage/maria/maria_def.h'
--- a/storage/maria/maria_def.h	2008-10-14 21:23:33 +0000
+++ b/storage/maria/maria_def.h	2008-11-04 10:54:04 +0000
@@ -146,14 +146,15 @@ typedef struct st_maria_state_info
 #define MARIA_KEYDEF_SIZE	(2+ 5*2)
 #define MARIA_UNIQUEDEF_SIZE	(2+1+1)
 #define HA_KEYSEG_SIZE		(6+ 2*2 + 4*2)
-#define MARIA_MAX_KEY_BUFF	(HA_MAX_KEY_BUFF + MAX_PACK_TRANSID_SIZE)
+#define MARIA_MAX_KEY_BUFF	(HA_MAX_KEY_BUFF + MARIA_MAX_PACK_TRANSID_SIZE)
 #define MARIA_COLUMNDEF_SIZE	(2*7+1+1+4)
 #define MARIA_BASE_INFO_SIZE	(MY_UUID_SIZE + 5*8 + 6*4 + 11*2 + 6 + 5*2 + 1 + 16)
 #define MARIA_INDEX_BLOCK_MARGIN 16	/* Safety margin for .MYI tables */
-/* Internal management bytes needed to store 2 keys on an index page */
-#define MAX_PACK_TRANSID_SIZE (TRANSID_SIZE+1)
-#define MIN_TRANSID_PACK_PREFIX (256-TRANSID_SIZE*2)
-#define MARIA_INDEX_OVERHEAD_SIZE (MAX_PACK_TRANSID_SIZE * 2)
+/* Internal management bytes needed to store 2 transid/key on an index page */
+#define MARIA_MAX_PACK_TRANSID_SIZE   (TRANSID_SIZE+1)
+#define MARIA_TRANSID_PACK_OFFSET     (256- TRANSID_SIZE - 1)
+#define MARIA_MIN_TRANSID_PACK_OFFSET (MARIA_TRANSID_PACK_OFFSET-TRANSID_SIZE)
+#define MARIA_INDEX_OVERHEAD_SIZE     (MARIA_MAX_PACK_TRANSID_SIZE * 2)
 #define MARIA_DELETE_KEY_NR  255	/* keynr for deleted blocks */
 
 /*
@@ -941,8 +942,8 @@ extern my_bool _ma_compact_keypage(MARIA
 extern uint transid_store_packed(MARIA_HA *info, uchar *to, ulonglong trid);
 extern ulonglong transid_get_packed(MARIA_SHARE *share, const uchar *from);
 #define transid_packed_length(data) \
-  ((data)[0] < MIN_TRANSID_PACK_PREFIX ? 1 : \
-   (uint) (257 - (uchar) (data)[0]))
+  ((data)[0] < MARIA_MIN_TRANSID_PACK_OFFSET ? 1 : \
+   (uint) ((uchar) (data)[0]) - (MARIA_TRANSID_PACK_OFFSET - 1))
 #define key_has_transid(key) (*(key) & 1)
 
 extern MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr,

Thread
bzr commit into MySQL/Maria:mysql-maria branch (monty:2698) Michael Widenius4 Nov