<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Short question: Does gluster and the FUSE client support the O_EXCL flag to open()?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Long question:<o:p></o:p></p>
<p class="MsoNormal">So I have several hosts, all using the FUSE client. I mount the same gluster filesystem using the FUSE client on each host. Then, two processes (on separate hosts), try to open() the same file with O_CREAT|O_EXCL. Does the FUSE client and
gluster guarantee that only one will be successful (ie: no race condition exists)? Or do I need to implement the suggested work-around for NFS in the man page for open()?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Next question: Is anyone actually relying on O_EXCL? :-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Steve<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Open() manpage:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> O_EXCL Ensure that this call creates the file: if this flag is specified in conjunction with<o:p></o:p></p>
<p class="MsoNormal"> O_CREAT, and pathname already exists, then open() will fail. The behavior of O_EXCL is<o:p></o:p></p>
<p class="MsoNormal"> undefined if O_CREAT is not specified.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> When these two flags are specified, symbolic links are not followed: if pathname is a<o:p></o:p></p>
<p class="MsoNormal"> symbolic link, then open() fails regardless of where the symbolic link points to.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> O_EXCL is only supported on NFS when using NFSv3 or later on kernel 2.6 or later. In<o:p></o:p></p>
<p class="MsoNormal"> environments where NFS O_EXCL support is not provided, programs that rely on it for per-<o:p></o:p></p>
<p class="MsoNormal"> forming locking tasks will contain a race condition. Portable programs that want to per-<o:p></o:p></p>
<p class="MsoNormal"> form atomic file locking using a lockfile, and need to avoid reliance on NFS support for<o:p></o:p></p>
<p class="MsoNormal"> O_EXCL, can create a unique file on the same file system (e.g., incorporating hostname<o:p></o:p></p>
<p class="MsoNormal"> and PID), and use link(2) to make a link to the lockfile. If link(2) returns 0, the lock<o:p></o:p></p>
<p class="MsoNormal"> is successful. Otherwise, use stat(2) on the unique file to check if its link count has<o:p></o:p></p>
<p class="MsoNormal"> increased to 2, in which case the lock is also successful.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>