Re: [PATCH 1/1] exportfs: Stop racing exportfs on clusters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 07, 2012 at 03:36:49PM -0500, bfields wrote:
> On Wed, Mar 07, 2012 at 02:56:30PM -0500, Steve Dickson wrote:
> > This problem can occur when multiple cluster services fail over
> > at the same time, causing missing high-available exports.
> > Having a lot of nfs-exports will trigger this issue easier.
> 
> Isn't the locking in support/export/xtab.c supposed to take care of
> this?

Huh, maybe that's just meant to prevent etab from getting corrupted, or
mountd from seeing a partially-written file.

But it probably doesn't prevent two exportfs processes from both reading
etab, adding an export, and each writing out an etab with its one export
added, with the last writer winning.

Was that the problem?

I think it'd be worth a comment above grab/release_lockfile().

--b.

> 
> I may be confused--I forget what all these files are for....
> 
> --b.
> 
> > 
> > Signed-off-by: Steve Dickson <steved@xxxxxxxxxx>
> > ---
> >  support/include/exportfs.h |    4 ++++
> >  utils/exportfs/exportfs.c  |   24 ++++++++++++++++++++++++
> >  2 files changed, 28 insertions(+), 0 deletions(-)
> > 
> > diff --git a/support/include/exportfs.h b/support/include/exportfs.h
> > index 01e87dd..99916e5 100644
> > --- a/support/include/exportfs.h
> > +++ b/support/include/exportfs.h
> > @@ -32,6 +32,10 @@ enum {
> >  	FSLOC_STUB
> >  };
> >  
> > +#ifndef EXP_LOCKFILE
> > +#define EXP_LOCKFILE "/var/lib/nfs/export-lock"
> > +#endif
> > +
> >  typedef struct mclient {
> >  	struct mclient *	m_next;
> >  	char *			m_hostname;
> > diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
> > index 7432a65..769d438 100644
> > --- a/utils/exportfs/exportfs.c
> > +++ b/utils/exportfs/exportfs.c
> > @@ -16,6 +16,7 @@
> >  #include <sys/stat.h>
> >  #include <sys/vfs.h>
> >  #include <sys/stat.h>
> > +#include <sys/file.h>
> >  #include <unistd.h>
> >  #include <stdbool.h>
> >  #include <stdlib.h>
> > @@ -44,6 +45,23 @@ static void	validate_export(nfs_export *exp);
> >  static int	matchhostname(const char *hostname1, const char *hostname2);
> >  static void	export_d_read(const char *dname);
> >  
> > +static const char *lockfile = EXP_LOCKFILE;
> > +static int _lockfd = -1;
> > +
> > +void 
> > +grab_lockfile()
> > +{
> > +	_lockfd = open(lockfile, O_CREAT|O_RDWR, 0666);
> > +	if (_lockfd != -1) 
> > +		lockf(_lockfd, F_LOCK, 0);
> > +}
> > +void 
> > +release_lockfile()
> > +{
> > +	if (_lockfd != -1)
> > +		lockf(_lockfd, F_ULOCK, 0);
> > +}
> > +
> >  int
> >  main(int argc, char **argv)
> >  {
> > @@ -129,6 +147,12 @@ main(int argc, char **argv)
> >  			return 0;
> >  		}
> >  	}
> > +	/*
> > +	 * Serialize things as best we can
> > +	 */
> > +	grab_lockfile();
> > +	atexit(release_lockfile);
> > +
> >  	if (f_export && ! f_ignore) {
> >  		export_read(_PATH_EXPORTS);
> >  		export_d_read(_PATH_EXPORTS_D);
> > -- 
> > 1.7.7.6
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux