未验证 提交 e580dab8 编写于 作者: X xiong-gang 提交者: GitHub

Change the size of interconnect connection hash table

As discussed in #6932, the size of interconnect connection hash table is 16,
which would be too small for large cluster and could bring too many hash table
collisions. Set to (2 * number segments).
上级 c9655e2d
...@@ -60,6 +60,12 @@ int qe_identifier = 0; ...@@ -60,6 +60,12 @@ int qe_identifier = 0;
*/ */
int host_segments = 0; int host_segments = 0;
/*
* size of hash table of interconnect connections
* equals to 2 * (the number of total segments)
*/
int ic_htab_size = 0;
Gang *CurrentGangCreating = NULL; Gang *CurrentGangCreating = NULL;
CreateGangFunc pCreateGangFunc = cdbgang_createGang_async; CreateGangFunc pCreateGangFunc = cdbgang_createGang_async;
...@@ -357,7 +363,7 @@ makeOptions(void) ...@@ -357,7 +363,7 @@ makeOptions(void)
*/ */
bool bool
build_gpqeid_param(char *buf, int bufsz, build_gpqeid_param(char *buf, int bufsz,
bool is_writer, int identifier, int hostSegs) bool is_writer, int identifier, int hostSegs, int icHtabSize)
{ {
int len; int len;
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
...@@ -370,9 +376,9 @@ build_gpqeid_param(char *buf, int bufsz, ...@@ -370,9 +376,9 @@ build_gpqeid_param(char *buf, int bufsz,
#endif #endif
#endif #endif
len = snprintf(buf, bufsz, "%d;" TIMESTAMP_FORMAT ";%s;%d;%d", len = snprintf(buf, bufsz, "%d;" TIMESTAMP_FORMAT ";%s;%d;%d;%d",
gp_session_id, PgStartTime, gp_session_id, PgStartTime,
(is_writer ? "true" : "false"), identifier, hostSegs); (is_writer ? "true" : "false"), identifier, hostSegs, icHtabSize);
return (len > 0 && len < bufsz); return (len > 0 && len < bufsz);
} }
...@@ -444,11 +450,16 @@ cdbgang_parse_gpqeid_params(struct Port *port __attribute__((unused)), ...@@ -444,11 +450,16 @@ cdbgang_parse_gpqeid_params(struct Port *port __attribute__((unused)),
host_segments = (int) strtol(cp, NULL, 10); host_segments = (int) strtol(cp, NULL, 10);
} }
if (gpqeid_next_param(&cp, &np))
{
ic_htab_size = (int) strtol(cp, NULL, 10);
}
/* Too few items, or too many? */ /* Too few items, or too many? */
if (!cp || np) if (!cp || np)
goto bad; goto bad;
if (gp_session_id <= 0 || PgStartTime <= 0 || qe_identifier < 0 || host_segments <= 0) if (gp_session_id <= 0 || PgStartTime <= 0 || qe_identifier < 0 || host_segments <= 0 || ic_htab_size <= 0)
goto bad; goto bad;
pfree(gpqeid); pfree(gpqeid);
......
...@@ -54,6 +54,7 @@ cdbgang_createGang_async(List *segments, SegmentType segmentType) ...@@ -54,6 +54,7 @@ cdbgang_createGang_async(List *segments, SegmentType segmentType)
int i = 0; int i = 0;
int size = 0; int size = 0;
bool retry = false; bool retry = false;
int totalSegs = 0;
/* /*
* true means connection status is confirmed, either established or in * true means connection status is confirmed, either established or in
...@@ -72,6 +73,8 @@ cdbgang_createGang_async(List *segments, SegmentType segmentType) ...@@ -72,6 +73,8 @@ cdbgang_createGang_async(List *segments, SegmentType segmentType)
/* allocate and initialize a gang structure */ /* allocate and initialize a gang structure */
newGangDefinition = buildGangDefinition(segments, segmentType); newGangDefinition = buildGangDefinition(segments, segmentType);
CurrentGangCreating = newGangDefinition; CurrentGangCreating = newGangDefinition;
totalSegs = getgpsegmentCount();
Assert(totalSegs > 0);
create_gang_retry: create_gang_retry:
Assert(newGangDefinition != NULL); Assert(newGangDefinition != NULL);
...@@ -120,7 +123,8 @@ create_gang_retry: ...@@ -120,7 +123,8 @@ create_gang_retry:
ret = build_gpqeid_param(gpqeid, sizeof(gpqeid), ret = build_gpqeid_param(gpqeid, sizeof(gpqeid),
segdbDesc->isWriter, segdbDesc->isWriter,
segdbDesc->identifier, segdbDesc->identifier,
segdbDesc->segment_database_info->hostSegs); segdbDesc->segment_database_info->hostSegs,
totalSegs * 2);
if (!ret) if (!ret)
ereport(ERROR, ereport(ERROR,
......
...@@ -177,7 +177,6 @@ struct ConnHashTable ...@@ -177,7 +177,6 @@ struct ConnHashTable
int size; int size;
}; };
#define DEFAULT_CONN_HTAB_SIZE 16
#define CONN_HASH_VALUE(icpkt) ((uint32)((((icpkt)->srcPid ^ (icpkt)->dstPid)) + (icpkt)->dstContentId)) #define CONN_HASH_VALUE(icpkt) ((uint32)((((icpkt)->srcPid ^ (icpkt)->dstPid)) + (icpkt)->dstContentId))
#define CONN_HASH_MATCH(a, b) (((a)->motNodeId == (b)->motNodeId && \ #define CONN_HASH_MATCH(a, b) (((a)->motNodeId == (b)->motNodeId && \
(a)->dstContentId == (b)->dstContentId && \ (a)->dstContentId == (b)->dstContentId && \
...@@ -1511,7 +1510,8 @@ initConnHashTable(ConnHashTable *ht, MemoryContext cxt) ...@@ -1511,7 +1510,8 @@ initConnHashTable(ConnHashTable *ht, MemoryContext cxt)
int i; int i;
ht->cxt = cxt; ht->cxt = cxt;
ht->size = DEFAULT_CONN_HTAB_SIZE; ht->size = Gp_role == GP_ROLE_DISPATCH ? (getgpsegmentCount() * 2) : ic_htab_size;
Assert(ht->size > 0);
if (ht->cxt) if (ht->cxt)
{ {
......
...@@ -53,6 +53,7 @@ typedef struct Gang ...@@ -53,6 +53,7 @@ typedef struct Gang
extern int qe_identifier; extern int qe_identifier;
extern int host_segments; extern int host_segments;
extern int ic_htab_size;
extern MemoryContext GangContext; extern MemoryContext GangContext;
extern Gang *CurrentGangCreating; extern Gang *CurrentGangCreating;
...@@ -86,7 +87,7 @@ extern void CheckForResetSession(void); ...@@ -86,7 +87,7 @@ extern void CheckForResetSession(void);
extern struct SegmentDatabaseDescriptor *getSegmentDescriptorFromGang(const Gang *gp, int seg); extern struct SegmentDatabaseDescriptor *getSegmentDescriptorFromGang(const Gang *gp, int seg);
Gang *buildGangDefinition(List *segments, SegmentType segmentType); Gang *buildGangDefinition(List *segments, SegmentType segmentType);
bool build_gpqeid_param(char *buf, int bufsz, bool is_writer, int identifier, int hostSegs); bool build_gpqeid_param(char *buf, int bufsz, bool is_writer, int identifier, int hostSegs, int icHtabSize);
char *makeOptions(void); char *makeOptions(void);
extern bool segment_failure_due_to_recovery(const char *error_message); extern bool segment_failure_due_to_recovery(const char *error_message);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册