Re: [HACKERS] [CURRENT] large object fix

From: Bruce Momjian <maillist(at)candle(dot)pha(dot)pa(dot)us>
To: t-ishii(at)sra(dot)co(dot)jp
Cc: pgsql-patches(at)postgreSQL(dot)org, hackers(at)postgreSQL(dot)org
Subject: Re: [HACKERS] [CURRENT] large object fix
Date: 1999-03-14 16:07:59
Message-ID: 199903141607.LAA20368@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)via(dot)ecp(dot)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(at)via(dot)ecp(dot)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(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 1999-03-14 16:42:13 Re: [HACKERS] libpq and SPI
Previous Message Bruce Momjian 1999-03-14 16:06:41 Re: [HACKERS] KTH-KRB kerberos 4 patch