If the ring id file for the processor is less then 8 bytes, totemsrp would
assert. Our speculation is that this condition happens during a fencing
operation or local filesystem corruption.
With this patch, OpenAIS will create fresh ring id file data when the
incorrect number of bytes are read from the ring id.
Backport of Corosync 7471c883464ccee31424e9a58c71fc5f948f41f9
---
branches/whitetank/exec/totemsrp.c | 34 ++++++++++++++++++++--------------
1 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/branches/whitetank/exec/totemsrp.c
b/branches/whitetank/exec/totemsrp.c
index 20de8c9..a30dd30 100644
--- a/branches/whitetank/exec/totemsrp.c
+++ b/branches/whitetank/exec/totemsrp.c
@@ -3003,31 +3003,37 @@ static void memb_ring_id_create_or_load (
struct memb_ring_id *memb_ring_id)
{
int fd;
- int res;
+ int res = 0;
char filename[256];
sprintf (filename, "%s/ringid_%s",
rundir, totemip_print (&instance->my_id.addr[0]));
fd = open (filename, O_RDONLY, 0700);
- if (fd > 0) {
- res = read (fd, &memb_ring_id->seq, sizeof (unsigned long
long));
- assert (res == sizeof (unsigned long long));
+ /*
+ * If file can be opened and read, read the ring id
+ */
+ if (fd != -1) {
+ res = read (fd, &memb_ring_id->seq, sizeof (uint64_t));
close (fd);
- } else
- if (fd == -1 && errno == ENOENT) {
+ }
+ /*
+ * If file could not be opened or read, create a new ring id
+ */
+ if ((fd == -1) || (res != sizeof (uint64_t))) {
memb_ring_id->seq = 0;
umask(0);
fd = open (filename, O_CREAT|O_RDWR, 0700);
- if (fd == -1) {
+ if (fd != -1) {
+ res = write (fd, &memb_ring_id->seq, sizeof (uint64_t));
+ close (fd);
+ if (res == -1) {
+ log_printf
(instance->totemsrp_log_level_warning,
+ "Couldn't write ringid file '%s' %s\n",
filename, strerror (errno));
+ }
+ } else {
log_printf (instance->totemsrp_log_level_warning,
- "Couldn't create %s %s\n", filename, strerror
(errno));
+ "Couldn't create ringid file %s %s\n",
filename, strerror (errno));
}
- res = write (fd, &memb_ring_id->seq, sizeof (unsigned long
long));
- assert (res == sizeof (unsigned long long));
- close (fd);
- } else {
- log_printf (instance->totemsrp_log_level_warning,
- "Couldn't open %s %s\n", filename, strerror (errno));
}
totemip_copy(&memb_ring_id->rep, &instance->my_id.addr[0]);
--
1.7.3.4
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais