All signals are registered by calling "signal" so at least on Linux, EINTR is NEVER returned.
Open SA Forum AIS Services mailing list wrote: > On Mon, Feb 28, 2011 at 6:41 AM, Open SA Forum AIS Services mailing > list <[email protected]> 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, OpenAIS will create fresh ring id file data when the >> incorrect number of bytes are read from the ring id. >> >> Backport of Corosync 7471c883464ccee31424e9a58c71fc5f948f41f9 > > As far as the backport goes, it looks good. > >> --- >> 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)); > > There is at least one case where read() may fail but it should be tried again. > > do { > res = read (fd, &memb_ring_id->seq, sizeof (uint64_t)); > } while (res == -1 && errno == EINTR); > >> 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)); > > The same thing applies here. I would modify it to try again if errno == > EINTR. > >> + 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 >> > _______________________________________________ > 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
