#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 Widenius | 4 Nov |