Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0591bbd

Browse files
committed
Patch to allow vacuum on multi-segment tables, from Hiroshi Inoue
1 parent 8c3a796 commit 0591bbd

File tree

1 file changed

+46
-12
lines changed
  • src/backend/storage/smgr

1 file changed

+46
-12
lines changed

src/backend/storage/smgr/md.c

+46-12
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.45 1999/06/11 02:39:43 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.46 1999/06/18 16:47:23 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -674,11 +674,12 @@ mdnblocks(Relation reln)
674674
segno = 0;
675675
for (;;)
676676
{
677-
if (v->mdfd_lstbcnt == RELSEG_SIZE
678-
|| (nblocks = _mdnblocks(v->mdfd_vfd, BLCKSZ)) == RELSEG_SIZE)
677+
nblocks = _mdnblocks(v->mdfd_vfd, BLCKSZ);
678+
if (nblocks > RELSEG_SIZE)
679+
elog(FATAL, "segment too big in mdnblocks!");
680+
v->mdfd_lstbcnt = nblocks;
681+
if (nblocks == RELSEG_SIZE)
679682
{
680-
681-
v->mdfd_lstbcnt = RELSEG_SIZE;
682683
segno++;
683684

684685
if (v->mdfd_chain == (MdfdVec *) NULL)
@@ -711,22 +712,55 @@ mdtruncate(Relation reln, int nblocks)
711712
MdfdVec *v;
712713

713714
#ifndef LET_OS_MANAGE_FILESIZE
714-
int curnblk;
715+
int curnblk,
716+
i,
717+
oldsegno,
718+
newsegno,
719+
lastsegblocks;
720+
MdfdVec **varray;
715721

716722
curnblk = mdnblocks(reln);
717-
if (curnblk / RELSEG_SIZE > 0)
718-
{
719-
elog(NOTICE, "Can't truncate multi-segments relation %s",
720-
reln->rd_rel->relname.data);
721-
return curnblk;
722-
}
723+
if (nblocks > curnblk)
724+
return -1;
725+
oldsegno = curnblk / RELSEG_SIZE;
726+
newsegno = nblocks / RELSEG_SIZE;
727+
723728
#endif
724729

725730
fd = RelationGetFile(reln);
726731
v = &Md_fdvec[fd];
727732

733+
#ifndef LET_OS_MANAGE_FILESIZE
734+
varray = (MdfdVec **)palloc((oldsegno + 1) * sizeof(MdfdVec *));
735+
for (i = 0; i <= oldsegno; i++)
736+
{
737+
if (!v)
738+
elog(ERROR,"segment isn't open in mdtruncate!");
739+
varray[i] = v;
740+
v = v->mdfd_chain;
741+
}
742+
for (i = oldsegno; i > newsegno; i--)
743+
{
744+
v = varray[i];
745+
if (FileTruncate(v->mdfd_vfd, 0) < 0)
746+
{
747+
pfree(varray);
748+
return -1;
749+
}
750+
v->mdfd_lstbcnt = 0;
751+
}
752+
/* Calculate the # of blocks in the last segment */
753+
lastsegblocks = nblocks - (newsegno * RELSEG_SIZE);
754+
v = varray[i];
755+
pfree(varray);
756+
if (FileTruncate(v->mdfd_vfd, lastsegblocks * BLCKSZ) < 0)
757+
return -1;
758+
v->mdfd_lstbcnt = lastsegblocks;
759+
#else
728760
if (FileTruncate(v->mdfd_vfd, nblocks * BLCKSZ) < 0)
729761
return -1;
762+
v->mdfd_lstbcnt = nblocks;
763+
#endif
730764

731765
return nblocks;
732766

0 commit comments

Comments
 (0)