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
|
static void
|
||||||
ltsInitReadBuffer(LogicalTapeSet *lts, LogicalTape *lt)
|
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 */
|
/* Read the first block, or reset if tape is empty */
|
||||||
lt->nextBlockNumber = lt->firstBlockNumber;
|
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) */
|
/* Allocate a read buffer (unless the tape is empty) */
|
||||||
if (lt->buffer)
|
if (lt->buffer)
|
||||||
pfree(lt->buffer);
|
pfree(lt->buffer);
|
||||||
|
|
||||||
|
/* the buffer is lazily allocated, but set the size here */
|
||||||
lt->buffer = NULL;
|
lt->buffer = NULL;
|
||||||
lt->buffer_size = 0;
|
lt->buffer_size = buffer_size;
|
||||||
if (lt->firstBlockNumber != -1L)
|
|
||||||
{
|
|
||||||
/* the buffer is lazily allocated, but set the size here */
|
|
||||||
lt->buffer_size = buffer_size;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue