[Cluster-devel] cluster/cmirror/src cluster.c functions.c local.c
jbrassow at sourceware.org
jbrassow at sourceware.org
Tue Feb 5 22:12:55 UTC 2008
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:
More information about the Cluster-devel
mailing list