<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1187">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 12.0px; font: 12.0px Helvetica; color: #011892}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica; color: #011892; min-height: 14.0px}
p.p7 {margin: 0.0px 0.0px 0.0px 12.0px; font: 12.0px Helvetica; color: #011892; min-height: 14.0px}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000; min-height: 14.0px}
</style>
</head>
<body>
<p class="p1">On 2013-07-09 17:23:34 +0000, Jonathan Leivent said:</p>
<p class="p2"><br></p>
<p class="p3">My gen_server can actually tolerate having incoming requests dropped<span class="Apple-converted-space"> </span></p>
<p class="p3">more than it can tolerate having aggregation use up lots of memory<span class="Apple-converted-space"> </span></p>
<p class="p3">(potentially dying if it runs out, or at least slowing things down).<span class="Apple-converted-space"> </span></p>
<p class="p3">Maybe that means I will need to use gen_UDP - I knew I would eventually<span class="Apple-converted-space"> </span></p>
<p class="p3">switch to UDP to bypass the TCP overhead, but now that looks like a<span class="Apple-converted-space"> </span></p>
<p class="p3">sooner-rather-than-later project.</p>
<p class="p4"><br></p>
<p class="p5">But with gen_tcp you'd use {active, once} anyway (yes?) and this would give you TCP's flow control.</p>
<p class="p6"><br></p>
<p class="p3">For now, I cheated and used gen_server's internal message format - just<span class="Apple-converted-space"> </span></p>
<p class="p3">because doing that turns out to perturb the code I already have the<span class="Apple-converted-space"> </span></p>
<p class="p3">least.<span class="Apple-converted-space">  </span>All it takes is:</p>
<p class="p7"><br></p>
<p class="p3">aggregate_requests(L) -></p>
<p class="p3"><span class="Apple-converted-space">   </span>receive</p>
<p class="p3"><span class="Apple-converted-space">     </span>{'$gen_call', From, R={request, _}} -></p>
<p class="p3"><span class="Apple-converted-space">       </span>aggregate_requests([{From, R}|L])</p>
<p class="p3"><span class="Apple-converted-space">   </span>after 0 -> L</p>
<p class="p3"><span class="Apple-converted-space">   </span>end.</p>
<p class="p7"><br></p>
<p class="p3">That's just too tidy and easy to pass up, even if it does break<span class="Apple-converted-space"> </span></p>
<p class="p3">modularity.<span class="Apple-converted-space">  </span>I know I'll have to replace this when I face the<span class="Apple-converted-space"> </span></p>
<p class="p3">flow-control issue.</p>
<p class="p4"><br></p>
<p class="p5">I often just (mis)use the gen module, especially gen:call(), this gives you all the neat monitoring and everything from gen_server.<span class="Apple-converted-space">  </span>But then I use a plain erlang server (started with proc_lib:spawn_link or even use something like Ulf's plain_fsm) to be able to do selective receive.</p>
<p class="p4"><br></p>
<p class="p5">Selective receive is a very powerful tool in Erlang that you can't use properly if using the gen_* servers.<span class="Apple-converted-space">  </span>Those are for sequential requests, and often you want this.<span class="Apple-converted-space">  </span>But if you need selective receive as in your case they just get into the way.</p>
<p class="p4"><br></p>
<p class="p5">I think gen:call should be documented and made official so it is exposed better and can be used with a more quiet state of mind.<span class="Apple-converted-space">  </span>On the other hand I don't think its likely to change so I use it anyway.</p>
<p class="p4"><br></p>
<p class="p5">Having said this, your possibly unbounded growing mailbox is a bit scary and will at some point probably crash your node.<span class="Apple-converted-space">  </span>You should combine your selective<span class="Apple-converted-space">  </span>receives with some way of limiting requests.</p>
<p class="p4"><br></p>
<p class="p5">Jespers https://github.com/jlouis/safetyvalve comes into mind, I think it has pluggable queuing so you might be able to keep your mailbox selective recieve aggregation and just use Safetyvalves CoDel to control it as queue.</p>
<p class="p4"><br></p>
<p class="p5">@Jesper would that be possible with Safetyvalve (to use it with a Erlang mailbox as Queue)?</p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p7"><br></p>
<p class="p3">-- Jonathan</p>
<p class="p8"><br></p>
</body>
</html>