[OSM-Devserver] Kommunikation mit Tirex-Master

Jochen Topf jochen at remote.org
Di Mär 29 12:05:09 CEST 2011


On Tue, Mar 29, 2011 at 10:59:14AM +0200, Peter Körner wrote:
> Am 28.03.2011 19:28, schrieb Jochen Topf:
> >Ah, das Problem ist, dass ich das auf mercator entwickelt und getestet hab und
> >da läuft noch eine alte Version vom tirex, die noch UDP verwendet und nicht
> >Unix Domain Sockets für die Kommunkation mit dem Master. Warum da eine alte
> >Version läuft, weiss ich aber auch nicht. :-(
> 
> Es ist sowieso nicht ganz klar, warum die Render-Prozesse UDP
> verwenden, der Master aber nicht. Nach dem ich auf der ML

Ok, also ich gebe zu das ist etwas verwirrend. Hat mich ja auch grad verwirrt. :-)
Ich hab das letzten Sommer umgestellt und wusste auch nicht mehr so genau, was da
war. Wenn ich mich jetzt recht erinnere, dann ist das so:

Wenn Du auf einen UDP-Socket Daten schickst und der Server kann sie nicht schnell
genug verarbeiten, dann gehen die Daten verloren. Wenn Du auf einen Unix Domain
Datagramm Socket Daten schickst und der Server kann sie nicht annehmen, dann
blockiert der Client. Da wir keine Daten verlieren wollen, ist letzteres besser.

Für die Kommunikation zum Rendering-Prozess ist das nicht so wichtig, weil da
nie so viele Daten geschickt werden, als das das passieren kann. Und ja, es wäre
konsistent das da auch umzustellen. Patches welcome. :-)

> nachgefragt habe [1] bin ich zu folgendem Testcase gekommen [2]
> welcher diese Ausgabe erzeugt: [3].

Mir ist nicht klar, was dieser "listening"-Event macht. Das macht m.E. keinen Sinn
für einen Datagramm-Socket. Vielleicht feuert der ja bevor der bind aufgerufen
wird.

Probier mal so:

var client = dgram.createSocket('unix_dgram');
client.bind(clientPath);

client.on('message', function(msg, rinfo) {
    console.log('client got: ' + msg + ' from ' + rinfo.address);
    client.close();
});

client.send(msgToSend, 0, msgToSend.length, tirexPath, function(err, bytes) {
    if (err) {
        console.log('Caught error in client send.');
        throw err;
    }

    console.log('client wrote ' + bytes + ' bytes.');
    });
});

> Tirex scheint nun eine Antwort-Adresse zu erhalten - doch die
> Antwort kommt im node nicht an.
> 
> Ich frage mich, ob es nicht einfacher wäre, eine UDP-Source analog
> zu Command.pm zu bauen.
> 
> Lg, Peter
> 
> 
> [1] <http://groups.google.com/group/nodejs/browse_thread/thread/6be885a7827e143f>
> [2] <https://gist.github.com/892024>
> [3] <https://gist.github.com/892030>
> 

Benutzt Du eigentlich Solaris oder Linux? Unter Linux gibt es die "abstract"
names für Unix Domain Sockets, siehe "man unix", die ich glaube ich benutzt mit
dem bind(''). Hat den Vorteil, dass man den Socket nicht wegräumen muss hinterher.
Unter Solaris geht das halt nicht.

Jochen
-- 
Jochen Topf  jochen at remote.org  http://www.remote.org/jochen/  +49-721-388298