enum rspamd_redis_connection_state {
RSPAMD_REDIS_DISCONNECTED = 0,
RSPAMD_REDIS_CONNECTED,
+ RSPAMD_REDIS_REQUEST_SENT,
RSPAMD_REDIS_TIMEDOUT,
RSPAMD_REDIS_TERMINATED
};
{
struct redis_stat_runtime *rt = REDIS_RUNTIME (data);
- if (rt->conn_state != RSPAMD_REDIS_CONNECTED) {
+ if (rt->conn_state == RSPAMD_REDIS_TERMINATED) {
rt->conn_state = RSPAMD_REDIS_TERMINATED;
event_del (&rt->timeout_event);
REF_RELEASE (rt);
{
struct redis_stat_runtime *rt = REDIS_RUNTIME (data);
- if (rt->conn_state != RSPAMD_REDIS_CONNECTED) {
+ if (rt->conn_state == RSPAMD_REDIS_TERMINATED) {
rt->conn_state = RSPAMD_REDIS_TERMINATED;
event_del (&rt->timeout_event);
REF_RELEASE (rt);
rspamd_upstream_name (rt->selected));
rspamd_upstream_fail (rt->selected);
- if (rt->conn_state != RSPAMD_REDIS_TERMINATED) {
+ if (rt->conn_state == RSPAMD_REDIS_REQUEST_SENT) {
rspamd_session_remove_event (task->s, rspamd_redis_fin, rt);
}
else {
rspamd_session_remove_event (task->s, rspamd_redis_fin, rt);
}
+
+ rt->conn_state = RSPAMD_REDIS_CONNECTED;
}
else {
msg_err_task ("error getting reply from redis server %s: %s",
rspamd_session_remove_event (task->s, rspamd_redis_fin_learn, rt);
}
- if (rt->conn_state == RSPAMD_REDIS_CONNECTED) {
+ if (rt->conn_state != RSPAMD_REDIS_TERMINATED) {
rt->conn_state = RSPAMD_REDIS_TERMINATED;
redisAsyncFree (rt->redis);
}
g_assert (rt->redis != NULL);
redisLibeventAttach (rt->redis, task->ev_base);
- rspamd_session_add_event (task->s, rspamd_redis_fin, rt,
- rspamd_redis_stat_quark ());
+ rspamd_redis_maybe_auth (ctx, rt->redis);
- /* Now check stats */
- event_set (&rt->timeout_event, -1, EV_TIMEOUT, rspamd_redis_timeout, rt);
- event_base_set (task->ev_base, &rt->timeout_event);
- double_to_tv (ctx->timeout, &tv);
- event_add (&rt->timeout_event, &tv);
- /* Cleared by timeout */
- REF_RETAIN (rt);
+ if (redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s",
+ rt->redis_object_expanded, "learns") == REDIS_OK) {
+ rt->conn_state = RSPAMD_REDIS_REQUEST_SENT;
- rspamd_redis_maybe_auth (ctx, rt->redis);
- redisAsyncCommand (rt->redis, rspamd_redis_connected, rt, "HGET %s %s",
- rt->redis_object_expanded, "learns");
+ rspamd_session_add_event (task->s, rspamd_redis_fin, rt,
+ rspamd_redis_stat_quark ());
+
+ event_set (&rt->timeout_event, -1, EV_TIMEOUT, rspamd_redis_timeout, rt);
+ event_base_set (task->ev_base, &rt->timeout_event);
+ double_to_tv (ctx->timeout, &tv);
+ event_add (&rt->timeout_event, &tv);
+ /* Cleared by timeout */
+ REF_RETAIN (rt);
+ }
return rt;
}
ret = redisAsyncFormattedCommand (rt->redis, rspamd_redis_processed, rt,
query->str, query->len);
if (ret == REDIS_OK) {
+ rt->conn_state = RSPAMD_REDIS_REQUEST_SENT;
rspamd_session_add_event (task->s, rspamd_redis_fin, rt,
rspamd_redis_stat_quark ());
/* Reset timeout */
{
struct redis_stat_runtime *rt = REDIS_RUNTIME (runtime);
- if (rt->conn_state == RSPAMD_REDIS_CONNECTED) {
+ if (rt->conn_state != RSPAMD_REDIS_TERMINATED) {
event_del (&rt->timeout_event);
rt->conn_state = RSPAMD_REDIS_TERMINATED;