Ejemplo n.º 1
0
/*
 * 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;

}
Ejemplo n.º 2
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;
}