logtape.c: allocate read buffer even for an empty tape.
Prior to this commit, the read buffer was allocated at the time the tape
was rewound; but as an optimization, would not be allocated at all if
the tape was empty.
That optimization meant that it was valid to have a rewound tape with
the buffer set to NULL, but only if a number of conditions were met
and only if the API was used properly. After 7fdd919a
refactored the
code to support lazily-allocating the buffer, Coverity started
complaining.
The optimization for empty tapes doesn't seem important, so just
allocate the buffer whether the tape has any data or not.
Discussion: https://postgr.es/m/20351.1581868306%40sss.pgh.pa.us
This commit is contained in:
parent
0074919794
commit
8021985d79
|
@ -544,11 +544,8 @@ ltsConcatWorkerTapes(LogicalTapeSet *lts, TapeShare *shared,
|
|||
static void
|
||||
ltsInitReadBuffer(LogicalTapeSet *lts, LogicalTape *lt)
|
||||
{
|
||||
if (lt->firstBlockNumber != -1L)
|
||||
{
|
||||
Assert(lt->buffer_size > 0);
|
||||
lt->buffer = palloc(lt->buffer_size);
|
||||
}
|
||||
Assert(lt->buffer_size > 0);
|
||||
lt->buffer = palloc(lt->buffer_size);
|
||||
|
||||
/* Read the first block, or reset if tape is empty */
|
||||
lt->nextBlockNumber = lt->firstBlockNumber;
|
||||
|
@ -839,13 +836,10 @@ LogicalTapeRewindForRead(LogicalTapeSet *lts, int tapenum, size_t buffer_size)
|
|||
/* Allocate a read buffer (unless the tape is empty) */
|
||||
if (lt->buffer)
|
||||
pfree(lt->buffer);
|
||||
|
||||
/* the buffer is lazily allocated, but set the size here */
|
||||
lt->buffer = NULL;
|
||||
lt->buffer_size = 0;
|
||||
if (lt->firstBlockNumber != -1L)
|
||||
{
|
||||
/* the buffer is lazily allocated, but set the size here */
|
||||
lt->buffer_size = buffer_size;
|
||||
}
|
||||
lt->buffer_size = buffer_size;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue