<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:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@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:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
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;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
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";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:917522968;
        mso-list-type:hybrid;
        mso-list-template-ids:2002554044 2010021036 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:Calibri;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></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-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi Folks,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In multi-host mode the “host” field of a network never seems to get set (as only IPs are allocated, not networks)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>However the periodic revovery task in NetworkManager uses the host field to filter what addresses it should consider cleaning up (to catch the case where the message from dnsmasq is either never sent or not delivered for some reason)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>    if self.timeout_fixed_ips:<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>            now = utils.utcnow()<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>            timeout = FLAGS.fixed_ip_disassociate_timeout<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>            time = now - datetime.timedelta(seconds=timeout)<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>            num = self.db.fixed_ip_disassociate_all_by_timeout(context,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                                                               self.host,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                                                               time)<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>            if num:<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                LOG.debug(_('Dissassociated %s stale fixed ip(s)'), num)<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Where “db.fixed_ip_disassociate_all_by_timeout”   is:<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>def fixed_ip_disassociate_all_by_timeout(_context, host, time):<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>    session = get_session()<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>    inner_q = session.query(models.Network.id).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                      filter_by(host=host).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                      subquery()<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>    result = session.query(models.FixedIp).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                     filter(models.FixedIp.network_id.in_(inner_q)).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                     filter(models.FixedIp.updated_at < time).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                     filter(models.FixedIp.instance_id != None).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                     filter_by(allocated=False).\<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                     update({'instance_id': None,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                             'leased': False,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                             'updated_at': utils.utcnow()},<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                             synchronize_session='fetch')<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>    return result<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>So what this seems to do to me is:<o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>          </span></span></span><![endif]><span style='color:#1F497D'>Find all of the fixed_ips which are:<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><![if !supportLists]><span style='font-family:"Courier New";color:#1F497D'><span style='mso-list:Ignore'>o<span style='font:7.0pt "Times New Roman"'>   </span></span></span><![endif]><span style='color:#1F497D'>on networks assigned to this host<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><![if !supportLists]><span style='font-family:"Courier New";color:#1F497D'><span style='mso-list:Ignore'>o<span style='font:7.0pt "Times New Roman"'>   </span></span></span><![endif]><span style='color:#1F497D'>Were last updated more that “Timeout” seconds ago<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><![if !supportLists]><span style='font-family:"Courier New";color:#1F497D'><span style='mso-list:Ignore'>o<span style='font:7.0pt "Times New Roman"'>   </span></span></span><![endif]><span style='color:#1F497D'>Are associated to an instance<o:p></o:p></span></p><p class=MsoListParagraph style='margin-left:72.0pt;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><![if !supportLists]><span style='font-family:"Courier New";color:#1F497D'><span style='mso-list:Ignore'>o<span style='font:7.0pt "Times New Roman"'>   </span></span></span><![endif]><span style='color:#1F497D'>Are not allocated<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>Because in multi-host mode the network host field is always Null, this query does nothing apart from give the DB a good work out every 10 seconds – so there could be a slow leakage of IP addresses.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Has anyone else spotted this – and if so do you have a good strategy for dealing with it ?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>It seems that running this on every network_manager every 10 seconds is excessive – so what still running on all netwok_managers but using a long random sleep between runs in mult-host mode ?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Thoughts ?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Cheers,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Phil</span><o:p></o:p></p></div></body></html>