From 1cff549fb60c2e14706272371dd62a0e2acefed5 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 24 Mar 2017 20:11:14 +0100 Subject: lib: Fix invoke_ids and failure handling in CDAP When something fails, the successfully sent CDAP messages should be reported back. Invoke_ids were not correctly released. --- src/lib/cdap.c | 59 ++++++++++++++++++---------------------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/lib/cdap.c b/src/lib/cdap.c index 524983c2..a60bf8f9 100644 --- a/src/lib/cdap.c +++ b/src/lib/cdap.c @@ -300,6 +300,7 @@ static void * sdu_reader(void * o) rcvd->data = malloc(rcvd->len); if (rcvd->data == NULL) { cdap__free_unpacked(msg, NULL); + free(rcvd->name); free(rcvd); continue; } @@ -339,8 +340,8 @@ static void * sdu_reader(void * o) } cdap__free_unpacked(msg, NULL); - } + return (void *) 0; } @@ -631,16 +632,7 @@ cdap_key_t * cdap_request_send(struct cdap * instance, iid = next_invoke_id(instance); if (iid == INVALID_INVOKE_ID) { pthread_rwlock_unlock(&instance->flows_lock); - while(key > keys) { - struct cdap_req * r = - cdap_sent_get_by_key(instance, - *(--key)); - cdap_sent_del(instance, r); - cdap_req_destroy(r); - } - - free(keys); - return NULL; + return keys; } msg.invoke_id = iid; @@ -652,39 +644,21 @@ cdap_key_t * cdap_request_send(struct cdap * instance, req = cdap_sent_add(instance, e->fd, *key); if (req == NULL) { pthread_rwlock_unlock(&instance->flows_lock); - while(key > keys) { - struct cdap_req * r = - cdap_sent_get_by_key(instance, - *(--key)); - cdap_sent_del(instance, r); - release_invoke_id(instance, - key_to_invoke_id(r->key)); - cdap_req_destroy(r); - } release_invoke_id(instance, iid); - free(keys); - return NULL; + return keys; } ret = write_msg(e->fd, &msg); if (ret == -ENOMEM) { pthread_rwlock_unlock(&instance->flows_lock); - while(key >= keys) { - struct cdap_req * r = - cdap_sent_get_by_key(instance, *key); - cdap_sent_del(instance, r); - release_invoke_id(instance, - key_to_invoke_id(r->key)); - cdap_req_destroy(r); - } - - free(keys); - return NULL; + cdap_sent_del(instance, req); + release_invoke_id(instance, iid); + return keys; } if (ret < 0) { - release_invoke_id(instance, iid); cdap_sent_del(instance, req); + release_invoke_id(instance, iid); } ++key; @@ -704,7 +678,8 @@ int cdap_reply_wait(struct cdap * instance, struct cdap_req * r; invoke_id_t iid = key_to_invoke_id(key); - if (instance == NULL || iid == INVALID_INVOKE_ID) + if (instance == NULL || iid == INVALID_INVOKE_ID + || (data != NULL && len == NULL)) return -EINVAL; r = cdap_sent_get_by_key(instance, key); @@ -712,11 +687,11 @@ int cdap_reply_wait(struct cdap * instance, return -EINVAL; ret = cdap_req_wait(r); - if (ret < 0) + if (ret < 0) { + cdap_sent_del(instance, r); + release_invoke_id(instance, iid); return ret; - - if (r->response) - return r->response; + } assert(ret == 0); @@ -725,11 +700,12 @@ int cdap_reply_wait(struct cdap * instance, *len = r->data.len; } - cdap_sent_del(instance, r); + ret = r->response; + cdap_sent_del(instance, r); release_invoke_id(instance, iid); - return 0; + return ret; } cdap_key_t cdap_request_wait(struct cdap * instance, @@ -764,6 +740,7 @@ cdap_key_t cdap_request_wait(struct cdap * instance, *flags = rcvd->flags; rcvd->name = NULL; + rcvd->data = NULL; return invoke_id_to_key(rcvd->iid); } -- cgit v1.2.3 From 006da084997e7a27eac5f037356e269fedac00bb Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 25 Mar 2017 11:26:11 +0100 Subject: ipcpd: Register nb_notifiers before starting gam --- src/ipcpd/normal/ribmgr.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/ribmgr.c b/src/ipcpd/normal/ribmgr.c index 2696026a..772269ae 100644 --- a/src/ipcpd/normal/ribmgr.c +++ b/src/ipcpd/normal/ribmgr.c @@ -168,6 +168,7 @@ static void * reader(void * o) break; case -EFAULT: log_warn("Hash mismatch, not in sync."); + free(data); break; default: log_warn("Error unpacking %s.", name); @@ -194,6 +195,7 @@ static void * reader(void * o) break; case -EFAULT: log_warn("Hash mismatch, not yet in sync."); + free(data); break; default: log_warn("Error unpacking %s.", name); @@ -223,7 +225,6 @@ static void * reader(void * o) log_err("Failed to send CDAP reply."); continue; } - break; case CDAP_START: case CDAP_STOP: @@ -343,18 +344,9 @@ int ribmgr_init(void) return -1; } - ribmgr.gam = gam_create(pg, ribmgr.nbs, ribmgr.ae); - if (ribmgr.gam == NULL) { - log_err("Failed to create gam."); - connmgr_ae_destroy(ribmgr.ae); - nbs_destroy(ribmgr.nbs); - return -1; - } - ribmgr.cdap = cdap_create(); if (ribmgr.cdap == NULL) { log_err("Failed to create CDAP instance."); - gam_destroy(ribmgr.gam); connmgr_ae_destroy(ribmgr.ae); nbs_destroy(ribmgr.nbs); return -1; @@ -364,7 +356,16 @@ int ribmgr_init(void) if (nbs_reg_notifier(ribmgr.nbs, &ribmgr.nb_notifier)) { log_err("Failed to register notifier."); cdap_destroy(ribmgr.cdap); - gam_destroy(ribmgr.gam); + connmgr_ae_destroy(ribmgr.ae); + nbs_destroy(ribmgr.nbs); + return -1; + } + + ribmgr.gam = gam_create(pg, ribmgr.nbs, ribmgr.ae); + if (ribmgr.gam == NULL) { + log_err("Failed to create gam."); + nbs_unreg_notifier(ribmgr.nbs, &ribmgr.nb_notifier); + cdap_destroy(ribmgr.cdap); connmgr_ae_destroy(ribmgr.ae); nbs_destroy(ribmgr.nbs); return -1; -- cgit v1.2.3