Browse Source

H2O: Optimize the database updates test further (#8570)

* H2O: Update dependencies

* H2O: Optimize the database updates test further

Use the same query as the faster implementations.
Anton Kirilov 1 year ago
parent
commit
a2f3f1011e

+ 4 - 4
frameworks/C/h2o/h2o.dockerfile

@@ -46,7 +46,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
     cmake --install build && \
     cp -a deps/picotls/include/picotls* deps/quicly/include/quicly* /usr/local/include
 
-ARG MUSTACHE_C_REVISION=c1948c599edfe48c6099ed70ab1d5911d8c3ddc8
+ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929
 
 WORKDIR /tmp/mustache-c-build
 RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISION}.tar.gz" | \
@@ -54,12 +54,12 @@ RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISIO
     CFLAGS="-flto -march=native -mtune=native -O3" ./autogen.sh && \
     make -j "$(nproc)" install
 
-ARG POSTGRESQL_VERSION=7b7fa85130330128b404eddebd4f33c6739454b0
+ARG POSTGRESQL_VERSION=c1ec02be1d79eac95160dea7ced32ace84664617
 
 WORKDIR /tmp/postgresql-build
 RUN curl -LSs "https://github.com/postgres/postgres/archive/${POSTGRESQL_VERSION}.tar.gz" | \
       tar --strip-components=1 -xz && \
-    curl -LSs "https://www.postgresql.org/message-id/attachment/146614/v2-0001-Add-PQsendSyncMessage-to-libpq.patch" | \
+    curl -LSs "https://www.postgresql.org/message-id/attachment/152078/v5-0001-Add-PQsendPipelineSync-to-libpq.patch" | \
       patch -Np1 && \
     CFLAGS="-flto -march=native -mtune=native -O3" ./configure \
       --includedir=/usr/local/include/postgresql \
@@ -92,7 +92,7 @@ RUN apt-get -yqq update && \
 ARG H2O_APP_PREFIX
 COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/"
 COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/"
-COPY --from=compile /usr/local/lib/libpq.so.5.16 "${H2O_APP_PREFIX}/lib/libpq.so.5"
+COPY --from=compile /usr/local/lib/libpq.so.5.17 "${H2O_APP_PREFIX}/lib/libpq.so.5"
 ENV LD_LIBRARY_PATH="${H2O_APP_PREFIX}/lib"
 EXPOSE 8080
 ARG BENCHMARK_ENV

+ 4 - 4
frameworks/C/h2o/src/database.c

@@ -135,8 +135,8 @@ static int do_execute_query(db_conn_t *conn, db_query_param_t *param)
 		return 1;
 	}
 
-	if (!PQsendSyncMessage(conn->conn)) {
-		LIBRARY_ERROR("PQsendSyncMessage", PQerrorMessage(conn->conn));
+	if (!PQsendPipelineSync(conn->conn)) {
+		LIBRARY_ERROR("PQsendPipelineSync", PQerrorMessage(conn->conn));
 		return 1;
 	}
 
@@ -522,8 +522,8 @@ static void prepare_statements(db_conn_t *conn)
 			iter = iter->next;
 		} while (iter);
 
-		if (!PQsendSyncMessage(conn->conn)) {
-			LIBRARY_ERROR("PQsendSyncMessage", PQerrorMessage(conn->conn));
+		if (!PQsendPipelineSync(conn->conn)) {
+			LIBRARY_ERROR("PQsendPipelineSync", PQerrorMessage(conn->conn));
 			on_database_connect_error(conn, false, DB_ERROR);
 			return;
 		}

+ 30 - 17
frameworks/C/h2o/src/handlers/world.c

@@ -55,18 +55,18 @@
 #define RANDOM_NUM_KEY "randomNumber"
 
 // MAX_UPDATE_QUERY_LEN must be updated whenever UPDATE_QUERY_BEGIN, UPDATE_QUERY_ELEM,
-// and UPDATE_QUERY_END are changed.
-#define UPDATE_QUERY_BEGIN \
-	"UPDATE " WORLD_TABLE_NAME " SET randomNumber = v.randomNumber " \
-	"FROM (VALUES(%" PRIu32 ", %" PRIu32 ")"
-
-#define UPDATE_QUERY_ELEM ", (%" PRIu32 ", %" PRIu32 ")"
-#define UPDATE_QUERY_END ") AS v (id, randomNumber) WHERE " WORLD_TABLE_NAME ".id = v.id;"
+// UPDATE_QUERY_MIDDLE, UPDATE_QUERY_ELEM2, and UPDATE_QUERY_END are changed.
+#define UPDATE_QUERY_BEGIN "UPDATE " WORLD_TABLE_NAME " SET randomNumber = CASE id "
+#define UPDATE_QUERY_ELEM "WHEN %" PRIu32 " THEN %" PRIu32 " "
+#define UPDATE_QUERY_MIDDLE "ELSE randomNumber END WHERE id IN (%" PRIu32
+#define UPDATE_QUERY_ELEM2 ",%" PRIu32
+#define UPDATE_QUERY_END ");"
 
 #define MAX_UPDATE_QUERY_LEN(n) \
-	(sizeof(UPDATE_QUERY_BEGIN) + sizeof(UPDATE_QUERY_END) - sizeof(UPDATE_QUERY_ELEM) + \
-	 (n) * (sizeof(UPDATE_QUERY_ELEM) - 1 + \
-	        2 * (sizeof(MKSTR(MAX_ID)) - 1) - 2 * (sizeof(PRIu32) - 1) - 2))
+	(sizeof(UPDATE_QUERY_BEGIN) + sizeof(UPDATE_QUERY_MIDDLE) + \
+	 sizeof(UPDATE_QUERY_END) - 1 - sizeof(UPDATE_QUERY_ELEM2) + \
+	 (n) * (sizeof(UPDATE_QUERY_ELEM) - 1 + sizeof(UPDATE_QUERY_ELEM2) - 1 + \
+	        3 * (sizeof(MKSTR(MAX_ID)) - 1) - 3 * (sizeof(PRIu32) - 1) - 3))
 
 #define USE_CACHE 2
 #define WORLD_QUERY "SELECT * FROM " WORLD_TABLE_NAME " WHERE id = $1::integer;"
@@ -336,13 +336,8 @@ static void do_updates(multiple_query_ctx_t *query_ctx)
 	query_ctx->query_param->param.paramLengths = NULL;
 	query_ctx->query_param->param.paramValues = NULL;
 	query_ctx->query_param->param.flags = 0;
-	query_ctx->res->random_number = 1 + get_random_number(MAX_ID, &query_ctx->ctx->random_seed);
 
-	int c = snprintf(iter,
-	                 sz,
-	                 UPDATE_QUERY_BEGIN,
-	                 query_ctx->res->id,
-	                 query_ctx->res->random_number);
+	int c = snprintf(iter, sz, UPDATE_QUERY_BEGIN);
 
 	if ((size_t) c >= sz)
 		goto error;
@@ -350,7 +345,7 @@ static void do_updates(multiple_query_ctx_t *query_ctx)
 	iter += c;
 	sz -= c;
 
-	for (size_t i = 1; i < query_ctx->num_result; i++) {
+	for (size_t i = 0; i < query_ctx->num_result; i++) {
 		query_ctx->res[i].random_number = 1 + get_random_number(MAX_ID,
 		                                                        &query_ctx->ctx->random_seed);
 		c = snprintf(iter,
@@ -366,6 +361,24 @@ static void do_updates(multiple_query_ctx_t *query_ctx)
 		sz -= c;
 	}
 
+	c = snprintf(iter, sz, UPDATE_QUERY_MIDDLE, query_ctx->res->id);
+
+	if ((size_t) c >= sz)
+		goto error;
+
+	iter += c;
+	sz -= c;
+
+	for (size_t i = 1; i < query_ctx->num_result; i++) {
+		c = snprintf(iter, sz, UPDATE_QUERY_ELEM2, query_ctx->res[i].id);
+
+		if ((size_t) c >= sz)
+			goto error;
+
+		iter += c;
+		sz -= c;
+	}
+
 	c = snprintf(iter, sz, UPDATE_QUERY_END);
 
 	if ((size_t) c >= sz)