提交 4672a5ef 编写于 作者: A Ashwin Agrawal

Avoid storing maxTID for persistent tables.

It's very error prone to externally maintain variable to track
maxTID for a table, need to worry about lot of cases like vacuum and all.
Persistent tables historically used this mechanism to perform certain
checks, which seem irrelevant now that we are freeing tuples in
regular heap way for persistent tables as well.
上级 6b150e72
......@@ -213,15 +213,11 @@ PersistentEndXactRec_VerifyFileSysActionInfos(
{
int i;
ItemPointerData maxTid;
if (InRecovery || Persistent_BeforePersistenceWork())
return;
for (i = 0; i < count; i++)
{
PersistentTidIsKnownResult persistentTidIsKnownResult;
if (!PersistentEndXactFileSysAction_IsValid(fileSysActionInfos[i].action))
elog(ERROR, "Persistent file-system action is invalid (%d) (index %d, transaction kind '%s')",
fileSysActionInfos[i].action,
......@@ -240,55 +236,6 @@ PersistentEndXactRec_VerifyFileSysActionInfos(
i,
EndXactRecKind_Name(endXactRecKind));
persistentTidIsKnownResult = PersistentFileSysObj_TidIsKnown(
fileSysActionInfos[i].fsObjName.type,
&fileSysActionInfos[i].persistentTid,
&maxTid);
switch (persistentTidIsKnownResult)
{
case PersistentTidIsKnownResult_BeforePersistenceWork:
elog(ERROR, "Shouldn't being trying to verify persistent TID before persistence work");
break;
case PersistentTidIsKnownResult_ScanNotPerformedYet:
// UNDONE: For now, just debug log this.
if (Debug_persistent_print)
elog(Persistent_DebugPrintLevel(),
"Can't verify persistent TID if we haven't done the persistent scan yet");
break;
case PersistentTidIsKnownResult_MaxTidIsZero:
// UNDONE: For now, just debug log this.
if (Debug_persistent_print)
elog(Persistent_DebugPrintLevel(),
"TID for persistent '%s' tuple TID %s and the last known TID zero (0,0) (index %d, transaction kind '%s')",
PersistentFileSysObjName_TypeAndObjectName(&fileSysActionInfos[i].fsObjName),
ItemPointerToString(&fileSysActionInfos[i].persistentTid),
i,
EndXactRecKind_Name(endXactRecKind));
break;
case PersistentTidIsKnownResult_NotKnown:
// UNDONE: For now, just debug log this.
if (Debug_persistent_print)
elog(Persistent_DebugPrintLevel(),
"TID for persistent '%s' tuple TID %s is beyond the last known TID %s (index %d, transaction kind '%s')",
PersistentFileSysObjName_TypeAndObjectName(&fileSysActionInfos[i].fsObjName),
ItemPointerToString(&fileSysActionInfos[i].persistentTid),
ItemPointerToString2(&maxTid),
i,
EndXactRecKind_Name(endXactRecKind));
break;
case PersistentTidIsKnownResult_Known:
/* OK */
break;
default:
elog(ERROR, "Unexpected persistent file-system TID is known result: %d",
persistentTidIsKnownResult);
}
if (fileSysActionInfos[i].persistentSerialNum == 0)
elog(ERROR, "Persistent '%s' serial number is invalid (0) (index %d, transaction kind '%s')",
PersistentFileSysObjName_TypeAndObjectName(&fileSysActionInfos[i].fsObjName),
......
......@@ -752,35 +752,26 @@ int64 PersistentFileSysObj_CurrentMaxSerialNum(
&fileSysObjSharedData->storeSharedData);
}
PersistentTidIsKnownResult PersistentFileSysObj_TidIsKnown(
PersistentFsObjType fsObjType,
void PersistentFileSysObj_UpdateTuple(
PersistentFsObjType fsObjType,
ItemPointer persistentTid,
/* TID of the stored tuple. */
ItemPointer maxTid)
{
READ_PERSISTENT_STATE_ORDERED_LOCK_DECLARE;
PersistentFileSysObjData *fileSysObjData;
PersistentFileSysObjSharedData *fileSysObjSharedData;
PersistentTidIsKnownResult result;
PersistentFileSysObj_GetDataPtrs(
fsObjType,
&fileSysObjData,
&fileSysObjSharedData);
READ_PERSISTENT_STATE_ORDERED_LOCK;
result = PersistentStore_TidIsKnown(
&fileSysObjSharedData->storeSharedData,
persistentTid,
maxTid);
Datum *values,
READ_PERSISTENT_STATE_ORDERED_UNLOCK;
bool flushToXLog)
/* When true, the XLOG record for this change will be flushed to disk. */
{
Assert(fsObjType >= PersistentFsObjType_First);
Assert(fsObjType <= PersistentFsObjType_Last);
return result;
PersistentStore_UpdateTuple(
&(fileSysObjDataArray[fsObjType]->storeData),
&(fileSysObjSharedDataArray[fsObjType]->storeSharedData),
persistentTid,
values,
flushToXLog);
}
void PersistentFileSysObj_ReplaceTuple(
......
......@@ -106,8 +106,6 @@ static void PersistentStore_DoInitScan(
values = (Datum*)palloc(storeData->numAttributes * sizeof(Datum));
MemSet(&storeSharedData->maxTid, 0, sizeof(ItemPointerData));
PersistentStore_BeginScan(
storeData,
storeSharedData,
......@@ -122,15 +120,6 @@ static void PersistentStore_DoInitScan(
/*
* We are scanning from low to high TID.
*/
Assert(
PersistentStore_IsZeroTid(&storeSharedData->maxTid)
||
ItemPointerCompare(
&storeSharedData->maxTid,
&persistentTid) == -1); // Less-Than.
storeSharedData->maxTid = persistentTid;
PersistentStore_ExtractOurTupleData(
storeData,
values,
......@@ -210,10 +199,9 @@ static void PersistentStore_DoInitScan(
if (Debug_persistent_recovery_print)
elog(PersistentRecovery_DebugPrintLevel(),
"PersistentStore_DoInitScan ('%s'): maximum in-use serial number "
INT64_FORMAT ", maximum known TID %s",
INT64_FORMAT ,
storeData->tableName,
storeSharedData->maxInUseSerialNum,
ItemPointerToString2(&storeSharedData->maxTid));
storeSharedData->maxInUseSerialNum);
}
void PersistentStore_InitScanUnderLock(
......@@ -374,34 +362,6 @@ int64 PersistentStore_CurrentMaxSerialNum(
return storeSharedData->maxInUseSerialNum;
}
PersistentTidIsKnownResult PersistentStore_TidIsKnown(
PersistentStoreSharedData *storeSharedData,
ItemPointer persistentTid,
ItemPointer maxTid)
{
*maxTid = storeSharedData->maxTid;
Assert(!PersistentStore_IsZeroTid(persistentTid));
// UNDONE: I think the InRecovery test only applies to physical Master Mirroring on Standby.
/* Only test this outside of recovery scenarios */
if (Persistent_BeforePersistenceWork())
return PersistentTidIsKnownResult_BeforePersistenceWork;
if (storeSharedData->needToScanIntoSharedMemory)
return PersistentTidIsKnownResult_ScanNotPerformedYet;
if (PersistentStore_IsZeroTid(&storeSharedData->maxTid))
return PersistentTidIsKnownResult_MaxTidIsZero;
if (ItemPointerCompare(
persistentTid,
&storeSharedData->maxTid) <= 0) // Less-than or equal.
return PersistentTidIsKnownResult_Known;
else
return PersistentTidIsKnownResult_NotKnown;
}
static void PersistentStore_DoInsertTuple(
PersistentStoreData *storeData,
PersistentStoreSharedData *storeSharedData,
......@@ -437,17 +397,9 @@ static void PersistentStore_DoInsertTuple(
if (Debug_persistent_store_print)
elog(PersistentStore_DebugPrintLevel(),
"PersistentStore_DoInsertTuple: old maximum known TID %s, new insert TID %s ('%s')",
ItemPointerToString(&storeSharedData->maxTid),
"PersistentStore_DoInsertTuple: new insert TID %s ('%s')",
ItemPointerToString2(&persistentTuple->t_self),
storeData->tableName);
if (ItemPointerCompare(
&storeSharedData->maxTid,
&persistentTuple->t_self) == -1)
{
// Current max is Less-Than.
storeSharedData->maxTid = persistentTuple->t_self;
}
/*
* Return the TID of the INSERT tuple.
......@@ -742,21 +694,6 @@ void PersistentStore_ReadTuple(
elog(ERROR, "TID for fetch persistent tuple is invalid (0,0) ('%s')",
storeData->tableName);
// UNDONE: I think the InRecovery test only applies to physical Master Mirroring on Standby.
/* Only test this outside of recovery scenarios */
if (!InRecovery
&&
(PersistentStore_IsZeroTid(&storeSharedData->maxTid)
||
ItemPointerCompare(
readTid,
&storeSharedData->maxTid) == 1 // Greater-than.
))
{
*tupleCopy = NULL;
return;
}
persistentRel = (*storeData->openRel)();
tuple.t_self = *readTid;
......
......@@ -73,10 +73,13 @@ extern int64 PersistentFileSysObj_MyHighestSerialNum(
extern int64 PersistentFileSysObj_CurrentMaxSerialNum(
PersistentFsObjType fsObjType);
extern PersistentTidIsKnownResult PersistentFileSysObj_TidIsKnown(
PersistentFsObjType fsObjType,
extern void PersistentFileSysObj_UpdateTuple(
PersistentFsObjType fsObjType,
ItemPointer persistentTid,
ItemPointer maxTid);
/* TID of the stored tuple. */
Datum *values,
bool flushToXLog);
/* When true, the XLOG record for this change will be flushed to disk. */
extern void PersistentFileSysObj_ReplaceTuple(
PersistentFsObjType fsObjType,
......
......@@ -55,9 +55,6 @@ typedef struct PersistentStoreSharedData
int64 inUseCount;
/* Current number of tuples in persistent table */
ItemPointerData maxTid;
/* Highest TID of tuple stored in persistent table */
} PersistentStoreSharedData;
inline static bool PersistentStoreSharedData_EyecatcherIsValid(
......@@ -482,11 +479,6 @@ typedef enum PersistentTidIsKnownResult
MaxPersistentTidIsKnownResult /* must always be last */
} PersistentTidIsKnownResult;
extern PersistentTidIsKnownResult PersistentStore_TidIsKnown(
PersistentStoreSharedData *storeSharedData,
ItemPointer persistentTid,
ItemPointer maxTid);
extern void PersistentStore_UpdateTuple(
PersistentStoreData *storeData,
PersistentStoreSharedData *storeSharedData,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册