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

Commit2961c97

Browse files
committed
Assorted cleanup of tar-related code.
Introduce TAR_BLOCK_SIZE and replace many instances of 512 withthe new constant. Introduce function tarPaddingBytesRequiredand use it to replace numerous repetitions of (x + 511) & ~511.Add preprocessor guards against multiple inclusion to pgtar.h.Reformat the prototype for tarCreateHeader so it doesn't extendbeyond 80 characters.Discussion:http://postgr.es/m/CA+TgmobWbfReO9-XFk8urR1K4wTNwqoHx_v56t7=T8KaiEoKNw@mail.gmail.com
1 parente532b1d commit2961c97

File tree

5 files changed

+94
-59
lines changed

5 files changed

+94
-59
lines changed

‎src/backend/replication/basebackup.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,11 @@ perform_base_backup(basebackup_options *opt)
665665
errmsg("unexpected WAL file size \"%s\"",walFileName)));
666666
}
667667

668-
/* wal_segment_size is a multiple of 512, so no need for padding */
668+
/*
669+
* wal_segment_size is a multiple of TAR_BLOCK_SIZE, so no need
670+
* for padding.
671+
*/
672+
Assert(wal_segment_size %TAR_BLOCK_SIZE==0);
669673

670674
FreeFile(fp);
671675

@@ -1118,11 +1122,11 @@ sendFileWithContent(const char *filename, const char *content,
11181122
pq_putmessage('d',content,len);
11191123
update_basebackup_progress(len);
11201124

1121-
/* Pad to512 byte boundary, per tarformat requirements */
1122-
pad=((len+511)& ~511)-len;
1125+
/* Pad toa multiple of the tarblock size. */
1126+
pad=tarPaddingBytesRequired(len);
11231127
if (pad>0)
11241128
{
1125-
charbuf[512];
1129+
charbuf[TAR_BLOCK_SIZE];
11261130

11271131
MemSet(buf,0,pad);
11281132
pq_putmessage('d',buf,pad);
@@ -1491,9 +1495,14 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces,
14911495

14921496
if (sent||sizeonly)
14931497
{
1494-
/* Add size, rounded up to 512byte block */
1495-
size+= ((statbuf.st_size+511)& ~511);
1496-
size+=512;/* Size of the header of the file */
1498+
/* Add size. */
1499+
size+=statbuf.st_size;
1500+
1501+
/* Pad to a multiple of the tar block size. */
1502+
size+=tarPaddingBytesRequired(statbuf.st_size);
1503+
1504+
/* Size of the header for the file. */
1505+
size+=TAR_BLOCK_SIZE;
14971506
}
14981507
}
14991508
else
@@ -1784,11 +1793,11 @@ sendFile(const char *readfilename, const char *tarfilename,
17841793
}
17851794

17861795
/*
1787-
* Pad to512 byte boundary, per tar format requirements. (This small
1796+
* Pad toa block boundary, per tar format requirements. (This small
17881797
* piece of data is probably not worth throttling, and is not checksummed
17891798
* because it's not actually part of the file.)
17901799
*/
1791-
pad=((len+511)& ~511)-len;
1800+
pad=tarPaddingBytesRequired(len);
17921801
if (pad>0)
17931802
{
17941803
MemSet(buf,0,pad);
@@ -1822,7 +1831,7 @@ static int64
18221831
_tarWriteHeader(constchar*filename,constchar*linktarget,
18231832
structstat*statbuf,boolsizeonly)
18241833
{
1825-
charh[512];
1834+
charh[TAR_BLOCK_SIZE];
18261835
enumtarErrorrc;
18271836

18281837
if (!sizeonly)

‎src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ typedef struct WriteTarState
6262
inttablespacenum;
6363
charfilename[MAXPGPATH];
6464
FILE*tarfile;
65-
chartarhdr[512];
65+
chartarhdr[TAR_BLOCK_SIZE];
6666
boolbasetablespace;
6767
boolin_tarhdr;
6868
boolskip_file;
@@ -1024,7 +1024,7 @@ writeTarData(WriteTarState *state, char *buf, int r)
10241024
staticvoid
10251025
ReceiveTarFile(PGconn*conn,PGresult*res,intrownum)
10261026
{
1027-
charzerobuf[1024];
1027+
charzerobuf[TAR_BLOCK_SIZE*2];
10281028
WriteTarStatestate;
10291029

10301030
memset(&state,0,sizeof(state));
@@ -1169,7 +1169,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
11691169

11701170
if (state.basetablespace&&writerecoveryconf)
11711171
{
1172-
charheader[512];
1172+
charheader[TAR_BLOCK_SIZE];
11731173

11741174
/*
11751175
* If postgresql.auto.conf has not been found in the streamed data,
@@ -1188,7 +1188,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
11881188
pg_file_create_mode,04000,02000,
11891189
time(NULL));
11901190

1191-
padding=((recoveryconfcontents->len+511)& ~511)-recoveryconfcontents->len;
1191+
padding=tarPaddingBytesRequired(recoveryconfcontents->len);
11921192

11931193
writeTarData(&state,header,sizeof(header));
11941194
writeTarData(&state,recoveryconfcontents->data,
@@ -1224,7 +1224,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
12241224
*/
12251225
if (strcmp(basedir,"-")==0&&manifest)
12261226
{
1227-
charheader[512];
1227+
charheader[TAR_BLOCK_SIZE];
12281228
PQExpBufferDatabuf;
12291229

12301230
initPQExpBuffer(&buf);
@@ -1242,7 +1242,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
12421242
termPQExpBuffer(&buf);
12431243
}
12441244

1245-
/* 2 *512 bytes empty data at end of file */
1245+
/* 2 *TAR_BLOCK_SIZE bytes empty data at end of file */
12461246
writeTarData(&state,zerobuf,sizeof(zerobuf));
12471247

12481248
#ifdefHAVE_LIBZ
@@ -1303,9 +1303,9 @@ ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
13031303
*
13041304
* To do this, we have to process the individual files inside the TAR
13051305
* stream. The stream consists of a header and zero or more chunks,
1306-
*all 512 bytes long. The stream from the server is broken up into
1307-
* smaller pieces, so we have to track the size of the files to find
1308-
* the next header structure.
1306+
*each with a length equal to TAR_BLOCK_SIZE. The stream from the
1307+
*server is broken up intosmaller pieces, so we have to track the
1308+
*size of the files to findthe next header structure.
13091309
*/
13101310
intrr=r;
13111311
intpos=0;
@@ -1318,17 +1318,17 @@ ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
13181318
* We're currently reading a header structure inside the TAR
13191319
* stream, i.e. the file metadata.
13201320
*/
1321-
if (state->tarhdrsz<512)
1321+
if (state->tarhdrsz<TAR_BLOCK_SIZE)
13221322
{
13231323
/*
13241324
* Copy the header structure into tarhdr in case the
1325-
* header is not alignedto 512 bytesor it's not returned
1326-
*inwhole by the last PQgetCopyData call.
1325+
* header is not alignedproperlyor it's not returned in
1326+
* whole by the last PQgetCopyData call.
13271327
*/
13281328
inthdrleft;
13291329
intbytes2copy;
13301330

1331-
hdrleft=512-state->tarhdrsz;
1331+
hdrleft=TAR_BLOCK_SIZE-state->tarhdrsz;
13321332
bytes2copy= (rr>hdrleft ?hdrleft :rr);
13331333

13341334
memcpy(&state->tarhdr[state->tarhdrsz],copybuf+pos,
@@ -1361,14 +1361,14 @@ ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
13611361

13621362
state->filesz=read_tar_number(&state->tarhdr[124],12);
13631363
state->file_padding_len=
1364-
((state->filesz+511)& ~511)-state->filesz;
1364+
tarPaddingBytesRequired(state->filesz);
13651365

13661366
if (state->is_recovery_guc_supported&&
13671367
state->is_postgresql_auto_conf&&
13681368
writerecoveryconf)
13691369
{
13701370
/* replace tar header */
1371-
charheader[512];
1371+
charheader[TAR_BLOCK_SIZE];
13721372

13731373
tarCreateHeader(header,"postgresql.auto.conf",NULL,
13741374
state->filesz+recoveryconfcontents->len,
@@ -1388,7 +1388,7 @@ ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
13881388
* If we're not skipping the file, write the tar
13891389
* header unmodified.
13901390
*/
1391-
writeTarData(state,state->tarhdr,512);
1391+
writeTarData(state,state->tarhdr,TAR_BLOCK_SIZE);
13921392
}
13931393
}
13941394

@@ -1425,15 +1425,15 @@ ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
14251425
intpadding;
14261426
inttailsize;
14271427

1428-
tailsize= (512-state->file_padding_len)+recoveryconfcontents->len;
1429-
padding=((tailsize+511)& ~511)-tailsize;
1428+
tailsize= (TAR_BLOCK_SIZE-state->file_padding_len)+recoveryconfcontents->len;
1429+
padding=tarPaddingBytesRequired(tailsize);
14301430

14311431
writeTarData(state,recoveryconfcontents->data,
14321432
recoveryconfcontents->len);
14331433

14341434
if (padding)
14351435
{
1436-
charzerobuf[512];
1436+
charzerobuf[TAR_BLOCK_SIZE];
14371437

14381438
MemSet(zerobuf,0,sizeof(zerobuf));
14391439
writeTarData(state,zerobuf,padding);
@@ -1551,12 +1551,12 @@ ReceiveTarAndUnpackCopyChunk(size_t r, char *copybuf, void *callback_data)
15511551
/*
15521552
* No current file, so this must be the header for a new file
15531553
*/
1554-
if (r!=512)
1554+
if (r!=TAR_BLOCK_SIZE)
15551555
{
15561556
pg_log_error("invalid tar block header size: %zu",r);
15571557
exit(1);
15581558
}
1559-
totaldone+=512;
1559+
totaldone+=TAR_BLOCK_SIZE;
15601560

15611561
state->current_len_left=read_tar_number(&copybuf[124],12);
15621562

@@ -1566,10 +1566,10 @@ ReceiveTarAndUnpackCopyChunk(size_t r, char *copybuf, void *callback_data)
15661566
#endif
15671567

15681568
/*
1569-
* All files are padded up to512 bytes
1569+
* All files are padded up toa multiple of TAR_BLOCK_SIZE
15701570
*/
15711571
state->current_padding=
1572-
((state->current_len_left+511)& ~511)-state->current_len_left;
1572+
tarPaddingBytesRequired(state->current_len_left);
15731573

15741574
/*
15751575
* First part of header is zero terminated filename

‎src/bin/pg_basebackup/walmethods.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ typedef struct TarMethodFile
386386
{
387387
off_tofs_start;/* Where does the *header* for this file start */
388388
off_tcurrpos;
389-
charheader[512];
389+
charheader[TAR_BLOCK_SIZE];
390390
char*pathname;
391391
size_tpad_to_size;
392392
}TarMethodFile;
@@ -625,7 +625,8 @@ tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
625625
if (!tar_data->compression)
626626
{
627627
errno=0;
628-
if (write(tar_data->fd,tar_data->currentfile->header,512)!=512)
628+
if (write(tar_data->fd,tar_data->currentfile->header,
629+
TAR_BLOCK_SIZE)!=TAR_BLOCK_SIZE)
629630
{
630631
save_errno=errno;
631632
pg_free(tar_data->currentfile);
@@ -639,7 +640,8 @@ tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
639640
else
640641
{
641642
/* Write header through the zlib APIs but with no compression */
642-
if (!tar_write_compressed_data(tar_data->currentfile->header,512, true))
643+
if (!tar_write_compressed_data(tar_data->currentfile->header,
644+
TAR_BLOCK_SIZE, true))
643645
returnNULL;
644646

645647
/* Re-enable compression for the rest of the file */
@@ -665,7 +667,9 @@ tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
665667
/* Uncompressed, so pad now */
666668
tar_write_padding_data(tar_data->currentfile,pad_to_size);
667669
/* Seek back to start */
668-
if (lseek(tar_data->fd,tar_data->currentfile->ofs_start+512,SEEK_SET)!=tar_data->currentfile->ofs_start+512)
670+
if (lseek(tar_data->fd,
671+
tar_data->currentfile->ofs_start+TAR_BLOCK_SIZE,
672+
SEEK_SET)!=tar_data->currentfile->ofs_start+TAR_BLOCK_SIZE)
669673
returnNULL;
670674

671675
tar_data->currentfile->currpos=0;
@@ -778,14 +782,14 @@ tar_close(Walfile f, WalCloseMethod method)
778782
}
779783

780784
/*
781-
* Get the size of the file, and padthe current data up to thenearest
782-
*512 byte boundary.
785+
* Get the size of the file, and padout to a multiple of thetar block
786+
*size.
783787
*/
784788
filesize=tar_get_current_pos(f);
785-
padding=((filesize+511)& ~511)-filesize;
789+
padding=tarPaddingBytesRequired(filesize);
786790
if (padding)
787791
{
788-
charzerobuf[512];
792+
charzerobuf[TAR_BLOCK_SIZE];
789793

790794
MemSet(zerobuf,0,padding);
791795
if (tar_write(f,zerobuf,padding)!=padding)
@@ -826,7 +830,7 @@ tar_close(Walfile f, WalCloseMethod method)
826830
if (!tar_data->compression)
827831
{
828832
errno=0;
829-
if (write(tar_data->fd,tf->header,512)!=512)
833+
if (write(tar_data->fd,tf->header,TAR_BLOCK_SIZE)!=TAR_BLOCK_SIZE)
830834
{
831835
/* if write didn't set errno, assume problem is no disk space */
832836
if (errno==0)
@@ -845,7 +849,8 @@ tar_close(Walfile f, WalCloseMethod method)
845849
}
846850

847851
/* Overwrite the header, assuming the size will be the same */
848-
if (!tar_write_compressed_data(tar_data->currentfile->header,512, true))
852+
if (!tar_write_compressed_data(tar_data->currentfile->header,
853+
TAR_BLOCK_SIZE, true))
849854
return-1;
850855

851856
/* Turn compression back on */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp