From: jbrassow@sourceware.org <jbrassow@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster cmirror/src/Makefile cmirror/src/clust ...
Date: 8 Nov 2007 22:16:55 -0000 [thread overview]
Message-ID: <20071108221655.28383.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: jbrassow at sourceware.org 2007-11-08 22:16:53
Modified files:
cmirror/src : Makefile cluster.c functions.c local.c
cmirror-kernel/src: dm-clog-tfr.c dm-clog-tfr.h
Added files:
cmirror/src : rbtree.c rbtree.h
Log message:
- only write the disk log on a 'flush' not every time a mark/clear
happens
- Add mark request tracking so we don't clear log bits prematurely
(and to reduce number of disk writes).
- Add priority recovery - regions which are being written to take
first priority during recovery
- introduction of CPG flow control
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/rbtree.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/rbtree.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.3&r2=1.3.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/cluster.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.4&r2=1.1.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/functions.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.3&r2=1.1.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror/src/local.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.3&r2=1.1.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-clog-tfr.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-clog-tfr.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.2&r2=1.1.2.3
--- cluster/cmirror/src/Attic/Makefile 2007/11/03 18:37:48 1.3.2.3
+++ cluster/cmirror/src/Attic/Makefile 2007/11/08 22:16:53 1.3.2.4
@@ -23,6 +23,8 @@
echo '-I${incdir}'; else \
echo ''; fi)
+SOURCES = $(shell ls *.c)
+
ifneq (${TMP_INCLUDE}, )
INCLUDE += ${TMP_INCLUDE} -I.
else
@@ -42,7 +44,8 @@
all: ${TARGET}
-clogd: link_mon.c logging.c queues.c local.c cluster.c functions.c clogd.c
+#clogd: rbtree.c link_mon.c logging.c queues.c local.c cluster.c functions.c clogd.c
+clogd: ${SOURCES}
${CC} ${CFLAGS} -o $@ $^ ${LDFLAGS}
no_files:
--- cluster/cmirror/src/Attic/cluster.c 2007/11/05 22:44:03 1.1.2.4
+++ cluster/cmirror/src/Attic/cluster.c 2007/11/08 22:16:53 1.1.2.5
@@ -58,6 +58,27 @@
static struct list_head clog_cpg_list;
/*
+ * flow_control
+ * @handle
+ *
+ * Returns: 1 if flow control needed, 0 otherwise
+ */
+static int flow_control(cpg_handle_t handle)
+{
+ cpg_flow_control_state_t flow_control_state;
+ cpg_error_t error;
+
+ error = cpg_flow_control_state_get(handle, &flow_control_state);
+ if (error != CPG_OK) {
+ LOG_ERROR("Failed to get flow control state. Reason: %d", error);
+ /* FIXME: Better error handling */
+ return 0;
+ }
+
+ return (flow_control_state == CPG_FLOW_CONTROL_ENABLED) ? 1 : 0;
+}
+
+/*
* cluster_send
* @tfr
*
@@ -86,6 +107,16 @@
iov.iov_base = tfr;
iov.iov_len = sizeof(struct clog_tfr) + tfr->data_size;
+ while (flow_control(entry->handle)) {
+ /*
+ * FIXME: Don't need to sleep this long
+ *
+ * ... or, we could dispatch the queued messages here.
+ */
+ LOG_PRINT("Flow control enabled. Delaying msg [%s]",
+ RQ_TYPE(tfr->request_type));
+ sleep(1);
+ }
r = cpg_mcast_joined(entry->handle, CPG_TYPE_AGREED, &iov, 1);
EXIT();
@@ -271,7 +302,7 @@
char buf[32];
ENTER();
- LOG_PRINT("Sending checkpointed data to %u", cp->requester);
+ LOG_DBG("Sending checkpointed data to %u", cp->requester);
len = snprintf((char *)(name.value), SA_MAX_NAME_LENGTH, "bitmaps_%u", cp->requester);
name.length = len;
@@ -540,6 +571,9 @@
ENTER();
list_for_each_entry_safe(entry, tmp, &clog_cpg_list, list) {
r = cpg_dispatch(entry->handle, CPG_DISPATCH_ALL);
+ if (r != SA_AIS_OK)
+ LOG_ERROR("cpg_dispatch failed: %d", r);
+
for (cp = entry->checkpoint_list; cp;) {
LOG_ERROR("Checkpoint data available for node %u",
cp->requester);
@@ -575,7 +609,6 @@
int i_am_server;
struct clog_tfr *tfr = msg;
struct clog_tfr *startup_tfr = NULL;
- struct clog_tfr *cp_tfr = NULL;
struct clog_cpg *match;
ENTER();
@@ -603,57 +636,31 @@
i_am_server = (my_cluster_id == match->lowest_id) ? 1 : 0;
if (tfr->request_type == DM_CLOG_CHECKPOINT_READY) {
- /* Redundant checkpoints ignored due to match->valid */
if (my_cluster_id == tfr->originator) {
- switch (import_checkpoint(match, match->valid)) {
- case 0:
- if (!match->valid) {
- LOG_DBG("Checkpoint data recieved. Log is now valid");
- match->valid = 1;
- while ((startup_tfr = queue_remove(match->startup_queue))) {
- LOG_DBG("Processing delayed request %d: %s",
- match->startup_queue->count,
- RQ_TYPE(startup_tfr->request_type));
- r = handle_cluster_request(startup_tfr, i_am_server);
-
- if (r) {
- LOG_ERROR("Error while processing delayed CPG message");
- goto out;
- } else {
- queue_add(startup_tfr, free_queue);
- }
- }
- }
-
- break;
- case -EAGAIN:
- LOG_PRINT("Checkpoint data empty. Requesting new checkpoint.");
-
- cp_tfr = queue_remove(free_queue);
- if (!cp_tfr) {
- /* FIXME: better error handling */
- LOG_ERROR("No clog_tfr struct available");
- goto out;
- }
- memset(cp_tfr, 0, sizeof(*cp_tfr));
- cp_tfr->request_type = DM_CLOG_CHECKPOINT_REQUEST;
-
- cp_tfr->originator = my_cluster_id;
-
- strncpy(cp_tfr->uuid, tfr->uuid, CPG_MAX_NAME_LENGTH);
-
- if ((r = cluster_send(cp_tfr))) {
- /* FIXME: better error handling */
- LOG_ERROR("Failed to send checkpoint ready notice");
- queue_add(cp_tfr, free_queue);
- goto out;
- }
- queue_add(cp_tfr, free_queue);
-
- break;
- default:
+ /* Redundant checkpoints ignored if match->valid */
+ if (import_checkpoint(match, match->valid)) {
LOG_ERROR("Failed to import checkpoint");
/* Could we retry? */
+ goto out;
+ } else if (!match->valid) {
+ LOG_DBG("Checkpoint data recieved. Log is now valid");
+ match->valid = 1;
+ while ((startup_tfr = queue_remove(match->startup_queue))) {
+ LOG_DBG("Processing delayed request %d: %s",
+ match->startup_queue->count,
+ RQ_TYPE(startup_tfr->request_type));
+ r = handle_cluster_request(startup_tfr, i_am_server);
+
+ if (r) {
+ LOG_ERROR("Error while processing delayed CPG message");
+ /*
+ * FIXME: If we error out here, we will never get
+ * another opportunity to retry these requests
+ */
+ goto out;
+ }
+ queue_add(startup_tfr, free_queue);
+ }
}
}
goto out;
@@ -760,8 +767,8 @@
(member_list_entries == 1) && (joined_list_entries == 1) &&
(member_list[0].nodeid == joined_list[0].nodeid)) {
match->lowest_id = my_cluster_id = joined_list[0].nodeid;
- LOG_PRINT("I am the log server (and first to join) for %s",
- match->name.value);
+ LOG_DBG("I am the log server (and first to join) for %s",
+ match->name.value);
match->valid = 1;
goto out;
}
@@ -789,7 +796,7 @@
if (match->lowest_id > member_list[i].nodeid)
match->lowest_id = member_list[i].nodeid;
- LOG_PRINT("Server is now %u", match->lowest_id);
+ LOG_DBG("Server is now %u", match->lowest_id);
/*
* If I am part of the joining list, I do not send checkpoints
--- cluster/cmirror/src/Attic/functions.c 2007/11/05 22:44:03 1.1.2.3
+++ cluster/cmirror/src/Attic/functions.c 2007/11/08 22:16:53 1.1.2.4
@@ -15,6 +15,7 @@
#include "common.h"
#include "cluster.h"
#include "logging.h"
+#include "rbtree.h"
#define BYTE_SHIFT 3
@@ -27,6 +28,14 @@
#define MIRROR_DISK_VERSION 2
#define LOG_OFFSET 2
+/*
+ * Used by the 'touched' variable, these macros mean:
+ * LOG_CHANGED - bits in the in-memory log have changed
+ * LOG_FLUSH - log must be committed to disk
+ */
+#define LOG_CHANGED 1
+#define LOG_FLUSH 2
+
struct log_header {
uint32_t magic;
uint32_t version;
@@ -58,6 +67,9 @@
uint32_t state; /* current operational state of the log */
+ struct rb_tree mark_tree; /* Tree that tracks all mark requests */
+ struct recovery_request *recovery_request_list;
+
int disk_fd; /* -1 means no disk log */
int log_dev_failed;
uint64_t disk_nr_regions;
@@ -65,9 +77,20 @@
void *disk_buffer; /* aligned memory for O_DIRECT */
};
+struct mark_entry {
+ uint32_t nodeid;
+ uint64_t region;
+};
+
+struct recovery_request {
+ uint64_t region;
+ struct recovery_request *next;
+};
+
static struct list_head log_list = LIST_HEAD_INIT(log_list);
static struct list_head log_pending_list = LIST_HEAD_INIT(log_pending_list);
+
static int log_test_bit(uint32_t *bs, unsigned bit)
{
return ext2fs_test_bit(bit, (unsigned int *) bs) ? 1 : 0;
@@ -76,13 +99,13 @@
static void log_set_bit(struct log_c *lc, uint32_t *bs, unsigned bit)
{
ext2fs_set_bit(bit, (unsigned int *) bs);
- lc->touched = 1;
+ lc->touched |= LOG_CHANGED;
}
static void log_clear_bit(struct log_c *lc, uint32_t *bs, unsigned bit)
{
ext2fs_clear_bit(bit, (unsigned int *) bs);
- lc->touched = 1;
+ lc->touched |= LOG_CHANGED;
}
/* FIXME: Why aren't count and start the same type? */
@@ -262,6 +285,47 @@
return 0;
}
+static void *get_mark_entry_region(void *data)
+{
+ struct mark_entry *m = data;
+
+ return (void *)&m->region;
+}
+
+static int cmp_mark_entry_regions(void *a, void *b)
+{
+ uint64_t _a = *((uint64_t *)a);
+ uint64_t _b = *((uint64_t *)b);
+
+ return (_a == _b) ? 0 : (_a < _b) ? -1 : 1;
+}
+
+/*
+ * srsm_count - Same Region, Same Machine count
+ * @data - data held in the tree node (a mark_entry ptr)
+ * @adata - additional data passed in (nodeid)
+ *
+ * This function always returns 1 - allowing the RBT search
+ * to continuing finding additional matches. It's useful
+ * feature is that it counts all the tree nodes that match
+ * the given machine (not just the region). Results of the
+ * count is placed in 'srsm_count_var'.
+ *
+ * Returns: 1
+ */
+static int srsm_count_var = 0;
+static int srsm_count(void *data, void *adata)
+{
+ uint32_t nodeid = *((uint32_t *)adata);
+ struct mark_entry *m = data;
+
+ if (nodeid == m->nodeid)
+ srsm_count_var++;
+
+ return 1;
+}
+
+
static int find_disk_path(char *major_minor_str, char *path_rtn)
{
int r;
@@ -394,7 +458,11 @@
lc->disk_fd = -1;
lc->log_dev_failed = 0;
- lc->bitset_uint32_count = region_count / (sizeof(*lc->clean_bits) << BYTE_SHIFT);
+ rbt_init(&lc->mark_tree, sizeof(struct mark_entry),
+ get_mark_entry_region, cmp_mark_entry_regions);
+
+ lc->bitset_uint32_count = region_count /
+ (sizeof(*lc->clean_bits) << BYTE_SHIFT);
if (region_count % (sizeof(*lc->clean_bits) << BYTE_SHIFT))
lc->bitset_uint32_count++;
@@ -622,7 +690,7 @@
LOG_DBG("Non-master resume: bits pre-loaded");
lc->resume_override = 1000;
lc->sync_count = count_bits32(lc->clean_bits, lc->bitset_uint32_count);
- LOG_DBG("sync_count = %llu", lc->sync_count);
+ LOG_DBG("Initial sync_count = %llu", lc->sync_count);
goto out;
return 0;
default:
@@ -640,9 +708,9 @@
switch (tfr->error) {
case 0:
if (lc->disk_nr_regions < lc->region_count)
- LOG_PRINT("Mirror has grown, updating log bits");
+ LOG_DBG("Mirror has grown, updating log bits");
else if (lc->disk_nr_regions > lc->region_count)
- LOG_PRINT("Mirror has shrunk, updating log bits");
+ LOG_DBG("Mirror has shrunk, updating log bits");
break;
case -EINVAL:
LOG_DBG("Read log failed: not yet initialized");
@@ -669,14 +737,14 @@
/* copy clean across to sync */
memcpy(lc->sync_bits, lc->clean_bits, size);
lc->sync_count = count_bits32(lc->clean_bits, lc->bitset_uint32_count);
- LOG_DBG("sync_count = %llu", lc->sync_count);
+ LOG_DBG("Initial sync_count = %llu", lc->sync_count);
lc->sync_search = 0;
/*
- * We mark 'touched' so that only the master commits
+ * We mark 'touched' as LOG_FLUSH so that only the master commits
* the log via 'commit_log'
*/
- lc->touched = 1;
+ lc->touched = LOG_FLUSH;
out:
lc->state = LOG_RESUMED;
@@ -789,6 +857,11 @@
return -EINVAL;
*rtn = log_test_bit(lc->sync_bits, region);
+ if (*rtn)
+ LOG_DBG(" Region is in-sync: %llu", region);
+ else
+ LOG_DBG(" Region is not in-sync: %llu", region);
+
tfr->data_size = sizeof(*rtn);
return 0;
@@ -814,7 +887,61 @@
!log_test_bit(lc->clean_bits, lc->recovering_region))
return -EAGAIN;
- /* Actual disk flush happens in 'commit_log()' */
+ /*
+ * Actual disk flush happens in 'commit_log()'
+ * Clear LOG_CHANGED and set LOG_FLUSH
+ */
+ lc->touched = LOG_FLUSH;
+
+ return 0;
+}
+
+/*
+ * mark_region
+ * @lc
+ * @region
+ * @who
+ *
+ * Put a mark region request in the tree for tracking.
+ *
+ * Returns: 0 on success, -EXXX on error
+ */
+static int mark_region(struct log_c *lc, uint64_t region, uint32_t who)
+{
+ struct rb_node *new;
+ struct mark_entry *m;
+
+ /*
+ * The search will find every node in the tree that has
+ * the same region marked. The additional function
+ * passed to 'rbt_search_plus' detects if the matching
+ * nodes also are from the machine who is performing this
+ * request.
+ */
+ srsm_count_var = 0;
+ if (!rbt_search_plus(&lc->mark_tree, ®ion, srsm_count, &who))
+ log_clear_bit(lc, lc->clean_bits, region);
+
+ /* Requesting region/nodeid is already in the tree */
+ if (srsm_count_var)
+ return 0;
+
+ /*
+ * Save allocation until here - if there is a failure,
+ * at least we have cleared the bit.
+ */
+ new = rbt_alloc_node(&lc->mark_tree);
+ if (!new) {
+ LOG_ERROR("Unable to allocate space for mark_entry: %llu/%u",
+ region, who);
+ return -ENOMEM;
+ }
+
+ m = new->rb_data;
+ m->nodeid = who;
+ m->region = region;
+ rbt_insert(&lc->mark_tree, new);
+
return 0;
}
@@ -827,9 +954,9 @@
*
* Returns: 0 on success, -EXXX on failure
*/
-static void print_bits(char *buf, int size);
static int clog_mark_region(struct clog_tfr *tfr)
{
+ int r;
int count;
uint64_t *region;
struct log_c *lc = get_log(tfr->uuid);
@@ -845,14 +972,58 @@
count = tfr->data_size / sizeof(uint64_t);
region = (uint64_t *)&tfr->data;
- for (; count > 0; count--, region++)
- log_clear_bit(lc, lc->clean_bits, *region);
+ for (; count > 0; count--, region++) {
+ r = mark_region(lc, *region, tfr->originator);
+ if (r)
+ return r;
+ }
tfr->data_size = 0;
return 0;
}
+static int clear_region(struct log_c *lc, uint64_t region, uint32_t who)
+{
+ int set_bit = 1;
+ struct rb_node *mark_list;
+ struct mark_entry *m;
+
+ srsm_count_var = 0;
+ mark_list = rbt_search_plus(&lc->mark_tree, ®ion, srsm_count, &who);
+ if (!mark_list || !srsm_count_var) {
+ LOG_DBG("Clear issued on region that is not marked: %llu/%u",
+ region, who);
+ goto set_bit;
+ }
+
+ /* If rb_next is set, it means more than one node has this marked */
+ if (mark_list->rb_next)
+ set_bit = 0;
+
+ /* Must find this machine's entry to remove it */
+ for (; mark_list; mark_list = mark_list->rb_next) {
+ m = mark_list->rb_data;
+ if (m->nodeid == who)
+ break;
+ }
+
+ if (!mark_list) {
+ LOG_ERROR("Bad programming: searches disagree on results");
+ goto set_bit;
+ }
+
+ rbt_remove(&lc->mark_tree, mark_list);
+ rbt_free_node(&lc->mark_tree, mark_list);
+
+set_bit:
+ /* Only clear the region if it is also in-sync */
+ if (set_bit && log_test_bit(lc->sync_bits, region))
+ log_set_bit(lc, lc->clean_bits, region);
+
+ return 0;
+}
+
/*
* clog_clear_region
* @tfr
@@ -864,6 +1035,7 @@
*/
static int clog_clear_region(struct clog_tfr *tfr)
{
+ int r;
int count;
uint64_t *region;
struct log_c *lc = get_log(tfr->uuid);
@@ -879,8 +1051,12 @@
count = tfr->data_size / sizeof(uint64_t);
region = (uint64_t *)&tfr->data;
- for (; count > 0; count--, region++)
- log_set_bit(lc, lc->clean_bits, *region);
+ for (; count > 0; count--, region++) {
+ r = clear_region(lc, *region, tfr->originator);
+ if (r)
+ return r;
+ }
+
tfr->data_size = 0;
return 0;
@@ -918,6 +1094,28 @@
return 0;
}
+ while (lc->recovery_request_list) {
+ struct recovery_request *del;
+
+ del = lc->recovery_request_list;
+ lc->recovery_request_list = del->next;
+
+ pkg->r = del->region;
+ free(del);
+
+ if (!log_test_bit(lc->sync_bits, pkg->r)) {
+ LOG_DBG("Assigning priority resync work to %u: %llu",
+ tfr->originator, pkg->r);
+#ifdef DEBUG
+ LOG_DBG("Priority work remaining:");
+ for (del = lc->recovery_request_list; del; del = del->next)
+ LOG_DBG(" %llu", del->region);
+#endif
+ pkg->i = 1;
+ return 0;
+ }
+ }
+
pkg->r = find_next_zero_bit(lc->sync_bits,
lc->region_count,
lc->sync_search);
@@ -973,7 +1171,6 @@
return -EINVAL;
*sync_count = lc->sync_count;
- LOG_DBG("sync_count = %llu", *sync_count);
tfr->data_size = sizeof(*sync_count);
@@ -1100,6 +1297,20 @@
return -EINVAL;
*rtn = !log_test_bit(lc->sync_bits, region);
+ if (*rtn) {
+ struct recovery_request *rr;
+ LOG_DBG(" Region is busy recovering: %llu", region);
+
+ /* Failure to allocated simply means we can't prioritize it */
+ rr = malloc(sizeof(*rr));
+ if (rr) {
+ rr->region = region;
+ rr->next = lc->recovery_request_list;
+ lc->recovery_request_list = rr;
+ }
+ } else
+ LOG_DBG(" Region is not recovering: %llu", region);
+
tfr->data_size = sizeof(*rtn);
return 0;
@@ -1228,7 +1439,7 @@
goto out;
}
- if (!lc->touched)
+ if (!(lc->touched & LOG_FLUSH))
goto out;
if (lc->disk_fd >= 0) {
@@ -1240,7 +1451,10 @@
LOG_DBG("Disk log written");
}
- lc->touched = 0;
+ if (lc->touched & LOG_CHANGED)
+ LOG_ERROR("WARNING: Log has changed during a flush operation");
+
+ lc->touched &= ~LOG_FLUSH;
/* FIXME: unlock */
out:
@@ -1292,11 +1506,11 @@
if (!strncmp(which, "sync_bits", 9)) {
memcpy(*buf, lc->sync_bits, bitset_size);
- LOG_PRINT("storing sync_bits:");
+ LOG_DBG("storing sync_bits:");
print_bits(*buf, bitset_size);
} else if (!strncmp(which, "clean_bits", 9)) {
memcpy(*buf, lc->clean_bits, bitset_size);
- LOG_PRINT("storing clean_bits:");
+ LOG_DBG("storing clean_bits:");
print_bits(*buf, bitset_size);
}
--- cluster/cmirror/src/Attic/local.c 2007/11/05 22:44:03 1.1.2.3
+++ cluster/cmirror/src/Attic/local.c 2007/11/08 22:16:53 1.1.2.4
@@ -30,12 +30,14 @@
r = recv(cn_fd, buf, sizeof(buf), 0);
if (r < 0) {
+ LOG_ERROR("Failed to recv message from kernel");
r = -errno;
goto out;
}
switch (((struct nlmsghdr *)buf)->nlmsg_type) {
case NLMSG_ERROR:
+ LOG_ERROR("Unable to recv message from kernel: NLMSG_ERROR");
r = -EBADE;
break;
case NLMSG_DONE:
@@ -77,8 +79,10 @@
* A failure to allocate space means the request is lost
* The kernel must retry
*/
- if (!(*tfr = queue_remove(free_queue)))
+ if (!(*tfr = queue_remove(free_queue))) {
+ LOG_ERROR("Failed to get clog_tfr from free_queue");
return -ENOMEM;
+ }
memset(*tfr, 0, sizeof(struct clog_tfr));
--- cluster/cmirror-kernel/src/dm-clog-tfr.c 2007/08/30 15:49:32 1.1.2.2
+++ cluster/cmirror-kernel/src/dm-clog-tfr.c 2007/11/08 22:16:53 1.1.2.3
@@ -81,6 +81,11 @@
}
list_for_each_entry(pkg, &recieving_list, list) {
+ /*
+ DMINFO("Msg from userspace recieved [%s].", RQ_TYPE(tfr->request_type));
+ DMINFO(" Seq # recieved: %llu Seq # wanted: %llu",
+ pkg->seq, tfr->seq);
+ */
if (tfr->seq == pkg->seq) {
if (tfr->data_size > *(pkg->data_size)) {
DMERR("Insufficient space to recieve package [%s]",
--- cluster/cmirror-kernel/src/dm-clog-tfr.h 2007/11/03 18:37:48 1.1.2.2
+++ cluster/cmirror-kernel/src/dm-clog-tfr.h 2007/11/08 22:16:53 1.1.2.3
@@ -63,7 +63,7 @@
};
#ifdef __KERNEL__
-#define DM_MSG_PREFIX "clulog"
+#define DM_MSG_PREFIX "dm-log-clustered"
int dm_clog_tfr_init(void);
void dm_clog_tfr_exit(void);
reply other threads:[~2007-11-08 22:16 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071108221655.28383.qmail@sourceware.org \
--to=jbrassow@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.