if (!debug_reader)
debug_reader = XLogReaderAllocate(NULL, NULL);
- if (!debug_reader ||
- !DecodeXLogRecord(debug_reader, (XLogRecord *) recordBuf.data,
+ if (!debug_reader)
+ {
+ appendStringInfo(&buf, "error decoding record: out of memory");
+ }
+ else if (!DecodeXLogRecord(debug_reader, (XLogRecord *) recordBuf.data,
&errormsg))
{
appendStringInfo(&buf, "error decoding record: %s",
/*
* Allocate and initialize a new XLogReader.
*
- * The returned XLogReader is palloc'd. (In FRONTEND code, that means that
- * running out-of-memory causes an immediate exit(1).
+ * Returns NULL if the xlogreader couldn't be allocated.
*/
XLogReaderState *
XLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data)
{
XLogReaderState *state;
- state = (XLogReaderState *) palloc0(sizeof(XLogReaderState));
+ state = (XLogReaderState *)
+ palloc_extended(sizeof(XLogReaderState),
+ MCXT_ALLOC_NO_OOM | MCXT_ALLOC_ZERO);
+ if (!state)
+ return NULL;
state->max_block_id = -1;
* Permanently allocate readBuf. We do it this way, rather than just
* making a static array, for two reasons: (1) no need to waste the
* storage in most instantiations of the backend; (2) a static char array
- * isn't guaranteed to have any particular alignment, whereas palloc()
- * will provide MAXALIGN'd storage.
+ * isn't guaranteed to have any particular alignment, whereas
+ * palloc_extended() will provide MAXALIGN'd storage.
*/
- state->readBuf = (char *) palloc(XLOG_BLCKSZ);
+ state->readBuf = (char *) palloc_extended(XLOG_BLCKSZ,
+ MCXT_ALLOC_NO_OOM);
+ if (!state->readBuf)
+ {
+ pfree(state);
+ return NULL;
+ }
state->read_page = pagereadfunc;
/* system_identifier initialized to zeroes above */
state->private_data = private_data;
/* ReadRecPtr and EndRecPtr initialized to zeroes above */
/* readSegNo, readOff, readLen, readPageTLI initialized to zeroes above */
- state->errormsg_buf = palloc(MAX_ERRORMSG_LEN + 1);
+ state->errormsg_buf = palloc_extended(MAX_ERRORMSG_LEN + 1,
+ MCXT_ALLOC_NO_OOM);
+ if (!state->errormsg_buf)
+ {
+ pfree(state->readBuf);
+ pfree(state);
+ return NULL;
+ }
state->errormsg_buf[0] = '\0';
/*
private.datadir = datadir;
private.tli = tli;
xlogreader = XLogReaderAllocate(&SimpleXLogPageRead, &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory");
do
{
private.datadir = datadir;
private.tli = tli;
xlogreader = XLogReaderAllocate(&SimpleXLogPageRead, &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory");
record = XLogReadRecord(xlogreader, ptr, &errormsg);
if (record == NULL)
private.datadir = datadir;
private.tli = tli;
xlogreader = XLogReaderAllocate(&SimpleXLogPageRead, &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory");
searchptr = forkptr;
for (;;)