<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 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:Consolas;}
p.emailquote, li.emailquote, div.emailquote
        {mso-style-name:emailquote;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:1.0pt;
        border:none;
        padding:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:Consolas;
        color:#1F497D;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Hi Qijing,<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">At some point Jay and I started emailing each other and didn’t reply to the list. In any event, the upshot is that what Jay
 and I are proposing amounts to a schema that looks like this, (see: <a href="https://gist.github.com/amrith/b59f2db4ad73eb92452445c6ba07028b">
https://gist.github.com/amrith/b59f2db4ad73eb92452445c6ba07028b</a>). The gist also has some sample data. Note that this schema is for illustration purposes and I’d normalize it for the delimiter library (i.e. not have resource and resource_id in the resources
 table, for example).<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">If the consumer ‘61412e76-1a95-11e6-8478-000c291e9f7b’ wishes to consume memory, the queries would be the following.<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> select r.generation, sum(a.amount)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> from resources r, allocations a<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> where r.consumer_id = a.consumer_id<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.resource_id = a.resource_id<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.consumer_id = '61412e76-1a95-11e6-8478-000c291e9f7b'<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.resource = 'memory'<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> group by r.generation;<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">| generation | sum(a.amount) |<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">|          2 |          3072 |<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">The operation to consume 1024MB of memory would be the following transaction.<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> begin;<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Query OK, 0 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql><o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> insert into allocations values<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    ->   'b587d300-1a94-11e6-8478-000c291e9f7b', 1024 );<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql><o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> update resources<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> set generation = generation + 1<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> where generation = 2<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and consumer_id = '61412e76-1a95-11e6-8478-000c291e9f7b'<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and resource = 'memory';<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Query OK, 1 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Rows matched: 1  Changed: 1  Warnings: 0<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql><o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> commit;<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Query OK, 0 rows affected (0.01 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql><o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">As you can see (below) this has bumped the generation and reflects the right allocation.<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">mysql> select r.generation, sum(a.amount)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> from resources r, allocations a<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> where r.consumer_id = a.consumer_id<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.resource_id = a.resource_id<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.consumer_id = '61412e76-1a95-11e6-8478-000c291e9f7b'<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> and r.resource = 'memory'<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">    -> group by r.generation;<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">| generation | sum(a.amount) |<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">|          3 |          4096 |<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">+------------+---------------+<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">By adding consumer_id to the resources table, the hotspot/scalability-issue/problem that Jay described has been addressed.<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Hope this helps,<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">Thanks,<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D">-amrith<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><font size="2" face="Calibri"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;font-weight:bold">From:</span></font></b><font size="2" face="Calibri"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Amrith
 Kumar <br>
<b><span style="font-weight:bold">Sent:</span></b> Sunday, May 15, 2016 10:11 PM<br>
<b><span style="font-weight:bold">To:</span></b> Jay Pipes <jaypipes@gmail.com><br>
<b><span style="font-weight:bold">Subject:</span></b> RE: [openstack-dev] [cross-project][quotas][delimiter]My thoughts on how Delimiter uses generation-id for sequencing<o:p></o:p></span></font></p>
</div>
</div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
<div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">There you go Qijing,<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">Add a column for consumer_id to the resources table and include it in the join with allocations, add it to the group, and voila, we have a nice quota solution. ....<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">I can restate my example if that will help.<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">Thanks,<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
<div id="x_composer_signature">
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">-amrith<o:p></o:p></span></font></p>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">--<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt">Amrith Kumar<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><a href="mailto:amrith@tesora.com">amrith@tesora.com</a><o:p></o:p></span></font></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><font size="3" face="Times New Roman"><span style="font-size:12.0pt"><br>
<br>
-------- Original message --------<br>
From: Jay Pipes <<a href="mailto:jaypipes@gmail.com">jaypipes@gmail.com</a>> <br>
Date: 05/15/2016 10:06 PM (GMT-05:00) <br>
To: Amrith Kumar <<a href="mailto:amrith@tesora.com">amrith@tesora.com</a>> <br>
Subject: Re: [openstack-dev] [cross-project][quotas][delimiter]My thoughts on how Delimiter uses generation-id for sequencing
<o:p></o:p></span></font></p>
</div>
<div>
<p class="MsoNormal"><font size="2" face="Times New Roman"><span style="font-size:10.0pt">Yep, like amrith :)<br>
<br>
On 05/15/2016 09:10 PM, Amrith Kumar wrote:<br>
> What's a consumer? A service like trove or a user like amrith?<br>
><br>
> I think you will say the latter in which case i understand what you mean<br>
> by contention.<br>
><br>
> Easy enough to add. Will do that ... (if that'swhat you mean ...)<br>
> -amrith<br>
><br>
> --<br>
> Amrith Kumar<br>
> <a href="mailto:amrith@tesora.com">amrith@tesora.com</a><br>
><br>
><br>
> -------- Original message --------<br>
> From: Jay Pipes <<a href="mailto:jaypipes@gmail.com">jaypipes@gmail.com</a>><br>
> Date: 05/15/2016 8:42 PM (GMT-05:00)<br>
> To: Amrith Kumar <<a href="mailto:amrith@tesora.com">amrith@tesora.com</a>><br>
> Subject: Re: [openstack-dev] [cross-project][quotas][delimiter]My<br>
> thoughts on how Delimiter uses generation-id for sequencing<br>
><br>
> On 05/15/2016 05:14 PM, Amrith Kumar wrote:<br>
>> The way I view this, if three services (consumers), each chose to use<br>
>> the library (call them service1, service2 and service3) and they each<br>
>> stored their catalog in databases named for their service, then there<br>
>> would be 6 tables,<br>
>><br>
>> service1.resources and service1.allocations,<br>
>> service2.resources and service2.allocations,<br>
>> service3.resources and service3.allocations.<br>
>><br>
>> I believe that you would have called them:<br>
>><br>
>> service1.consumers and service1.allocations,<br>
>> service2.consumers and service2.allocations,<br>
>> service3.consumers and service3.allocations.<br>
>><br>
>> Or am I missing something more basic?<br>
><br>
> You don't have a consumer_id key in your resources table so I can't see<br>
> how you have a generation per consumer?<br>
><br>
> -jay<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">On Sun, 2016-05-15 at 14:11 -0400, Jay Pipes wrote:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> Amrith, your code in SQL statements below is identical to mine in Python
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> with two exceptions that make your code less scalable and more problematic:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">That's an implementation detail :) Seriously though, I thought I was<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">doing the same thing you were so now I'm curious.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> 1) You have your generation on a "resources" table instead of a
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> "consumers" table, which means you have an extremely high likelihood of
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> needing to retry your UPDATE statements and SELECTs because all
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> consumers in the system share a single serialization point (the
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> resources.generation field for the resource class).<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">This table I'm calling resources is probably better called consumers.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">But, if memory is a resource and there are 5 projects consuming memory,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">and each uses the library, I believe that there will be 5 resources<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">tables (one per project database).<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">In other words the only changes recorded in any 'resources' table are<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">related to consumers from a given project.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> 2) The Delimiter library (i.e. "the quota system") *should not own
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> resources*. Resources are owned by the individual services themselves,
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> not some separate quota library. The quota library does not have
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> knowledge of nor access to the allocations, inventories, or
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> resource_providers database tables. In fact, the quota library should
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> not assume *anything* about how usage and inventory information is
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> stored or even that it is in a transactional RDBMS.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">I agree, this is only book keeping in a delimiter library for a single<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service. Managing to acquire quota here is no guarantee that the service<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">actually providing the resource will actually honor the request; it may<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">be over subscribed. All this library guarantees is that the consumer in<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">the service that is using this library has not exceeded his or her<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">limits.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> The Python code I used as an example was deliberately trying to keep the
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> quota library as a consistent interface for how to deal with the
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> check-consume pattern without needing the quota library to know anything
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> at all about how the actual resource usage and inventory information was
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> stored.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">The way I view this, if three services (consumers), each chose to use<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">the library (call them service1, service2 and service3) and they each<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">stored their catalog in databases named for their service, then there<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">would be 6 tables,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service1.resources and service1.allocations,
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service2.resources and service2.allocations,
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service3.resources and service3.allocations.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">I believe that you would have called them:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service1.consumers and service1.allocations,
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service2.consumers and service2.allocations,
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">service3.consumers and service3.allocations.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">Or am I missing something more basic?<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> Best,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> -jay<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> On 05/15/2016 01:55 PM, Amrith Kumar wrote:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Qijing,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > As a simple example, let's assume that I use this schema. I realize that<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > it does not provide the resource provider thing that Jay talked about in<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > a previous (couple of weeks ago) email, but I believe that it serves to<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > illustrate how the generations are used.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > create table resources (<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      resource_id varchar(36) primary key,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      resource    varchar(32),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      generation  integer<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ) engine=innodb;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > create table allocations (<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >         consumer_id       varchar(36),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >         resource_id       varchar(36),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >         amount            integer,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >         foreign key (resource_id)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >                 references resources(resource_id)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ) engine=innodb;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > I've also populated it with this sample data.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > insert into resources values ('b587d300-1a94-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'memory', 3);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > insert into resources values ('b587ddb1-1a94-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'cpu', 3);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > insert into resources values ('b587de7d-1a94-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'disk', 3);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > insert into allocations values<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587d300-1a94-11e6-8478-000c291e9f7b', 1024 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587ddb1-1a94-11e6-8478-000c291e9f7b',    6 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587de7d-1a94-11e6-8478-000c291e9f7b',10240 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587d300-1a94-11e6-8478-000c291e9f7b', 2048 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587ddb1-1a94-11e6-8478-000c291e9f7b',    2 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587de7d-1a94-11e6-8478-000c291e9f7b',  512 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( 'be03c4f7-1a96-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587d300-1a94-11e6-8478-000c291e9f7b', 2048 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( 'be03c4f7-1a96-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587ddb1-1a94-11e6-8478-000c291e9f7b',    2 ),<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( 'be03c4f7-1a96-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587de7d-1a94-11e6-8478-000c291e9f7b',  512 );<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > That gives me this as a starting point.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select distinct resource from resources;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +----------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | resource |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +----------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | memory   |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | cpu      |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | disk     |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +----------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 3 rows in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select distinct consumer_id from allocations;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | consumer_id                          |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | 61412e76-1a95-11e6-8478-000c291e9f7b |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | be03c4f7-1a96-11e6-8478-000c291e9f7b |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 2 rows in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > -----<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Assume that the consumer (61412e76-1a95-11e6-8478-000c291e9f7b) has a<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > CPU quota of 12, we can see that the user has not yet hit his quota.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select sum(amount) from resources, allocations where<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resources.resource_id = allocations.resource_id and resources.resource =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'cpu' and consumer_id = '61412e76-1a95-11e6-8478-000c291e9f7b';<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | sum(amount) |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > |           8 |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > In this situation, assume that this consumer wishes to consume two<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > CPU's. Here's what quota library would do.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > The caller of quota library would provide something like:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > consumer_id: 61412e76-1a95-11e6-8478-000c291e9f7b<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resource: cpu<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > quota: 12<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > request: 2<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Here's what the quota library would do.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select resources.resource_id, generation, sum(amount) from<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resources, allocations where resources.resource_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > allocations.resource_id and resources.resource = 'cpu' and consumer_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > '61412e76-1a95-11e6-8478-000c291e9f7b' group by resources.resource_id,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > generation\g<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | resource_id                          | generation | sum(amount) |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | b587ddb1-1a94-11e6-8478-000c291e9f7b |          3 |           8 |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > -- it can now determine that the quota of 12 won't be violated by<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > allocating two more. So it goes ahead and does this.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> begin;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> insert into allocations values<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( '61412e76-1a95-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587ddb1-1a94-11e6-8478-000c291e9f7b', 2);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > And then does this:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> update resources set generation = generation + 1<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      -> where resource_id = 'b587ddb1-1a94-11e6-8478-000c291e9f7b'<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      -> and generation = 3;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Rows matched: 1  Changed: 1  Warnings: 0<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > It observes that 1 row was matched, so the allocation succeeded and<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > therefore it does this.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> commit;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.01 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > -------<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Assume now that consumer 'be03c4f7-1a96-11e6-8478-000c291e9f7b' with a<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > cpu quota of 50 comes along and wants 4 more. The library does this.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select resources.resource_id, generation, sum(amount) from<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resources, allocations where resources.resource_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > allocations.resource_id and resources.resource = 'cpu' and consumer_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'be03c4f7-1a96-11e6-8478-000c291e9f7b' group by resources.resource_id,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > generation;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | resource_id                          | generation | sum(amount) |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | b587ddb1-1a94-11e6-8478-000c291e9f7b |          4 |           2 |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Clearly the user has only two cores in use and 4 more will not violate<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > the quota.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Therefore the quota library does this.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> begin;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> insert into allocations values (<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      -> 'be03c4f7-1a96-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      -> 'b587ddb1-1a94-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >      -> 4);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> update resources set generation = generation + 1 where<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resource_id = 'b587ddb1-1a94-11e6-8478-000c291e9f7b' and generation = 4;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Rows matched: 0  Changed: 0  Warnings: 0<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Since, in the period of time between the select of the generations and<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > the time when the quota library decided to finish this allocation, some<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > other requester had made an allocation of CPU, the query updated 0 rows.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > This is an error and therefore the quota library will rollback and<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > retry.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> rollback;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.01 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> select resources.resource_id, generation, sum(amount) from<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resources, allocations where resources.resource_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > allocations.resource_id and resources.resource = 'cpu' and consumer_id =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'be03c4f7-1a96-11e6-8478-000c291e9f7b' group by resources.resource_id,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > generation;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | resource_id                          | generation | sum(amount) |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > | b587ddb1-1a94-11e6-8478-000c291e9f7b |          5 |           2 |<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > +--------------------------------------+------------+-------------+<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 1 row in set (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > -- it sees that the generation is now 5<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> begin;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> insert into allocations values<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > ( 'be03c4f7-1a96-11e6-8478-000c291e9f7b',<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > 'b587ddb1-1a94-11e6-8478-000c291e9f7b', 4);<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> update resources set generation = generation + 1 where<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > resource_id = 'b587ddb1-1a94-11e6-8478-000c291e9f7b' and generation = 5;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 1 row affected (0.00 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Rows matched: 1  Changed: 1  Warnings: 0<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > This time it works, 1 row was updated, so we commit.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > mysql> commit;<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Query OK, 0 rows affected (0.01 sec)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Treat freeing of a resource identically. First delete rows from<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > allocations and in the same transaction attempt to update resources<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > again. If you get a row updated, commit and if no row is updated,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > rollback and try again.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Hope this helps!<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > -amrith<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > On Sun, 2016-05-15 at 01:16 -0700, Qijing Li wrote:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Hi Vilobh,<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Here is my thoughts on how Delimiter uses generation-id to guarantee<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>   sequencing. Please correct me if I understand it wrong.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> First, the Delimiter need to introduce another model ResourceProvider<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> who has two attributes:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>        * resource_id<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>        * generation_id<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> The followings are the steps of how to consume a quota:<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Step 1. Check if there is enough available quota<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>      If yes, then get the $generation_id  by querying the model<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> ResourceProvider with the given resource_id which is the point in time<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> view of resource usage.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>      If no, terminate the process of consuming the quota and return the<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> message of “No enough quotas available."<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Step 2. Consume the quota.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>     2.1 Begin transaction<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>     2.2 Update the QuotaUsage model: QuotaUsage.in_use =<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> QuotaUsage.in_use + amount of quota requested.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>     2.3 Get the $generation_id by querying the ResourceProvider by the<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> given resource_id.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>          If the $generation_id is larger than the $generation_id in<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Step 1, then roll back transaction and GOTO step 1.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>             this case means there is someone else has changed the<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> QuotaUsage during this process.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>          If the $generation_id is the same as the $generation_id in<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Step 1, then increase the ResourceProvider.generation_id by one and<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>          Commit the transaction. Done!<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>          Note: no case the $generation_id is less than the<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> $generation_id in Step 1 because the $generation_id is nondecreasing.<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> — Qijing<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> __________________________________________________________________________<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> OpenStack Development Mailing List (not for usage questions)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >> Unsubscribe:
<a href="mailto:OpenStack-dev-request@lists.openstack.org?subject:unsubscribe">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > __________________________________________________________________________<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > OpenStack Development Mailing List (not for usage questions)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> > Unsubscribe:
<a href="mailto:OpenStack-dev-request@lists.openstack.org?subject:unsubscribe">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> >
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> ><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> __________________________________________________________________________<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> OpenStack Development Mailing List (not for usage questions)<o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">> Unsubscribe:
<a href="mailto:OpenStack-dev-request@lists.openstack.org?subject:unsubscribe">OpenStack-dev-request@lists.openstack.org?subject:unsubscribe</a><o:p></o:p></span></font></p>
<p class="MsoPlainText"><font size="2" face="Consolas"><span style="font-size:11.0pt">>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><o:p></o:p></span></font></p>
<p class="MsoPlainText" style="margin-left:5.25pt"><font size="2" face="Consolas"><o:p> </o:p></font></p>
<p class="MsoNormal"><font size="2" color="#1f497d" face="Consolas"><span style="font-size:11.0pt;font-family:Consolas;color:#1F497D"><o:p> </o:p></span></font></p>
</div>
</div>
</div>
</body>
</html>