<div dir="ltr">FYI, <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:16px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">advisory locks of PostgreSQL are working pretty well on production since one month now.<br>Thanks again for your help.</span></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr">--<br><div style="font-size:small"><div>Ludovic Gasc (GMLudo)</div></div></div></div></div></div></div></div>
<br><div class="gmail_quote">2018-04-18 7:09 GMT+02:00 Ludovic Gasc <span dir="ltr"><<a href="mailto:gmludo@gmail.com" target="_blank">gmludo@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Indeed, thanks for the suggestion :-)</div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">Le mer. 18 avr. 2018 à 01:21, Nathaniel Smith <<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Pretty sure you want to add a try/finally around that yield, so you release the lock on errors.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Apr 17, 2018, 14:39 Ludovic Gasc <<a href="mailto:gmludo@gmail.com" rel="noreferrer" target="_blank">gmludo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2018-04-17 15:16 GMT+02:00 Antoine Pitrou <span dir="ltr"><<a href="mailto:solipsis@pitrou.net" rel="noreferrer noreferrer" target="_blank">solipsis@pitrou.net</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
You could simply use something like the first 64 bits of<br>
sha1("myapp:<lock name>")<br></blockquote><div><br></div><div>I have followed your idea, except I used hashtext directly, it's an internal postgresql function that generates an integer directly.<br><br></div><div>For now, it seems to work pretty well but I didn't yet finished all tests.</div><div>The final result is literally 3 lines of Python inside an async contextmanager, I like this solution ;-) :</div><div><br></div><div><div>@asynccontextmanager</div><div>async def lock(env, category='global', name='global'):</div><div>    # Alternative lock id with 'mytable'::regclass::integer OID</div><div>    await env['aiopg']['cursor'].<wbr>execute("SELECT pg_advisory_lock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})</div><div><br></div><div>    yield None</div><div><br></div><div>    await env['aiopg']['cursor'].<wbr>execute("SELECT pg_advisory_unlock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})</div></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Regards<br>
<br>
Antoine.<br>
<br>
<br>
On Tue, 17 Apr 2018 15:04:37 +0200<br>
<div class="m_-730568878392399820m_6864257719352278929m_6167137454960255932gmail-HOEnZb"><div class="m_-730568878392399820m_6864257719352278929m_6167137454960255932gmail-h5">Ludovic Gasc <<a href="mailto:gmludo@gmail.com" rel="noreferrer noreferrer" target="_blank">gmludo@gmail.com</a>> wrote:<br>
> Hi Antoine & Chris,<br>
> <br>
> Thanks a lot for the advisory lock, I didn't know this feature in<br>
> PostgreSQL.<br>
> Indeed, it seems to fit my problem.<br>
> <br>
> The small latest problem I have is that we have string names for locks,<br>
> but advisory locks accept only integers.<br>
> Nevertheless, it isn't a problem, I will do a mapping between names and<br>
> integers.<br>
> <br>
> Yours.<br>
> <br>
> --<br>
> Ludovic Gasc (GMLudo)<br>
> <br>
> 2018-04-17 13:41 GMT+02:00 Antoine Pitrou <<a href="mailto:solipsis@pitrou.net" rel="noreferrer noreferrer" target="_blank">solipsis@pitrou.net</a>>:<br>
> <br>
> > On Tue, 17 Apr 2018 13:34:47 +0200<br>
> > Ludovic Gasc <<a href="mailto:gmludo@gmail.com" rel="noreferrer noreferrer" target="_blank">gmludo@gmail.com</a>> wrote:  <br>
> > > Hi Nickolai,<br>
> > ><br>
> > > Thanks for your suggestions, especially for the file system lock: We  <br>
> > don't  <br>
> > > have often locks, but we must be sure it's locked.<br>
> > ><br>
> > > For 1) and 4) suggestions, in fact we have several systems to sync and  <br>
> > also  <br>
> > > a PostgreSQL transaction, the request must be treated by the same worker<br>
> > > from beginning to end and the other systems aren't idempotent at all,  <br>
> > it's  <br>
> > > "old-school" proprietary systems, good luck to change that ;-)  <br>
> ><br>
> > If you already have a PostgreSQL connection, can't you use a PostgreSQL<br>
> > lock?  e.g. an "advisory lock" as described in<br>
> > <a href="https://www.postgresql.org/docs/9.1/static/explicit-locking.html" rel="noreferrer noreferrer noreferrer" target="_blank">https://www.postgresql.org/<wbr>docs/9.1/static/explicit-<wbr>locking.html</a><br>
> ><br>
> > Regards<br>
> ><br>
> > Antoine.<br>
> ><br>
> ><br>
> >  <br>
> <br>
<br>
<br>
<br>
</div></div><div class="m_-730568878392399820m_6864257719352278929m_6167137454960255932gmail-HOEnZb"><div class="m_-730568878392399820m_6864257719352278929m_6167137454960255932gmail-h5">______________________________<wbr>_________________<br>
Async-sig mailing list<br>
<a href="mailto:Async-sig@python.org" rel="noreferrer noreferrer" target="_blank">Async-sig@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/async-sig" rel="noreferrer noreferrer noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/async-sig</a><br>
Code of Conduct: <a href="https://www.python.org/psf/codeofconduct/" rel="noreferrer noreferrer noreferrer" target="_blank">https://www.python.org/psf/<wbr>codeofconduct/</a><br>
</div></div></blockquote></div><br></div></div>
______________________________<wbr>_________________<br>
Async-sig mailing list<br>
<a href="mailto:Async-sig@python.org" rel="noreferrer noreferrer" target="_blank">Async-sig@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/async-sig" rel="noreferrer noreferrer noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/async-sig</a><br>
Code of Conduct: <a href="https://www.python.org/psf/codeofconduct/" rel="noreferrer noreferrer noreferrer" target="_blank">https://www.python.org/psf/<wbr>codeofconduct/</a><br>
</blockquote></div>
</blockquote></div></div></div></blockquote></div><br></div>