Re: Reduce heap tuple header size - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Reduce heap tuple header size
Date
Msg-id 200206201733.g5KHXPk14360@candle.pha.pa.us
Whole thread Raw
In response to Reduce heap tuple header size  (Manfred Koizar <mkoi-pg@aon.at>)
Responses Re: Reduce heap tuple header size
List pgsql-patches
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://candle.pha.pa.us/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Manfred Koizar wrote:
> This patch, which is built upon the "HeapTupleHeader accessor macros"
> patch from 2002-06-10, is supposed to reduce the heap tuple header size
> by four bytes on most architectures.  Of course it changes the on-disk
> tuple format and therefore requires initdb.  As I have (once more)
> opened my mouth too wide, I'll have to provide a heap file conversion
> utility, if this patch gets accepted...  More on this later.
>
> ======================
>  All 81 tests passed.
> ======================
>
> It's late now, I'll do more tests tomorrow.
>
> Good night
>  Manfred
>
> diff -ru ../orig/src/backend/access/heap/heapam.c src/backend/access/heap/heapam.c
> --- ../orig/src/backend/access/heap/heapam.c    2002-06-13 19:34:48.000000000 +0200
> +++ src/backend/access/heap/heapam.c    2002-06-13 22:31:42.000000000 +0200
> @@ -2204,7 +2204,7 @@
>          htup->t_infomask = HEAP_XMAX_INVALID | xlhdr.mask;
>          HeapTupleHeaderSetXmin(htup, record->xl_xid);
>          HeapTupleHeaderSetCmin(htup, FirstCommandId);
> -        HeapTupleHeaderSetXmax(htup, InvalidTransactionId);
> +        HeapTupleHeaderSetXmaxInvalid(htup);
>          HeapTupleHeaderSetCmax(htup, FirstCommandId);
>
>          offnum = PageAddItem(page, (Item) htup, newlen, offnum,
> diff -ru ../orig/src/include/access/htup.h src/include/access/htup.h
> --- ../orig/src/include/access/htup.h    2002-06-13 19:34:49.000000000 +0200
> +++ src/include/access/htup.h    2002-06-14 01:12:47.000000000 +0200
> @@ -57,15 +57,24 @@
>   * Also note that we omit the nulls bitmap if t_infomask shows that there
>   * are no nulls in the tuple.
>   */
> +/*
> +** We store five "virtual" fields Xmin, Cmin, Xmax, Cmax, and Xvac
> +** in three physical fields t_xmin, t_cid, t_xmax:
> +** CommandId     Cmin;        insert CID stamp
> +** CommandId     Cmax;        delete CommandId stamp
> +** TransactionId Xmin;        insert XID stamp
> +** TransactionId Xmax;        delete XID stamp
> +** TransactionId Xvac;        used by VACCUUM
> +**
> +** This assumes, that a CommandId can be stored in a TransactionId.
> +*/
>  typedef struct HeapTupleHeaderData
>  {
>      Oid            t_oid;            /* OID of this tuple -- 4 bytes */
>
> -    CommandId    t_cmin;            /* insert CID stamp -- 4 bytes each */
> -    CommandId    t_cmax;            /* delete CommandId stamp */
> -
> -    TransactionId t_xmin;        /* insert XID stamp -- 4 bytes each */
> -    TransactionId t_xmax;        /* delete XID stamp */
> +    TransactionId t_xmin;        /* Xmin -- 4 bytes each */
> +    TransactionId t_cid;        /* Cmin, Cmax, Xvac */
> +    TransactionId t_xmax;        /* Xmax, Cmax */
>
>      ItemPointerData t_ctid;        /* current TID of this or newer tuple */
>
> @@ -75,7 +84,7 @@
>
>      uint8        t_hoff;            /* sizeof header incl. bitmap, padding */
>
> -    /* ^ - 31 bytes - ^ */
> +    /* ^ - 27 bytes - ^ */
>
>      bits8        t_bits[1];        /* bitmap of NULLs -- VARIABLE LENGTH */
>
> @@ -96,6 +105,8 @@
>                                           * attribute(s) */
>  #define HEAP_HASEXTENDED        0x000C    /* the two above combined */
>
> +#define HEAP_XMIN_IS_XMAX        0x0040    /* created and deleted in the */
> +                                        /* same transaction
> */
>  #define HEAP_XMAX_UNLOGGED        0x0080    /* to lock tuple for update */
>                                          /* without logging
> */
>  #define HEAP_XMIN_COMMITTED        0x0100    /* t_xmin committed */
> @@ -108,6 +119,7 @@
>                                           * vacuum */
>  #define HEAP_MOVED_IN            0x8000    /* moved from another place by
>                                           * vacuum */
> +#define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)
>
>  #define HEAP_XACT_MASK            0xFFF0    /* visibility-related bits */
>
> @@ -116,53 +128,100 @@
>  /* HeapTupleHeader accessor macros */
>
>  #define HeapTupleHeaderGetXmin(tup) \
> -    ((tup)->t_xmin)
> +( \
> +    (tup)->t_xmin \
> +)
>
>  #define HeapTupleHeaderGetXmax(tup) \
> -    ((tup)->t_xmax)
> +( \
> +    ((tup)->t_infomask & HEAP_XMIN_IS_XMAX) ? \
> +        (tup)->t_xmin \
> +    : \
> +        (tup)->t_xmax \
> +)
>
> -/* no AssertMacro, because this is read as a system-defined attribute also */
> +/* no AssertMacro, because this is read as a system-defined attribute */
>  #define HeapTupleHeaderGetCmin(tup) \
>  ( \
> -    (tup)->t_cmin \
> +    ((tup)->t_infomask & HEAP_MOVED) ? \
> +        FirstCommandId \
> +    : \
> +    ( \
> +        ((tup)->t_infomask & (HEAP_XMIN_IS_XMAX | HEAP_XMAX_INVALID)) ? \
> +            (CommandId) (tup)->t_cid \
> +        : \
> +            FirstCommandId \
> +    ) \
>  )
>
>  #define HeapTupleHeaderGetCmax(tup) \
> -    ((tup)->t_cmax)
> +( \
> +    ((tup)->t_infomask & HEAP_MOVED) ? \
> +        FirstCommandId \
> +    : \
> +    ( \
> +        ((tup)->t_infomask & (HEAP_XMIN_IS_XMAX | HEAP_XMAX_INVALID)) ? \
> +            (CommandId) (tup)->t_xmax \
> +        : \
> +            (CommandId) (tup)->t_cid \
> +    ) \
> +)
>
>  #define HeapTupleHeaderGetXvac(tup) \
>  ( \
> -    AssertMacro((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF)), \
> -    (TransactionId) (tup)->t_cmin \
> +    AssertMacro((tup)->t_infomask & HEAP_MOVED), \
> +    (tup)->t_cid \
>  )
>
>
>  #define HeapTupleHeaderSetXmin(tup, xid) \
> -    (TransactionIdStore((xid), &(tup)->t_xmin))
> +( \
> +    TransactionIdStore((xid), &(tup)->t_xmin) \
> +)
>
>  #define HeapTupleHeaderSetXminInvalid(tup) \
> -    (StoreInvalidTransactionId(&(tup)->t_xmin))
> +do { \
> +    (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
> +    StoreInvalidTransactionId(&(tup)->t_xmin); \
> +} while (0)
>
>  #define HeapTupleHeaderSetXmax(tup, xid) \
> -    (TransactionIdStore((xid), &(tup)->t_xmax))
> +do { \
> +    if (TransactionIdEquals((tup)->t_xmin, (xid))) \
> +        (tup)->t_infomask |= HEAP_XMIN_IS_XMAX; \
> +    else \
> +    { \
> +        (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
> +        TransactionIdStore((xid), &(tup)->t_xmax); \
> +    } \
> +} while (0)
>
>  #define HeapTupleHeaderSetXmaxInvalid(tup) \
> -    (StoreInvalidTransactionId(&(tup)->t_xmax))
> +do { \
> +    (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
> +    StoreInvalidTransactionId(&(tup)->t_xmax); \
> +} while (0)
>
>  #define HeapTupleHeaderSetCmin(tup, cid) \
> -( \
> -    AssertMacro(!((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF))), \
> -    (tup)->t_cmin = (cid) \
> -)
> +do { \
> +    Assert(!((tup)->t_infomask & HEAP_MOVED)); \
> +    TransactionIdStore((TransactionId) (cid), &(tup)->t_cid); \
> +} while (0)
>
>  #define HeapTupleHeaderSetCmax(tup, cid) \
> -    ((tup)->t_cmax = (cid))
> +do { \
> +    Assert(!((tup)->t_infomask & HEAP_MOVED)); \
> +    if ((tup)->t_infomask & HEAP_XMIN_IS_XMAX) \
> +        TransactionIdStore((TransactionId) (cid), &(tup)->t_xmax); \
> +    else \
> +        TransactionIdStore((TransactionId) (cid), &(tup)->t_cid); \
> +} while (0)
>
>  #define HeapTupleHeaderSetXvac(tup, xid) \
> -( \
> -    AssertMacro((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF)), \
> -    TransactionIdStore((xid), (TransactionId *) &((tup)->t_cmin)) \
> -)
> +do { \
> +    Assert((tup)->t_infomask & HEAP_MOVED); \
> +    TransactionIdStore((xid), &(tup)->t_cid); \
> +} while (0)
>
>
>  /*
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Dependency / Constraint patch
Next
From: Tom Lane
Date:
Subject: Re: Reduce heap tuple header size