From mboxrd@z Thu Jan 1 00:00:00 1970 From: jbrassow@sourceware.org Date: 5 Feb 2008 22:12:55 -0000 Subject: [Cluster-devel] cluster/cmirror/src cluster.c functions.c local.c Message-ID: <20080205221255.14611.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: jbrassow at sourceware.org 2008-02-05 22:12:54 Modified files: cmirror/src : cluster.c functions.c local.c Log message: - allocate additional transfer struct when necessary - fix ordering of clustered_disk table output - respond to get_sync_count requests when suspended (as required by mirror) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/cluster.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.12&r2=1.1.2.13 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/functions.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.11&r2=1.1.2.12 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/local.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.11&r2=1.1.2.12 --- cluster/cmirror/src/Attic/cluster.c 2008/02/04 18:27:20 1.1.2.12 +++ cluster/cmirror/src/Attic/cluster.c 2008/02/05 22:12:54 1.1.2.13 @@ -197,9 +197,26 @@ orig_tfr = queue_remove_match(cluster_queue, clog_tfr_cmp, tfr); if (!orig_tfr) { + struct list_head l, *p, *n; + struct clog_tfr *t; + /* Unable to find match for response */ - LOG_ERROR("No match for cluster response: %s/%s", - RQ_TYPE(tfr->request_type), tfr->uuid); + + LOG_ERROR("[%s] No match for cluster response: %s:%llu", + SHORT_UUID(tfr->uuid), RQ_TYPE(tfr->request_type), + (unsigned long long)tfr->seq); + + queue_remove_all(&l, cluster_queue); + LOG_ERROR("Current list:"); + list_for_each_safe(p, n, &l) { + list_del_init(p); + t = (struct clog_tfr *)p; + LOG_ERROR("[%s] %s:%llu", SHORT_UUID(t->uuid), + RQ_TYPE(t->request_type), + (unsigned long long)t->seq); + queue_add(t, cluster_queue); + } + r = -EINVAL; goto out; } @@ -405,8 +422,12 @@ tfr = queue_remove(free_queue); if (!tfr) { - LOG_ERROR("No clog_tfr struct available"); - return -ENOMEM; + LOG_PRINT("export_checkpoint: Preallocated transfer structs exhausted"); + tfr = malloc(DM_CLOG_TFR_SIZE); + if (!tfr) { + LOG_ERROR("export_checkpoint: Unable to allocate transfer structs"); + return -ENOMEM; + } } memset(tfr, 0, sizeof(*tfr)); tfr->request_type = DM_CLOG_CHECKPOINT_READY; @@ -715,9 +736,15 @@ LOG_DBG("Log not valid yet, storing request"); startup_tfr = queue_remove(free_queue); if (!startup_tfr) { - LOG_ERROR("Supply of transfer structs exhausted"); - r = -ENOMEM; /* FIXME: Better error #? */ - goto out; + LOG_PRINT("cpg_message_callback: Preallocated" + " transfer structs exhausted"); + startup_tfr = malloc(DM_CLOG_TFR_SIZE); + if (!startup_tfr) { + LOG_ERROR("cpg_message_callback: Unable to" + " allocate transfer structs"); + r = -ENOMEM; /* FIXME: Better error #? */ + goto out; + } } memcpy(startup_tfr, tfr, sizeof(*tfr) + tfr->data_size); @@ -847,7 +874,7 @@ exit(1); } my_cluster_id = joined_list[i].nodeid; - LOG_PRINT("Setting my cluster id: %u", my_cluster_id); + LOG_DBG("Setting my cluster id: %u", my_cluster_id); } } } --- cluster/cmirror/src/Attic/functions.c 2008/02/04 18:27:20 1.1.2.11 +++ cluster/cmirror/src/Attic/functions.c 2008/02/05 22:12:54 1.1.2.12 @@ -1209,6 +1209,15 @@ uint64_t *sync_count = (uint64_t *)tfr->data; struct log_c *lc = get_log(tfr->uuid); + /* + * FIXME: Mirror requires us to be able to ask for + * the sync count while pending... but I don't like + * it because other machines may not be suspended and + * the stored value may not be accurate. + */ + if (!lc) + lc = get_pending_log(tfr->uuid); + if (!lc) return -EINVAL; @@ -1294,10 +1303,9 @@ } params = (lc->sync == DEFAULTSYNC) ? 4 : 5; - tfr->data_size = sprintf(data, "clustered_disk %d %u %d:%d %s %sblock_on_error ", - params, lc->region_size, - major(statbuf.st_rdev), minor(statbuf.st_rdev), - lc->uuid, + tfr->data_size = sprintf(data, "clustered_disk %d %d:%d %u %s %sblock_on_error ", + params, major(statbuf.st_rdev), minor(statbuf.st_rdev), + lc->region_size, lc->uuid, (lc->sync == DEFAULTSYNC) ? "" : (lc->sync == NOSYNC) ? "nosync " : "sync "); return 0; --- cluster/cmirror/src/Attic/local.c 2008/02/04 18:27:20 1.1.2.11 +++ cluster/cmirror/src/Attic/local.c 2008/02/05 22:12:54 1.1.2.12 @@ -80,8 +80,12 @@ * The kernel must retry */ if (!(*tfr = queue_remove(free_queue))) { - LOG_ERROR("Failed to get clog_tfr from free_queue"); - return -ENOMEM; + LOG_PRINT("kernel_recv: Preallocated transfer structs exhausted"); + *tfr = malloc(DM_CLOG_TFR_SIZE); + if (!*tfr) { + LOG_ERROR("kernel_recv: Unable to allocate transfer struct"); + return -ENOMEM; + } } memset(*tfr, 0, DM_CLOG_TFR_SIZE); @@ -143,7 +147,7 @@ */ static int do_local_work(void *data) { - int r, i; + int r; struct clog_tfr *tfr = NULL; ENTER(); @@ -158,6 +162,7 @@ case DM_CLOG_CTR: case DM_CLOG_DTR: case DM_CLOG_IN_SYNC: + case DM_CLOG_GET_SYNC_COUNT: case DM_CLOG_STATUS_INFO: case DM_CLOG_STATUS_TABLE: case DM_CLOG_PRESUSPEND: