On Tue, Feb 22, 2011 at 12:48:32PM -0700, Steven Dake wrote:
> 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, Corosync will create fresh ring id file data when the
> incorrect number of bytes are read from the ring id.
>
> Amend to use sizeof the strerror string length and PATH_MAX for the path
> length.
>
> Signed-off-by: Steven Dake <[email protected]>
Reviewed-by: Angus Salkeld <[email protected]>
I hope the change from:
read (fd, &memb_ring_id->seq, sizeof (unsigned long long));
to
read (fd, &memb_ring_id->seq, sizeof (uint64_t));
won't cause any problems.
-Angus
> ---
> exec/totemsrp.c | 41 ++++++++++++++++++++++++-----------------
> 1 files changed, 24 insertions(+), 17 deletions(-)
>
> diff --git a/exec/totemsrp.c b/exec/totemsrp.c
> index d007fe7..c0e21b5 100644
> --- a/exec/totemsrp.c
> +++ b/exec/totemsrp.c
> @@ -3094,35 +3094,42 @@ static void memb_ring_id_create_or_load (
> struct memb_ring_id *memb_ring_id)
> {
> int fd;
> - int res;
> - char filename[256];
> - char error_str[100];
> + int res = 0;
> + char filename[PATH_MAX];
> + char error_str[256];
>
> snprintf (filename, sizeof(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 >= 0) {
> - res = write (fd, &memb_ring_id->seq, sizeof (unsigned
> long long));
> - assert (res == sizeof (unsigned long long));
> + if (fd != -1) {
> + res = write (fd, &memb_ring_id->seq, sizeof (uint64_t));
> close (fd);
> + if (res == -1) {
> + strerror_r (errno, error_str, sizeof
> (error_str));
> + log_printf
> (instance->totemsrp_log_level_warning,
> + "Couldn't write ringid file '%s' %s\n",
> + filename, error_str);
> + }
> } else {
> - strerror_r (errno, error_str, 100);
> + strerror_r (errno, error_str, sizeof (error_str));
> log_printf (instance->totemsrp_log_level_warning,
> - "Couldn't create %s %s\n", filename, error_str);
> + "Couldn't create ringid file '%s' %s\n",
> + filename, error_str);
> }
> - } else {
> - strerror_r (errno, error_str, 100);
> - log_printf (instance->totemsrp_log_level_warning,
> - "Couldn't open %s %s\n", filename, error_str);
> }
>
> totemip_copy(&memb_ring_id->rep, &instance->my_id.addr[0]);
> --
> 1.7.4
>
> _______________________________________________
> Openais mailing list
> [email protected]
> https://lists.linux-foundation.org/mailman/listinfo/openais
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais