summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2017-10-16 16:08:37 -0700
committerdormando <dormando@rydia.net>2017-11-28 14:18:05 -0800
commit76d0a13a1e49caf5bbaea4e6165a3568090b5366 (patch)
treedac031d46c0792994c856e893d86b3bc500a293e
parent2c4528697f404cdbfc9bfe319d7e2ed22c291a31 (diff)
downloadmemcached-76d0a13a1e49caf5bbaea4e6165a3568090b5366.tar.gz
extstore: pause compaction thread with hash expand
could potentially cause weirdness when the hash table is swapped.
-rw-r--r--storage.c14
-rw-r--r--storage.h2
-rw-r--r--thread.c9
3 files changed, 25 insertions, 0 deletions
diff --git a/storage.c b/storage.c
index eb0ea95..8a68bbe 100644
--- a/storage.c
+++ b/storage.c
@@ -177,6 +177,7 @@ static int storage_compact_check(void *storage, logger *l,
}
static pthread_t storage_compact_tid;
+static pthread_mutex_t storage_compact_plock;
#define MIN_STORAGE_COMPACT_SLEEP 10000
#define MAX_STORAGE_COMPACT_SLEEP 2000000
@@ -328,12 +329,15 @@ static void *storage_compact_thread(void *arg) {
wrap.io.len = settings.ext_wbuf_size;
wrap.io.mode = OBJ_IO_READ;
wrap.io.cb = _storage_compact_cb;
+ pthread_mutex_lock(&storage_compact_plock);
while (1) {
+ pthread_mutex_unlock(&storage_compact_plock);
if (to_sleep) {
extstore_run_maint(storage);
usleep(to_sleep);
}
+ pthread_mutex_lock(&storage_compact_plock);
if (!compacting && storage_compact_check(storage, l,
&page_id, &page_version, &page_size, &drop_unread)) {
@@ -393,6 +397,7 @@ static void *storage_compact_thread(void *arg) {
}
// TODO
+// logger needs logger_destroy() to exist/work before this is safe.
/*int stop_storage_compact_thread(void) {
int ret;
pthread_mutex_lock(&lru_maintainer_lock);
@@ -406,9 +411,18 @@ static void *storage_compact_thread(void *arg) {
return 0;
}*/
+void storage_compact_pause(void) {
+ pthread_mutex_lock(&storage_compact_plock);
+}
+
+void storage_compact_resume(void) {
+ pthread_mutex_unlock(&storage_compact_plock);
+}
+
int start_storage_compact_thread(void *arg) {
int ret;
+ pthread_mutex_init(&storage_compact_plock, NULL);
if ((ret = pthread_create(&storage_compact_tid, NULL,
storage_compact_thread, arg)) != 0) {
fprintf(stderr, "Can't create storage_compact thread: %s\n",
diff --git a/storage.h b/storage.h
index 3bfeacc..7af6cc0 100644
--- a/storage.h
+++ b/storage.h
@@ -3,5 +3,7 @@
int lru_maintainer_store(void *storage, const int clsid);
int start_storage_compact_thread(void *arg);
+void storage_compact_pause(void);
+void storage_compact_resume(void);
#endif
diff --git a/thread.c b/thread.c
index e9f40a6..df05d5f 100644
--- a/thread.c
+++ b/thread.c
@@ -3,6 +3,9 @@
* Thread management for memcached.
*/
#include "memcached.h"
+#ifdef EXTSTORE
+#include "storage.h"
+#endif
#include <assert.h>
#include <stdio.h>
#include <errno.h>
@@ -139,6 +142,9 @@ void pause_threads(enum pause_thread_types type) {
lru_maintainer_pause();
slabs_rebalancer_pause();
lru_crawler_pause();
+#ifdef EXTSTORE
+ storage_compact_pause();
+#endif
case PAUSE_WORKER_THREADS:
buf[0] = 'p';
pthread_mutex_lock(&worker_hang_lock);
@@ -147,6 +153,9 @@ void pause_threads(enum pause_thread_types type) {
lru_maintainer_resume();
slabs_rebalancer_resume();
lru_crawler_resume();
+#ifdef EXTSTORE
+ storage_compact_resume();
+#endif
case RESUME_WORKER_THREADS:
pthread_mutex_unlock(&worker_hang_lock);
break;