libpq_repli_v0.diff

text/plain

Filename: libpq_repli_v0.diff
Type: text/plain
Part: 0
Message: [PoC] load balancing in libpq

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
Series: patch v0
File+
src/interfaces/libpq/fe-connect.c 83 1
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 9eaf410..14e31b6 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -569,6 +569,81 @@ PQconnectStartParams(const char *const * keywords,
 	return conn;
 }
 
+struct ConninfoRepli {
+	int n_conninfo;
+	char *conninfo_array[128];
+};
+
+static bool
+parse_conninfo_repli(char *conninfo, size_t len, const char *conninfo_repli)
+{
+	char buf[1024];
+	char *conninfo_ptr;
+	char *end_ptr;
+	struct ConninfoRepli conninfo_r;
+	static int conninfo_idx = 0;
+
+	int i;
+
+	memset(&conninfo_r, 0, sizeof(struct ConninfoRepli));
+
+	conninfo_r.n_conninfo = 0;
+
+#ifdef REPLI_DEBUG
+	printf("DEBUG: %s\n", conninfo_repli);
+#endif
+
+	conninfo_ptr = (char *)conninfo_repli;
+
+	while (1)
+	{
+		int len;
+
+		end_ptr = strchr(conninfo_ptr, ';');
+		if ( end_ptr )
+			len = end_ptr - conninfo_ptr;
+		else
+			len = strlen(conninfo_ptr);
+
+		memset(buf, 0, sizeof(buf));
+		strncpy(buf, conninfo_ptr, len);
+
+		conninfo_r.conninfo_array[conninfo_r.n_conninfo] = strdup(buf);
+		conninfo_r.n_conninfo++;
+
+		if ( !end_ptr )
+			break;
+
+		conninfo_ptr = end_ptr + 1;
+	}
+
+#ifdef REPLI_DEBUG
+	printf("DEBUG: n_conninfo = %d\n", conninfo_r.n_conninfo);
+
+	for (i=0 ; i<conninfo_r.n_conninfo ; i++)
+	{
+		printf("DEBUG: %s\n", conninfo_r.conninfo_array[i]);
+	}
+#endif
+
+	strncpy(conninfo, conninfo_r.conninfo_array[conninfo_idx], len);
+	conninfo_idx++;
+
+#ifdef REPLI_DEBUG
+	printf("DEBUG: conninfo = %s\n", conninfo);
+#endif
+
+	if ( conninfo_idx >= conninfo_r.n_conninfo )
+		conninfo_idx = 0;
+
+	for (i=0 ; i<conninfo_r.n_conninfo ; i++)
+	{
+		free(conninfo_r.conninfo_array[i]);
+	}
+
+	return true;
+}
+
 /*
  *		PQconnectStart
  *
@@ -592,6 +667,7 @@ PGconn *
 PQconnectStart(const char *conninfo)
 {
 	PGconn	   *conn;
+	char conninfo2[1024];
 
 	/*
 	 * Allocate memory for the conn structure
@@ -601,9 +677,15 @@ PQconnectStart(const char *conninfo)
 		return NULL;
 
 	/*
+	 * Parse an user-specified conninfo string that contains
+	 * multiple conninfo strings, and pick one by round-robin basis.
+	 */
+	parse_conninfo_repli(conninfo2, sizeof(conninfo2), conninfo);
+
+	/*
 	 * Parse the conninfo string
 	 */
-	if (!connectOptions1(conn, conninfo))
+	if (!connectOptions1(conn, conninfo2))
 		return conn;
 
 	/*