提交 88de7338 编写于 作者: A Ashwin Agrawal 提交者: Xin Zhang

Set fts_status when updating gp_segment_configuration

This change help `FtsTestConnection()` to correctly report segment
state. `probeWalRepPublishUpdate()` updating fts_status if
primary/mirror gets marked as down.

Also, removed all other states and code setting the same as its not
used for anything.
上级 6f0766e1
......@@ -205,7 +205,7 @@ FtsTestConnection(CdbComponentDatabaseInfo *failedDBInfo, bool fullScan)
* fts_status. We shouldn't be checking against uninitialzed variable.
*/
if (ftsProbeInfo->fts_status_initialized)
return FTS_STATUS_ISALIVE(failedDBInfo->dbid, ftsProbeInfo->fts_status);
return FTS_STATUS_IS_UP(ftsProbeInfo->fts_status[failedDBInfo->dbid]);
return true;
}
......@@ -214,7 +214,7 @@ FtsTestConnection(CdbComponentDatabaseInfo *failedDBInfo, bool fullScan)
Assert(ftsProbeInfo->fts_status_initialized);
return FTS_STATUS_ISALIVE(failedDBInfo->dbid, ftsProbeInfo->fts_status);
return FTS_STATUS_IS_UP(ftsProbeInfo->fts_status[failedDBInfo->dbid]);
}
/*
......
......@@ -376,21 +376,10 @@ CdbComponentDatabases *readCdbComponentInfoAndUpdateStatus(MemoryContext probeCo
for (i=0; i < cdbs->total_segment_dbs; i++)
{
CdbComponentDatabaseInfo *segInfo = &cdbs->segment_db_info[i];
uint8 segStatus;
segStatus = 0;
uint8 segStatus = 0;
if (SEGMENT_IS_ALIVE(segInfo))
segStatus |= FTS_STATUS_ALIVE;
if (SEGMENT_IS_ACTIVE_PRIMARY(segInfo))
segStatus |= FTS_STATUS_PRIMARY;
if (segInfo->preferred_role == GP_SEGMENT_CONFIGURATION_ROLE_PRIMARY)
segStatus |= FTS_STATUS_DEFINEDPRIMARY;
if (segInfo->mode == GP_SEGMENT_CONFIGURATION_MODE_INSYNC)
segStatus |= FTS_STATUS_SYNCHRONIZED;
FTS_STATUS_SET_UP(segStatus);
ftsProbeInfo->fts_status[segInfo->dbid] = segStatus;
}
......@@ -605,6 +594,21 @@ probeWalRepPublishUpdate(CdbComponentDatabases *cdbs, fts_context *context)
CommitTransactionCommand();
CurrentResourceOwner = save;
/*
* Update the status to in-memory variable as well used by
* dispatcher, now that changes has been persisted to catalog.
*/
Assert(ftsProbeInfo);
if (IsPrimaryAlive)
FTS_STATUS_SET_UP(ftsProbeInfo->fts_status[primary->dbid]);
else
FTS_STATUS_SET_DOWN(ftsProbeInfo->fts_status[primary->dbid]);
if (IsMirrorAlive)
FTS_STATUS_SET_UP(ftsProbeInfo->fts_status[mirror->dbid]);
else
FTS_STATUS_SET_DOWN(ftsProbeInfo->fts_status[mirror->dbid]);
}
}
......@@ -876,37 +880,6 @@ FtsIsSegmentAlive(CdbComponentDatabaseInfo *segInfo)
return false;
}
/*
* Dump out the changes to our logfile.
*/
void
FtsDumpChanges(FtsSegmentStatusChange *changes, int changeEntries)
{
Assert(changes != NULL);
int i = 0;
for (i = 0; i < changeEntries; i++)
{
bool new_alive, old_alive;
bool new_pri, old_pri;
new_alive = (changes[i].newStatus & FTS_STATUS_ALIVE ? true : false);
old_alive = (changes[i].oldStatus & FTS_STATUS_ALIVE ? true : false);
new_pri = (changes[i].newStatus & FTS_STATUS_PRIMARY ? true : false);
old_pri = (changes[i].oldStatus & FTS_STATUS_PRIMARY ? true : false);
elog(LOG, "FTS: change state for segment (dbid=%d, content=%d) from ('%c','%c') to ('%c','%c')",
changes[i].dbid,
changes[i].segindex,
(old_alive ? GP_SEGMENT_CONFIGURATION_STATUS_UP : GP_SEGMENT_CONFIGURATION_STATUS_DOWN),
(old_pri ? GP_SEGMENT_CONFIGURATION_ROLE_PRIMARY : GP_SEGMENT_CONFIGURATION_ROLE_MIRROR),
(new_alive ? GP_SEGMENT_CONFIGURATION_STATUS_UP : GP_SEGMENT_CONFIGURATION_STATUS_DOWN),
(new_pri ? GP_SEGMENT_CONFIGURATION_ROLE_PRIMARY : GP_SEGMENT_CONFIGURATION_ROLE_MIRROR));
}
}
/*
* Get peer segment descriptor
*/
......
......@@ -14,16 +14,21 @@
#define FTS_MAX_DBS (128 * 1024)
#define FTS_STATUS_ALIVE (1<<0)
#define FTS_STATUS_PRIMARY (1<<1)
#define FTS_STATUS_DEFINEDPRIMARY (1<<2)
#define FTS_STATUS_SYNCHRONIZED (1<<3)
#define FTS_STATUS_TEST(dbid, status, flag) (((status)[(dbid)] & (flag)) ? true : false)
#define FTS_STATUS_ISALIVE(dbid, status) FTS_STATUS_TEST((dbid), (status), FTS_STATUS_ALIVE)
#define FTS_STATUS_ISPRIMARY(dbid, status) FTS_STATUS_TEST((dbid), (status), FTS_STATUS_PRIMARY)
#define FTS_STATUS_ISDEFINEDPRIMARY(dbid, status) FTS_STATUS_TEST((dbid), (status), FTS_STATUS_DEFINEDPRIMARY)
#define FTS_STATUS_IS_SYNCED(dbid, status) FTS_STATUS_TEST((dbid), (status), FTS_STATUS_SYNCHRONIZED)
/*
* There used to many more states here but currently dispatch is only checking
* if segment is UP or not. So just have that, when needed for other states
* this can be extended.
*/
#define FTS_STATUS_UP (1<<0)
#define FTS_STATUS_TEST(status, flag) (((status) & (flag)) ? true : false)
#define FTS_STATUS_IS_UP(status) FTS_STATUS_TEST((status), FTS_STATUS_UP)
#define FTS_STATUS_SET(status, flag) ((status) |= (flag))
#define FTS_STATUS_SET_UP(status) FTS_STATUS_SET((status), FTS_STATUS_UP)
#define FTS_STATUS_RESET(status, flag) ((status) &= ~(flag))
#define FTS_STATUS_SET_DOWN(status) FTS_STATUS_RESET((status), FTS_STATUS_UP)
typedef struct FtsProbeInfo
{
......
......@@ -154,8 +154,6 @@ extern void FtsProbeSegments(CdbComponentDatabases *dbs, uint8 *scan_status);
extern bool FtsIsSegmentAlive(CdbComponentDatabaseInfo *segInfo);
extern CdbComponentDatabaseInfo *FtsGetPeerSegment(CdbComponentDatabases *cdbs,
int content, int dbid);
extern void FtsDumpChanges(FtsSegmentStatusChange *changes, int changeEntries);
/*
* Interface for checking if FTS is active
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册