/* * Perform a large write i/o. */ static void BufferedAppendWrite( BufferedAppend *bufferedAppend) { int32 writeLen; uint8 *largeWriteMemory; int actualLen; writeLen = bufferedAppend->largeWriteLen; Assert(bufferedAppend->largeWriteLen > 0); largeWriteMemory = bufferedAppend->largeWriteMemory; #ifdef USE_ASSERT_CHECKING { int64 currentWritePosition; currentWritePosition = FileNonVirtualCurSeek(bufferedAppend->file); if (currentWritePosition < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("unable to get current position in table \"%s\" for file \"%s\" (errcode %d)", bufferedAppend->relationName, bufferedAppend->filePathName, errno))); if (currentWritePosition != bufferedAppend->largeWritePosition) ereport(ERROR, (errcode_for_file_access(), errmsg("Current position mismatch actual " INT64_FORMAT ", expected " INT64_FORMAT " in table \"%s\" for file \"%s\"", currentWritePosition, bufferedAppend->largeWritePosition, bufferedAppend->relationName, bufferedAppend->filePathName))); } #endif while (writeLen > 0) { int primaryError; bool mirrorDataLossOccurred; MirroredAppendOnly_Append( &bufferedAppend->mirroredOpen, (char*)largeWriteMemory, writeLen, &primaryError, &mirrorDataLossOccurred); if (primaryError != 0) ereport(ERROR, (errcode_for_file_access(), errmsg("Could not write in table \"%s\" to segment file '%s': %m", bufferedAppend->relationName, bufferedAppend->filePathName))); elogif(Debug_appendonly_print_append_block, LOG, "Append-Only storage write: table '%s', segment file '%s', write position " INT64_FORMAT ", " "writeLen %d (equals large write length %d is %s)", bufferedAppend->relationName, bufferedAppend->filePathName, bufferedAppend->largeWritePosition, writeLen, bufferedAppend->largeWriteLen, (writeLen == bufferedAppend->largeWriteLen ? "true" : "false")); actualLen = writeLen; writeLen -= actualLen; largeWriteMemory += actualLen; } bufferedAppend->largeWritePosition += bufferedAppend->largeWriteLen; bufferedAppend->largeWriteLen = 0; }
/* * Perform a large read i/o. */ static void BufferedReadIo( BufferedRead *bufferedRead) { int32 largeReadLen; uint8 *largeReadMemory; int32 offset; largeReadLen = bufferedRead->largeReadLen; Assert(bufferedRead->largeReadLen > 0); largeReadMemory = bufferedRead->largeReadMemory; #ifdef USE_ASSERT_CHECKING { int64 currentReadPosition; currentReadPosition = FileNonVirtualCurSeek(bufferedRead->file); if (currentReadPosition < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("unable to get current position for table \"%s\" in file \"%s\": %m", bufferedRead->relationName, bufferedRead->filePathName))); if (currentReadPosition != bufferedRead->largeReadPosition) { ereport(ERROR, (errcode_for_file_access(), errmsg("Current position mismatch actual " INT64_FORMAT ", expected " INT64_FORMAT " for table \"%s\" in file \"%s\"", currentReadPosition, bufferedRead->largeReadPosition, bufferedRead->relationName, bufferedRead->filePathName))); } } #endif offset = 0; while (largeReadLen > 0) { int actualLen = FileRead( bufferedRead->file, (char *) largeReadMemory, largeReadLen); if (actualLen == 0) ereport(ERROR, (errcode_for_file_access(), errmsg("read beyond eof in table \"%s\" file \"%s\", " "read position " INT64_FORMAT " (small offset %d), " "actual read length %d (large read length %d)", bufferedRead->relationName, bufferedRead->filePathName, bufferedRead->largeReadPosition, offset, actualLen, bufferedRead->largeReadLen))); else if (actualLen < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("unable to read table \"%s\" file \"%s\", " "read position " INT64_FORMAT " (small offset %d), " "actual read length %d (large read length %d): %m", bufferedRead->relationName, bufferedRead->filePathName, bufferedRead->largeReadPosition, offset, actualLen, bufferedRead->largeReadLen))); elogif(Debug_appendonly_print_read_block, LOG, "Append-Only storage read: table \"%s\", segment file \"%s\", read position " INT64_FORMAT " (small offset %d), " "actual read length %d (equals large read length %d is %s)", bufferedRead->relationName, bufferedRead->filePathName, bufferedRead->largeReadPosition, offset, actualLen, bufferedRead->largeReadLen, (actualLen == bufferedRead->largeReadLen ? "true" : "false")); largeReadLen -= actualLen; largeReadMemory += actualLen; offset += actualLen; } if (VacuumCostActive) VacuumCostBalance += VacuumCostPageMiss; }