Re: [HACKERS] [CURRENT] large object fix

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: [HACKERS] [CURRENT] large object fix
Дата
Msg-id 199903141607.LAA20368@candle.pha.pa.us
обсуждение исходный текст
Ответ на [CURRENT] large object fix  (Tatsuo Ishii <t-ishii@sra.co.jp>)
Список pgsql-hackers
Applied.



> >>To Bruce:
> >>Thanks for taking care of my previous patches for current.  If
> >>included patch is ok, I will make one for current.
> >
> >Now I'm working on lobj in current tree(Currently lobj in 6.5 seems
> >broken).
> 
> Done. 
> 
> o overwriting an existing lobj now works
> o 8KB garbage block always inserted problem is fixed
> 
> --
> Tatsuo Ishii
> --------------------------- cut here ---------------------------------
> *** pgsql/src/backend/storage/large_object/inv_api.c.orig    Wed Feb 24 12:45:24 1999
> --- pgsql/src/backend/storage/large_object/inv_api.c    Thu Feb 25 15:58:10 1999
> ***************
> *** 72,78 ****
>    *        For subsequent notes, [PA] is Pascal Andr,Ai(B <andre@via.ecp.fr>
>    */
>   
> ! #define IFREESPC(p)        (PageGetFreeSpace(p) - sizeof(HeapTupleData) - sizeof(struct varlena) - sizeof(int32))
>   #define IMAXBLK            8092
>   #define IMINBLK            512
>   
> --- 72,81 ----
>    *        For subsequent notes, [PA] is Pascal Andr,Ai(B <andre@via.ecp.fr>
>    */
>   
> ! #define IFREESPC(p)        (PageGetFreeSpace(p) - \
> !                  DOUBLEALIGN(offsetof(HeapTupleHeaderData,t_bits)) - \
> !                  DOUBLEALIGN(sizeof(struct varlena) + sizeof(int32)) - \
> !                  sizeof(double))
>   #define IMAXBLK            8092
>   #define IMINBLK            512
>   
> ***************
> *** 623,646 ****
>           || obj_desc->offset < obj_desc->lowbyte
>           || !ItemPointerIsValid(&(obj_desc->htid)))
>       {
>   
>           /* initialize scan key if not done */
>           if (obj_desc->iscan == (IndexScanDesc) NULL)
>           {
> -             ScanKeyData skey;
> - 
>               /*
>                * As scan index may be prematurely closed (on commit), we
>                * must use object current offset (was 0) to reinitialize the
>                * entry [ PA ].
>                */
> -             ScanKeyEntryInitialize(&skey, 0x0, 1, F_INT4GE,
> -                                    Int32GetDatum(obj_desc->offset));
>               obj_desc->iscan = index_beginscan(obj_desc->index_r,
>                                   (bool) 0, (uint16) 1,
>                                   &skey);
> !         }
> ! 
>           do
>           {
>               res = index_getnext(obj_desc->iscan, ForwardScanDirection);
> --- 626,650 ----
>           || obj_desc->offset < obj_desc->lowbyte
>           || !ItemPointerIsValid(&(obj_desc->htid)))
>       {
> +          ScanKeyData skey;
> + 
> +         ScanKeyEntryInitialize(&skey, 0x0, 1, F_INT4GE,
> +                        Int32GetDatum(obj_desc->offset));
>   
>           /* initialize scan key if not done */
>           if (obj_desc->iscan == (IndexScanDesc) NULL)
>           {
>               /*
>                * As scan index may be prematurely closed (on commit), we
>                * must use object current offset (was 0) to reinitialize the
>                * entry [ PA ].
>                */
>               obj_desc->iscan = index_beginscan(obj_desc->index_r,
>                                   (bool) 0, (uint16) 1,
>                                   &skey);
> !         } else {
> !              index_rescan(obj_desc->iscan, false, &skey);
> !             }
>           do
>           {
>               res = index_getnext(obj_desc->iscan, ForwardScanDirection);
> ***************
> *** 673,678 ****
> --- 677,685 ----
>       {
>           tuple->t_self = obj_desc->htid;
>           heap_fetch(obj_desc->heap_r, SnapshotNow, tuple, buffer);
> +          if (tuple->t_data == NULL) {
> +             elog(ERROR, "inv_fetchtup: heap_fetch failed");
> +          }
>       }
>   
>       /*
> ***************
> *** 744,755 ****
>   
>       nblocks = RelationGetNumberOfBlocks(hr);
>   
> !     if (nblocks > 0)
>           buffer = ReadBuffer(hr, nblocks - 1);
> !     else
>           buffer = ReadBuffer(hr, P_NEW);
> ! 
> !     page = BufferGetPage(buffer);
>   
>       /*
>        * If the last page is too small to hold all the data, and it's too
> --- 751,765 ----
>   
>       nblocks = RelationGetNumberOfBlocks(hr);
>   
> !     if (nblocks > 0) {
>           buffer = ReadBuffer(hr, nblocks - 1);
> !         page = BufferGetPage(buffer);
> !     }
> !     else {
>           buffer = ReadBuffer(hr, P_NEW);
> !         page = BufferGetPage(buffer);
> !         PageInit(page, BufferGetPageSize(buffer), 0);
> !     }
>   
>       /*
>        * If the last page is too small to hold all the data, and it's too
> ***************
> *** 864,875 ****
>   
>           nblocks = RelationGetNumberOfBlocks(hr);
>   
> !         if (nblocks > 0)
>               newbuf = ReadBuffer(hr, nblocks - 1);
> !         else
>               newbuf = ReadBuffer(hr, P_NEW);
>   
> -         newpage = BufferGetPage(newbuf);
>           freespc = IFREESPC(newpage);
>   
>           /*
> --- 874,889 ----
>   
>           nblocks = RelationGetNumberOfBlocks(hr);
>   
> !         if (nblocks > 0) {
>               newbuf = ReadBuffer(hr, nblocks - 1);
> !             newpage = BufferGetPage(newbuf);
> !         }
> !         else {
>               newbuf = ReadBuffer(hr, P_NEW);
> +             newpage = BufferGetPage(newbuf);
> +             PageInit(newpage, BufferGetPageSize(newbuf), 0);
> +         }
>   
>           freespc = IFREESPC(newpage);
>   
>           /*
> ***************
> *** 973,978 ****
> --- 987,995 ----
>       WriteBuffer(buffer);
>       if (newbuf != buffer)
>           WriteBuffer(newbuf);
> + 
> +     /* Tuple id is no longer valid */
> +     ItemPointerSetInvalid(&(obj_desc->htid));
>   
>       /* done */
>       return nwritten;
> 
> 


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


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: [PATCHES] [CURRENT] NetBSD/macppc porting patch
Следующее
От: Bruce Momjian
Дата:
Сообщение: Re: [HACKERS] KTH-KRB kerberos 4 patch