瀏覽代碼

H2O: Use 3 database connections per thread (#7789)

Also, remove some unused code.
Anton Kirilov 2 年之前
父節點
當前提交
e39cec776a

+ 1 - 1
frameworks/C/h2o/h2o.sh

@@ -27,7 +27,7 @@ fi
 if [[ "$BENCHMARK_ENV" = "Azure" ]]; then
 	DB_CONN=2
 else
-	DB_CONN=2
+	DB_CONN=3
 fi
 
 build_h2o_app()

+ 0 - 148
frameworks/C/h2o/src/cache.c

@@ -1,148 +0,0 @@
-/*
- Copyright (c) 2018 Anton Valentinov Kirilov
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- associated documentation files (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge, publish, distribute,
- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all copies or
- substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
- NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
- OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <assert.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <h2o/cache.h>
-
-#include "cache.h"
-#include "error.h"
-#include "utility.h"
-
-// Increasing the number of caches by the following factor reduces contention; must be a power of 2.
-#define CONCURRENCY_FACTOR 4
-
-static size_t get_index(size_t n, h2o_cache_hashcode_t keyhash)
-{
-	assert(is_power_of_2(n));
-	return keyhash & (n - 1);
-}
-
-int cache_create(size_t concurrency,
-                 size_t capacity,
-                 uint64_t duration,
-                 void (*destroy_cb)(h2o_iovec_t value),
-                 cache_t *cache)
-{
-	memset(cache, 0, sizeof(*cache));
-	assert(is_power_of_2(CONCURRENCY_FACTOR));
-	// Rounding up to a power of 2 simplifies the calculations a little bit, and, as any increase in
-	// the number of caches, potentially reduces thread contention.
-	cache->cache_num = CONCURRENCY_FACTOR * round_up_to_power_of_2(concurrency);
-	cache->cache_num = MAX(cache->cache_num, 1);
-	capacity = (capacity + cache->cache_num - 1) / cache->cache_num;
-	cache->cache = malloc(cache->cache_num * sizeof(*cache->cache));
-
-	if (!cache->cache)
-		return 1;
-
-	cache->cache_lock = malloc(cache->cache_num * sizeof(*cache->cache_lock));
-
-	if (!cache->cache_lock)
-		goto error;
-
-	for (size_t i = 0; i < cache->cache_num; i++) {
-		cache->cache[i] = h2o_cache_create(0, capacity, duration, destroy_cb);
-
-		if (!cache->cache[i] || pthread_spin_init(cache->cache_lock + i, PTHREAD_PROCESS_PRIVATE)) {
-			if (cache->cache[i])
-				h2o_cache_destroy(cache->cache[i]);
-
-			cache->cache_num = i;
-			cache_destroy(cache);
-			return 1;
-		}
-	}
-
-	return 0;
-error:
-	free(cache->cache);
-	return 1;
-}
-
-void cache_destroy(cache_t *cache)
-{
-	if (cache->cache) {
-		assert(cache->cache_lock);
-
-		for (size_t i = 0; i < cache->cache_num; i++) {
-			h2o_cache_destroy(cache->cache[i]);
-			pthread_spin_destroy(cache->cache_lock + i);
-		}
-
-		free(cache->cache);
-		free((void *) cache->cache_lock);
-		cache->cache = NULL;
-		cache->cache_lock = NULL;
-	}
-	else
-		assert(!cache->cache_lock);
-}
-
-h2o_cache_ref_t *cache_fetch(cache_t *cache,
-                             uint64_t now,
-                             h2o_iovec_t key,
-                             h2o_cache_hashcode_t keyhash)
-{
-	if (!keyhash)
-		keyhash = h2o_cache_calchash(key.base, key.len);
-
-	const size_t idx = get_index(cache->cache_num, keyhash);
-	pthread_spinlock_t * const lock = cache->cache_lock + idx;
-
-	CHECK_ERROR(pthread_spin_lock, lock);
-
-	h2o_cache_ref_t * const ret = h2o_cache_fetch(cache->cache[idx], now, key, keyhash);
-
-	CHECK_ERROR(pthread_spin_unlock, lock);
-	return ret;
-}
-
-void cache_release(cache_t *cache, h2o_cache_ref_t *ref, h2o_cache_hashcode_t keyhash)
-{
-	if (!keyhash)
-		keyhash = h2o_cache_calchash(ref->key.base, ref->key.len);
-
-	const size_t idx = get_index(cache->cache_num, keyhash);
-
-	h2o_cache_release(cache->cache[idx], ref);
-}
-
-int cache_set(uint64_t now,
-              h2o_iovec_t key,
-              h2o_cache_hashcode_t keyhash,
-              h2o_iovec_t value,
-              cache_t *cache)
-{
-	if (!keyhash)
-		keyhash = h2o_cache_calchash(key.base, key.len);
-
-	const size_t idx = get_index(cache->cache_num, keyhash);
-	pthread_spinlock_t * const lock = cache->cache_lock + idx;
-
-	CHECK_ERROR(pthread_spin_lock, lock);
-
-	const int ret = h2o_cache_set(cache->cache[idx], now, key, keyhash, value);
-
-	CHECK_ERROR(pthread_spin_unlock, lock);
-	return ret;
-}

+ 0 - 51
frameworks/C/h2o/src/cache.h

@@ -1,51 +0,0 @@
-/*
- Copyright (c) 2018 Anton Valentinov Kirilov
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- associated documentation files (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge, publish, distribute,
- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all copies or
- substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
- NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
- OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef CACHE_H_
-
-#define CACHE_H_
-
-#include <pthread.h>
-#include <stdint.h>
-#include <h2o/cache.h>
-
-typedef struct {
-	h2o_cache_t **cache;
-	pthread_spinlock_t *cache_lock;
-	size_t cache_num;
-} cache_t;
-
-int cache_create(size_t concurrency,
-                 size_t capacity,
-                 uint64_t duration,
-                 void (*destroy_cb)(h2o_iovec_t value),
-                 cache_t *cache);
-void cache_destroy(cache_t *cache);
-h2o_cache_ref_t *cache_fetch(cache_t *cache,
-                             uint64_t now,
-                             h2o_iovec_t key,
-                             h2o_cache_hashcode_t keyhash);
-void cache_release(cache_t *cache, h2o_cache_ref_t *ref, h2o_cache_hashcode_t keyhash);
-int cache_set(uint64_t now,
-              h2o_iovec_t key,
-              h2o_cache_hashcode_t keyhash,
-              h2o_iovec_t value,
-              cache_t *cache);
-
-#endif // CACHE_H_

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

@@ -218,7 +218,7 @@ static void on_database_connect_read_ready(h2o_socket_t *sock, const char *err)
 		return;
 	}
 	else if (send_status) {
-		h2o_socket_notify_write(conn->sock, on_database_write_ready);
+		h2o_socket_notify_write(conn->sock, on_database_connect_write_ready);
 		return;
 	}
 

+ 0 - 18
frameworks/C/h2o/src/utility.c

@@ -220,24 +220,6 @@ uint32_t get_random_number(uint32_t max_rand, unsigned int *seed)
 	return ret / bucket_size;
 }
 
-bool is_power_of_2(size_t x)
-{
-	return !!x & !(x & (x - 1));
-}
-
-size_t round_up_to_power_of_2(size_t x)
-{
-	static_assert(sizeof(size_t) == sizeof(unsigned long),
-	              "The size_t type must have the same size as unsigned long.");
-
-	size_t ret = (SIZE_MAX ^ SIZE_MAX >> 1) >> __builtin_clzl(x);
-
-	if (x - ret)
-		ret <<= 1;
-
-	return ret;
-}
-
 // merge sort
 list_t *sort_list(list_t *head, int (*compare)(const list_t *, const list_t *))
 {

+ 1 - 4
frameworks/C/h2o/src/utility.h

@@ -33,8 +33,7 @@
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
 // mainly used to silence compiler warnings about unused function parameters
 #define IGNORE_FUNCTION_PARAMETER(p) ((void) (p))
-// Do not use the following MAX and MIN macros with parameters that have side effects.
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
+// Do not use the following MIN macro with parameters that have side effects.
 #define MIN(x, y) ((x) < (y) ? (x) : (y))
 #define TOSTRING(x) # x
 #define MKSTR(x) TOSTRING(x)
@@ -50,8 +49,6 @@ yajl_gen_status gen_integer(long long number, char *buf, size_t len, yajl_gen ge
 json_generator_t *get_json_generator(list_t **pool, size_t *gen_num);
 size_t get_maximum_cache_line_size(void);
 uint32_t get_random_number(uint32_t max_rand, unsigned int *seed);
-bool is_power_of_2(size_t x);
-size_t round_up_to_power_of_2(size_t x);
 // stable sort
 list_t *sort_list(list_t *head, int (*compare)(const list_t *, const list_t *));