Обсуждение: WriteBuffer return value
Fix WriteBuffer() to return STATUS_OK/STATUS_ERROR instead of
TRUE/FALSE. The return value is used by nextval() and do_setval()
in sequence.c, all other callers ignore the return value.
diff -ur ../orig/src/backend/storage/buffer/bufmgr.c src/backend/storage/buffer/bufmgr.c
--- ../orig/src/backend/storage/buffer/bufmgr.c 2002-06-10 15:00:57.000000000 +0200
+++ src/backend/storage/buffer/bufmgr.c 2002-06-11 17:42:26.000000000 +0200
@@ -580,7 +580,7 @@
return WriteLocalBuffer(buffer, TRUE);
if (BAD_BUFFER_ID(buffer))
- return FALSE;
+ return STATUS_ERROR;
bufHdr = &BufferDescriptors[buffer - 1];
@@ -592,7 +592,7 @@
UnpinBuffer(bufHdr);
LWLockRelease(BufMgrLock);
- return TRUE;
+ return STATUS_OK;
}
/*
Manfred Koizar <mkoi-pg@aon.at> writes:
> Fix WriteBuffer() to return STATUS_OK/STATUS_ERROR instead of
> TRUE/FALSE. The return value is used by nextval() and do_setval()
> in sequence.c, all other callers ignore the return value.
Given the lack of any error checks in 99% of the callers, I do not think
this is an appropriate change. I'd vote for changing WriteBuffer to
return void, and have it elog() on bad argument. No one should ever
pass it a bogus buffer ID anyway --- if you don't have a valid buffer
ID, then what the heck were you just scribbling on?
regards, tom lane
On Wed, 12 Jun 2002 10:19:17 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>I'd vote for changing WriteBuffer to
>return void, and have it elog() on bad argument.
Whatever you want ...
BTW, to avoid rejected hunks this patch should be applied after the
EliminateUnused patch I posted 2002-06-10.
diff -ur ../orig/src/backend/commands/sequence.c src/backend/commands/sequence.c
--- ../orig/src/backend/commands/sequence.c 2002-06-10 15:40:46.000000000 +0200
+++ src/backend/commands/sequence.c 2002-06-13 09:32:25.000000000 +0200
@@ -468,8 +468,7 @@
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
- if (WriteBuffer(buf) == STATUS_ERROR)
- elog(ERROR, "%s.nextval: WriteBuffer failed", sequence->relname);
+ WriteBuffer(buf);
relation_close(seqrel, NoLock);
@@ -581,8 +580,7 @@
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
- if (WriteBuffer(buf) == STATUS_ERROR)
- elog(ERROR, "%s.setval: WriteBuffer failed", sequence->relname);
+ WriteBuffer(buf);
relation_close(seqrel, NoLock);
}
diff -ur ../orig/src/backend/storage/buffer/bufmgr.c src/backend/storage/buffer/bufmgr.c
--- ../orig/src/backend/storage/buffer/bufmgr.c 2002-06-10 15:00:57.000000000 +0200
+++ src/backend/storage/buffer/bufmgr.c 2002-06-13 09:32:40.000000000 +0200
@@ -87,6 +87,7 @@
static int BufferReplace(BufferDesc *bufHdr);
void PrintBufferDescs(void);
+static void write_buffer(Buffer buffer, bool unpin);
/*
* ReadBuffer -- returns a buffer containing the requested
@@ -558,29 +559,22 @@
}
/*
- * WriteBuffer
- *
- * Marks buffer contents as dirty (actual write happens later).
- *
- * Assume that buffer is pinned. Assume that reln is
- * valid.
- *
- * Side Effects:
- * Pin count is decremented.
+ * write_buffer -- common functionality for
+ * WriteBuffer and WriteNoReleaseBuffer
*/
-
-#undef WriteBuffer
-
-int
-WriteBuffer(Buffer buffer)
+static void
+write_buffer(Buffer buffer, bool release)
{
BufferDesc *bufHdr;
if (BufferIsLocal(buffer))
- return WriteLocalBuffer(buffer, TRUE);
+ {
+ WriteLocalBuffer(buffer, release);
+ return;
+ }
if (BAD_BUFFER_ID(buffer))
- return FALSE;
+ elog(ERROR, "write_buffer: bad buffer %d", buffer);
bufHdr = &BufferDescriptors[buffer - 1];
@@ -589,37 +583,39 @@
bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
- UnpinBuffer(bufHdr);
+ if (release)
+ UnpinBuffer(bufHdr);
LWLockRelease(BufMgrLock);
+}
- return TRUE;
+/*
+ * WriteBuffer
+ *
+ * Marks buffer contents as dirty (actual write happens later).
+ *
+ * Assume that buffer is pinned. Assume that reln is
+ * valid.
+ *
+ * Side Effects:
+ * Pin count is decremented.
+ */
+
+#undef WriteBuffer
+
+void
+WriteBuffer(Buffer buffer)
+{
+ write_buffer(buffer, true);
}
/*
* WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
* when the operation is complete.
*/
-int
+void
WriteNoReleaseBuffer(Buffer buffer)
{
- BufferDesc *bufHdr;
-
- if (BufferIsLocal(buffer))
- return WriteLocalBuffer(buffer, FALSE);
-
- if (BAD_BUFFER_ID(buffer))
- return STATUS_ERROR;
-
- bufHdr = &BufferDescriptors[buffer - 1];
-
- LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
- Assert(bufHdr->refcount > 0);
-
- bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
-
- LWLockRelease(BufMgrLock);
-
- return STATUS_OK;
+ write_buffer(buffer, false);
}
diff -ur ../orig/src/backend/storage/buffer/localbuf.c src/backend/storage/buffer/localbuf.c
--- ../orig/src/backend/storage/buffer/localbuf.c 2002-05-03 19:42:11.000000000 +0200
+++ src/backend/storage/buffer/localbuf.c 2002-06-13 09:23:56.000000000 +0200
@@ -155,7 +155,7 @@
* WriteLocalBuffer -
* writes out a local buffer
*/
-int
+void
WriteLocalBuffer(Buffer buffer, bool release)
{
int bufid;
@@ -174,8 +174,6 @@
Assert(LocalRefCount[bufid] > 0);
LocalRefCount[bufid]--;
}
-
- return true;
}
/*
diff -ur ../orig/src/include/storage/buf_internals.h src/include/storage/buf_internals.h
--- ../orig/src/include/storage/buf_internals.h 2002-06-10 15:03:44.000000000 +0200
+++ src/include/storage/buf_internals.h 2002-06-13 09:23:26.000000000 +0200
@@ -176,7 +176,7 @@
extern BufferDesc *LocalBufferAlloc(Relation reln, BlockNumber blockNum,
bool *foundPtr);
-extern int WriteLocalBuffer(Buffer buffer, bool release);
+extern void WriteLocalBuffer(Buffer buffer, bool release);
extern int FlushLocalBuffer(Buffer buffer, bool sync, bool release);
extern void LocalBufferSync(void);
extern void ResetLocalBufferPool(void);
diff -ur ../orig/src/include/storage/bufmgr.h src/include/storage/bufmgr.h
--- ../orig/src/include/storage/bufmgr.h 2002-04-16 01:47:12.000000000 +0200
+++ src/include/storage/bufmgr.h 2002-06-13 09:22:59.000000000 +0200
@@ -148,8 +148,8 @@
*/
extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
extern int ReleaseBuffer(Buffer buffer);
-extern int WriteBuffer(Buffer buffer);
-extern int WriteNoReleaseBuffer(Buffer buffer);
+extern void WriteBuffer(Buffer buffer);
+extern void WriteNoReleaseBuffer(Buffer buffer);
extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
BlockNumber blockNum);
extern int FlushBuffer(Buffer buffer, bool sync, bool release);
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:
> On Wed, 12 Jun 2002 10:19:17 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >I'd vote for changing WriteBuffer to
> >return void, and have it elog() on bad argument.
>
> Whatever you want ...
> BTW, to avoid rejected hunks this patch should be applied after the
> EliminateUnused patch I posted 2002-06-10.
>
> diff -ur ../orig/src/backend/commands/sequence.c src/backend/commands/sequence.c
> --- ../orig/src/backend/commands/sequence.c 2002-06-10 15:40:46.000000000 +0200
> +++ src/backend/commands/sequence.c 2002-06-13 09:32:25.000000000 +0200
> @@ -468,8 +468,7 @@
>
> LockBuffer(buf, BUFFER_LOCK_UNLOCK);
>
> - if (WriteBuffer(buf) == STATUS_ERROR)
> - elog(ERROR, "%s.nextval: WriteBuffer failed", sequence->relname);
> + WriteBuffer(buf);
>
> relation_close(seqrel, NoLock);
>
> @@ -581,8 +580,7 @@
>
> LockBuffer(buf, BUFFER_LOCK_UNLOCK);
>
> - if (WriteBuffer(buf) == STATUS_ERROR)
> - elog(ERROR, "%s.setval: WriteBuffer failed", sequence->relname);
> + WriteBuffer(buf);
>
> relation_close(seqrel, NoLock);
> }
> diff -ur ../orig/src/backend/storage/buffer/bufmgr.c src/backend/storage/buffer/bufmgr.c
> --- ../orig/src/backend/storage/buffer/bufmgr.c 2002-06-10 15:00:57.000000000 +0200
> +++ src/backend/storage/buffer/bufmgr.c 2002-06-13 09:32:40.000000000 +0200
> @@ -87,6 +87,7 @@
> static int BufferReplace(BufferDesc *bufHdr);
> void PrintBufferDescs(void);
>
> +static void write_buffer(Buffer buffer, bool unpin);
>
> /*
> * ReadBuffer -- returns a buffer containing the requested
> @@ -558,29 +559,22 @@
> }
>
> /*
> - * WriteBuffer
> - *
> - * Marks buffer contents as dirty (actual write happens later).
> - *
> - * Assume that buffer is pinned. Assume that reln is
> - * valid.
> - *
> - * Side Effects:
> - * Pin count is decremented.
> + * write_buffer -- common functionality for
> + * WriteBuffer and WriteNoReleaseBuffer
> */
> -
> -#undef WriteBuffer
> -
> -int
> -WriteBuffer(Buffer buffer)
> +static void
> +write_buffer(Buffer buffer, bool release)
> {
> BufferDesc *bufHdr;
>
> if (BufferIsLocal(buffer))
> - return WriteLocalBuffer(buffer, TRUE);
> + {
> + WriteLocalBuffer(buffer, release);
> + return;
> + }
>
> if (BAD_BUFFER_ID(buffer))
> - return FALSE;
> + elog(ERROR, "write_buffer: bad buffer %d", buffer);
>
> bufHdr = &BufferDescriptors[buffer - 1];
>
> @@ -589,37 +583,39 @@
>
> bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
>
> - UnpinBuffer(bufHdr);
> + if (release)
> + UnpinBuffer(bufHdr);
> LWLockRelease(BufMgrLock);
> +}
>
> - return TRUE;
> +/*
> + * WriteBuffer
> + *
> + * Marks buffer contents as dirty (actual write happens later).
> + *
> + * Assume that buffer is pinned. Assume that reln is
> + * valid.
> + *
> + * Side Effects:
> + * Pin count is decremented.
> + */
> +
> +#undef WriteBuffer
> +
> +void
> +WriteBuffer(Buffer buffer)
> +{
> + write_buffer(buffer, true);
> }
>
> /*
> * WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
> * when the operation is complete.
> */
> -int
> +void
> WriteNoReleaseBuffer(Buffer buffer)
> {
> - BufferDesc *bufHdr;
> -
> - if (BufferIsLocal(buffer))
> - return WriteLocalBuffer(buffer, FALSE);
> -
> - if (BAD_BUFFER_ID(buffer))
> - return STATUS_ERROR;
> -
> - bufHdr = &BufferDescriptors[buffer - 1];
> -
> - LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
> - Assert(bufHdr->refcount > 0);
> -
> - bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
> -
> - LWLockRelease(BufMgrLock);
> -
> - return STATUS_OK;
> + write_buffer(buffer, false);
> }
>
>
> diff -ur ../orig/src/backend/storage/buffer/localbuf.c src/backend/storage/buffer/localbuf.c
> --- ../orig/src/backend/storage/buffer/localbuf.c 2002-05-03 19:42:11.000000000 +0200
> +++ src/backend/storage/buffer/localbuf.c 2002-06-13 09:23:56.000000000 +0200
> @@ -155,7 +155,7 @@
> * WriteLocalBuffer -
> * writes out a local buffer
> */
> -int
> +void
> WriteLocalBuffer(Buffer buffer, bool release)
> {
> int bufid;
> @@ -174,8 +174,6 @@
> Assert(LocalRefCount[bufid] > 0);
> LocalRefCount[bufid]--;
> }
> -
> - return true;
> }
>
> /*
> diff -ur ../orig/src/include/storage/buf_internals.h src/include/storage/buf_internals.h
> --- ../orig/src/include/storage/buf_internals.h 2002-06-10 15:03:44.000000000 +0200
> +++ src/include/storage/buf_internals.h 2002-06-13 09:23:26.000000000 +0200
> @@ -176,7 +176,7 @@
>
> extern BufferDesc *LocalBufferAlloc(Relation reln, BlockNumber blockNum,
> bool *foundPtr);
> -extern int WriteLocalBuffer(Buffer buffer, bool release);
> +extern void WriteLocalBuffer(Buffer buffer, bool release);
> extern int FlushLocalBuffer(Buffer buffer, bool sync, bool release);
> extern void LocalBufferSync(void);
> extern void ResetLocalBufferPool(void);
> diff -ur ../orig/src/include/storage/bufmgr.h src/include/storage/bufmgr.h
> --- ../orig/src/include/storage/bufmgr.h 2002-04-16 01:47:12.000000000 +0200
> +++ src/include/storage/bufmgr.h 2002-06-13 09:22:59.000000000 +0200
> @@ -148,8 +148,8 @@
> */
> extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
> extern int ReleaseBuffer(Buffer buffer);
> -extern int WriteBuffer(Buffer buffer);
> -extern int WriteNoReleaseBuffer(Buffer buffer);
> +extern void WriteBuffer(Buffer buffer);
> +extern void WriteNoReleaseBuffer(Buffer buffer);
> extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
> BlockNumber blockNum);
> extern int FlushBuffer(Buffer buffer, bool sync, bool release);
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
--
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
Patch applied. Thanks.
---------------------------------------------------------------------------
Manfred Koizar wrote:
> On Wed, 12 Jun 2002 10:19:17 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >I'd vote for changing WriteBuffer to
> >return void, and have it elog() on bad argument.
>
> Whatever you want ...
> BTW, to avoid rejected hunks this patch should be applied after the
> EliminateUnused patch I posted 2002-06-10.
>
> diff -ur ../orig/src/backend/commands/sequence.c src/backend/commands/sequence.c
> --- ../orig/src/backend/commands/sequence.c 2002-06-10 15:40:46.000000000 +0200
> +++ src/backend/commands/sequence.c 2002-06-13 09:32:25.000000000 +0200
> @@ -468,8 +468,7 @@
>
> LockBuffer(buf, BUFFER_LOCK_UNLOCK);
>
> - if (WriteBuffer(buf) == STATUS_ERROR)
> - elog(ERROR, "%s.nextval: WriteBuffer failed", sequence->relname);
> + WriteBuffer(buf);
>
> relation_close(seqrel, NoLock);
>
> @@ -581,8 +580,7 @@
>
> LockBuffer(buf, BUFFER_LOCK_UNLOCK);
>
> - if (WriteBuffer(buf) == STATUS_ERROR)
> - elog(ERROR, "%s.setval: WriteBuffer failed", sequence->relname);
> + WriteBuffer(buf);
>
> relation_close(seqrel, NoLock);
> }
> diff -ur ../orig/src/backend/storage/buffer/bufmgr.c src/backend/storage/buffer/bufmgr.c
> --- ../orig/src/backend/storage/buffer/bufmgr.c 2002-06-10 15:00:57.000000000 +0200
> +++ src/backend/storage/buffer/bufmgr.c 2002-06-13 09:32:40.000000000 +0200
> @@ -87,6 +87,7 @@
> static int BufferReplace(BufferDesc *bufHdr);
> void PrintBufferDescs(void);
>
> +static void write_buffer(Buffer buffer, bool unpin);
>
> /*
> * ReadBuffer -- returns a buffer containing the requested
> @@ -558,29 +559,22 @@
> }
>
> /*
> - * WriteBuffer
> - *
> - * Marks buffer contents as dirty (actual write happens later).
> - *
> - * Assume that buffer is pinned. Assume that reln is
> - * valid.
> - *
> - * Side Effects:
> - * Pin count is decremented.
> + * write_buffer -- common functionality for
> + * WriteBuffer and WriteNoReleaseBuffer
> */
> -
> -#undef WriteBuffer
> -
> -int
> -WriteBuffer(Buffer buffer)
> +static void
> +write_buffer(Buffer buffer, bool release)
> {
> BufferDesc *bufHdr;
>
> if (BufferIsLocal(buffer))
> - return WriteLocalBuffer(buffer, TRUE);
> + {
> + WriteLocalBuffer(buffer, release);
> + return;
> + }
>
> if (BAD_BUFFER_ID(buffer))
> - return FALSE;
> + elog(ERROR, "write_buffer: bad buffer %d", buffer);
>
> bufHdr = &BufferDescriptors[buffer - 1];
>
> @@ -589,37 +583,39 @@
>
> bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
>
> - UnpinBuffer(bufHdr);
> + if (release)
> + UnpinBuffer(bufHdr);
> LWLockRelease(BufMgrLock);
> +}
>
> - return TRUE;
> +/*
> + * WriteBuffer
> + *
> + * Marks buffer contents as dirty (actual write happens later).
> + *
> + * Assume that buffer is pinned. Assume that reln is
> + * valid.
> + *
> + * Side Effects:
> + * Pin count is decremented.
> + */
> +
> +#undef WriteBuffer
> +
> +void
> +WriteBuffer(Buffer buffer)
> +{
> + write_buffer(buffer, true);
> }
>
> /*
> * WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
> * when the operation is complete.
> */
> -int
> +void
> WriteNoReleaseBuffer(Buffer buffer)
> {
> - BufferDesc *bufHdr;
> -
> - if (BufferIsLocal(buffer))
> - return WriteLocalBuffer(buffer, FALSE);
> -
> - if (BAD_BUFFER_ID(buffer))
> - return STATUS_ERROR;
> -
> - bufHdr = &BufferDescriptors[buffer - 1];
> -
> - LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
> - Assert(bufHdr->refcount > 0);
> -
> - bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
> -
> - LWLockRelease(BufMgrLock);
> -
> - return STATUS_OK;
> + write_buffer(buffer, false);
> }
>
>
> diff -ur ../orig/src/backend/storage/buffer/localbuf.c src/backend/storage/buffer/localbuf.c
> --- ../orig/src/backend/storage/buffer/localbuf.c 2002-05-03 19:42:11.000000000 +0200
> +++ src/backend/storage/buffer/localbuf.c 2002-06-13 09:23:56.000000000 +0200
> @@ -155,7 +155,7 @@
> * WriteLocalBuffer -
> * writes out a local buffer
> */
> -int
> +void
> WriteLocalBuffer(Buffer buffer, bool release)
> {
> int bufid;
> @@ -174,8 +174,6 @@
> Assert(LocalRefCount[bufid] > 0);
> LocalRefCount[bufid]--;
> }
> -
> - return true;
> }
>
> /*
> diff -ur ../orig/src/include/storage/buf_internals.h src/include/storage/buf_internals.h
> --- ../orig/src/include/storage/buf_internals.h 2002-06-10 15:03:44.000000000 +0200
> +++ src/include/storage/buf_internals.h 2002-06-13 09:23:26.000000000 +0200
> @@ -176,7 +176,7 @@
>
> extern BufferDesc *LocalBufferAlloc(Relation reln, BlockNumber blockNum,
> bool *foundPtr);
> -extern int WriteLocalBuffer(Buffer buffer, bool release);
> +extern void WriteLocalBuffer(Buffer buffer, bool release);
> extern int FlushLocalBuffer(Buffer buffer, bool sync, bool release);
> extern void LocalBufferSync(void);
> extern void ResetLocalBufferPool(void);
> diff -ur ../orig/src/include/storage/bufmgr.h src/include/storage/bufmgr.h
> --- ../orig/src/include/storage/bufmgr.h 2002-04-16 01:47:12.000000000 +0200
> +++ src/include/storage/bufmgr.h 2002-06-13 09:22:59.000000000 +0200
> @@ -148,8 +148,8 @@
> */
> extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
> extern int ReleaseBuffer(Buffer buffer);
> -extern int WriteBuffer(Buffer buffer);
> -extern int WriteNoReleaseBuffer(Buffer buffer);
> +extern void WriteBuffer(Buffer buffer);
> +extern void WriteNoReleaseBuffer(Buffer buffer);
> extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
> BlockNumber blockNum);
> extern int FlushBuffer(Buffer buffer, bool sync, bool release);
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
--
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