<div dir="ltr">Just to round out this thread, this issue has now been dealt with (thanks Tim!). The server now translates these errors into a more useful error that indicates the client should retry the required. The Juju commmand line client transparently intercepts these errors and retries.<div><br></div><div>Here's the relevant pull request: <a href="https://github.com/juju/juju/pull/5927">https://github.com/juju/juju/pull/5927</a></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 26 July 2016 at 14:42, Reed O'Brien <span dir="ltr"><<a href="mailto:reed.obrien@canonical.com" target="_blank">reed.obrien@canonical.com</a>></span> wrote:<br><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"><span class="">On Mon, Jul 25, 2016 at 5:38 PM, Menno Smits <span dir="ltr"><<a href="mailto:menno.smits@canonical.com" target="_blank">menno.smits@canonical.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Regarding <a href="https://bugs.launchpad.net/juju-core/+bug/1597601" target="_blank">https://bugs.launchpad.net/<wbr>juju-core/+bug/1597601</a> ...<br></div><div><br></div><div>When "juju enable-ha" is used, new controller machines are started, each running a mongod instance which is connected to Juju's replicaset. As each new node joins the replicaset a MongoDB leader election is triggered which causes all mongod instances in the replicaset to drop their connections (this is by design). The workers in the Juju's machine agents handle this correctly by aborting and restarting with fresh connections to MongoDB.<br></div><div><br></div><div>The problem is that if an API request comes in at just the right time, it will be actioned just as the MongoDB connection goes down, resulting in the i/o timeout error being reported back to the client.</div><div><br></div><div>This isn't a new problem but it's one that Juju's users regularly run in to. A workaround is to wait for the new controller machines to come up after enable-ha is issued before doing anything else.</div><div><br></div><div>IMHO it would be best if Juju could hide all this from the client as much as possible but I'm really not sure if that's feasible or what the best approach should be.</div><div><br></div><div>The challenge is that unless we do some major rearchitecting, the API server needs to be restarted when the MongoDB connections drop. There's no way to that the client's connection can stay up, making it difficult to hide this detail from the client. </div></div></blockquote><div><br></div></span><div>It seems that mgo could handle this as a failover. Or that we could see that the replica set is starting and wait until it reports being up, then refresh the mgo session. I don't understand why the API server itself has to restart, though I am sure there are good reasons.</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>The most practical solution I can think of is that we introduce a new error type over the API which means "please retry the request". Errors such as an i/o timeout from the MongoDB layer could be converted into this error. Clients would obviously have to handle this error specially.</div></div></blockquote><div><br></div></span><div>Barring handling it via mgo session this seems obvious and practical.</div><span class="HOEnZb"><font color="#888888"><div> </div><div><br></div></font></span></div><span class="HOEnZb"><font color="#888888"><div>~ro</div><div><br></div>-- <br><div data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr">Reed O'Brien <div><div><span style="font-size:12.8px">✉ </span><a href="mailto:reed.obrien@canonical.com" target="_blank">reed.obrien@canonical.com</a></div><div style="font-size:12.8px">✆ <span title="Call with Google Voice"><a href="tel:415-562-6797" value="+14155626797" target="_blank">415-562-6797</a></span></div></div><div style="font-size:12.8px"><span title="Call with Google Voice"><br></span></div></div></div></div></div>
</font></span></div></div>
</blockquote></div><br></div>