Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9df8ced

Browse files
author
Hiroshi Inoue
committed
Improve the treatment of partial(incomplete) blocks of relation files.
This may solve a TODO item* Recover or force failure when disk space is exhausted
1 parent66fbea5 commit9df8ced

File tree

1 file changed

+22
-5
lines changed
  • src/backend/storage/smgr

1 file changed

+22
-5
lines changed

‎src/backend/storage/smgr/md.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.55 1999/09/28 11:41:07 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.56 1999/10/06 06:38:04 inoue Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -233,7 +233,7 @@ mdunlink(Relation reln)
233233
int
234234
mdextend(Relationreln,char*buffer)
235235
{
236-
longpos;
236+
longpos,nbytes;
237237
intnblocks;
238238
MdfdVec*v;
239239

@@ -243,8 +243,22 @@ mdextend(Relation reln, char *buffer)
243243
if ((pos=FileSeek(v->mdfd_vfd,0L,SEEK_END))<0)
244244
returnSM_FAIL;
245245

246-
if (FileWrite(v->mdfd_vfd,buffer,BLCKSZ)!=BLCKSZ)
246+
if (pos %BLCKSZ!=0)/* the last block is incomplete */
247+
{
248+
pos-=pos %BLCKSZ;
249+
if (FileSeek(v->mdfd_vfd,pos,SEEK_SET)<0)
250+
returnSM_FAIL;
251+
}
252+
253+
if ((nbytes=FileWrite(v->mdfd_vfd,buffer,BLCKSZ))!=BLCKSZ)
254+
{
255+
if (nbytes>0)
256+
{
257+
FileTruncate(v->mdfd_vfd,pos);
258+
FileSeek(v->mdfd_vfd,pos,SEEK_SET);
259+
}
247260
returnSM_FAIL;
261+
}
248262

249263
/* remember that we did a write, so we can sync at xact commit */
250264
v->mdfd_flags |=MDFD_DIRTY;
@@ -432,6 +446,8 @@ mdread(Relation reln, BlockNumber blocknum, char *buffer)
432446
{
433447
if (nbytes==0)
434448
MemSet(buffer,0,BLCKSZ);
449+
elseif (blocknum==0&&nbytes>0&&mdnblocks(reln)==0)
450+
MemSet(buffer,0,BLCKSZ);
435451
else
436452
status=SM_FAIL;
437453
}
@@ -1067,6 +1083,7 @@ _mdnblocks(File file, Size blcksz)
10671083
{
10681084
longlen;
10691085

1070-
len=FileSeek(file,0L,SEEK_END)-1;
1071-
return (BlockNumber) ((len<0) ?0 :1+len /blcksz);
1086+
len=FileSeek(file,0L,SEEK_END);
1087+
if (len<0)return0;/* on failure, assume file is empty */
1088+
return (BlockNumber) (len /blcksz);
10721089
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp