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