From 15b079d79c99ed77b90ed510f9666612d518c5cc Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 7 Nov 2011 19:58:54 +0300 Subject: [PATCH] Release read lock lately. --- src/buffer.c | 3 +++ src/kvstorage_server.c | 26 ++++++++++++++++++++++++-- src/kvstorage_server.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index e647374c2..2413fbbeb 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -187,6 +187,9 @@ write_buffers (gint fd, rspamd_io_dispatcher_t * d, gboolean is_delayed) len = g_queue_get_length (d->out_buffers); if (len > 1) { /* IOV version */ + + /* Unset delayed as actually we HAVE buffers to write */ + is_delayed = TRUE; cur = d->out_buffers->tail; iov = g_slice_alloc (len * sizeof (struct iovec)); i = 0; diff --git a/src/kvstorage_server.c b/src/kvstorage_server.c index 370384159..620c5c73f 100644 --- a/src/kvstorage_server.c +++ b/src/kvstorage_server.c @@ -396,6 +396,8 @@ kvstorage_read_socket (f_str_t * in, void *arg) } } else { + session->elt = elt; + if (!is_redis) { r = rspamd_snprintf (outbuf, sizeof (outbuf), "VALUE %s %ud %ud" CRLF, ELT_KEY (elt), elt->flags, elt->size); @@ -421,7 +423,10 @@ kvstorage_read_socket (f_str_t * in, void *arg) res = rspamd_dispatcher_write (session->dispather, CRLF, sizeof (CRLF) - 1, FALSE, TRUE); } - g_static_rw_lock_reader_unlock (&session->cf->storage->rwlock); + if (!res) { + g_static_rw_lock_reader_unlock (&session->cf->storage->rwlock); + } + return res; } } @@ -525,6 +530,22 @@ kvstorage_read_socket (f_str_t * in, void *arg) return TRUE; } +/* + * Called if buffers were written + */ +static gboolean +kvstorage_write_socket (void *arg) +{ + struct kvstorage_session *session = (struct kvstorage_session *) arg; + + if (session->elt) { + g_static_rw_lock_reader_unlock (&session->cf->storage->rwlock); + session->elt = NULL; + } + + return TRUE; +} + /* * Called if something goes wrong */ @@ -573,8 +594,9 @@ thr_accept_socket (gint fd, short what, void *arg) session->thr = thr; session->sock = nfd; session->dispather = rspamd_create_dispatcher (thr->ev_base, nfd, BUFFER_LINE, - kvstorage_read_socket, NULL, + kvstorage_read_socket, kvstorage_write_socket, kvstorage_err_socket, thr->tv, session); + session->elt = NULL; if (su.ss.ss_family == AF_UNIX) { session->client_addr.s_addr = INADDR_NONE; diff --git a/src/kvstorage_server.h b/src/kvstorage_server.h index 4f9e8c951..3b475ebd0 100644 --- a/src/kvstorage_server.h +++ b/src/kvstorage_server.h @@ -73,6 +73,7 @@ struct kvstorage_session { gchar *key; struct kvstorage_config *cf; struct kvstorage_worker_thread *thr; + struct rspamd_kv_element *elt; struct in_addr client_addr; gint sock; guint flags; -- 2.39.5