[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [DDL-ML] Erddcd command queue length
Harald Barth wrote:
Erddcd: QSIZE in queue.c ist 2000. Alle Kommandos die während POWER
OFF empfangen werden landen in der Queue.
* Was sollte passieren wenn die Queue voll ist?
Im Moment "veralten" automatisch die ältesten
Einträge. Es ist eine einfache Lösung, aber bisher
ist niemand an diese Grenze gestossen. Es würde
dann auch erstmal genügen, den Ringpuffer zu vergrössern.
Man kann den Ringpuffer gleich dramatisch raufsetzen.
(z.B. auf 20000).
In queue_add sollte
irgendwie
in++;
if (in==QSIZE) in=0;
if (in == out) { ???? }
pthread_mutex_unlock(&queue_mutex);
berücksichtigt werden.
Ich halte das für übertriebenen Aufwand. Es lohnt nicht
beim Blick auf den Nutzen.
* Müssen während des POWER OFF alle Kommandos in der Queue abgelegt
werden oder reicht es für jedes gesteuerte Objekt das letzte
Kommando aufzuheben und alles andere wegzuwerfen? Sollte man SET GL
so optimieren? Geht das für SET GA? Wie radikal kann man sein?
Da man nicht bei jedem queue_add die ganze Queue ablaufen will denke
ich an einen Garbagecollect der bei voller Queue eine Runde läuft
und optimiert. Über die Details kann man sich dann immer noch
Gedanken machen wenn wir einig sind, daß wir sowas haben wollen.
Wenn man so was machen will, muss man es richtig machen. Die Frage,
die zu beantworten ist: Lohnt der Aufwand? (IMHO: Nein)
Die andere Alternative - eine dynamische Queue bei der dann eben der
Arbeitsspeicher die Grenze setzt - ist auch nicht das gelbe vom Ei, da
dann beim POWER ON zig Befehle abgeackert werden müssen.
Sehe ich auch so.
Ich habe damals zuerst eine einfache Lösung gesucht und war mit dem dann
implementierten Ringbuffer recht zufrieden.
(Zuerst gab es gar keine Entkoppelung zwischen eingehenden Befehlen und
deren Verarbeitung. Das war gar nicht gut .... ;-) )
Sicher kann es bei der jetzigen Implementierung zu Datenverlusten
kommen, die Frage ist nur, ob dieser Fall in der Praxis auftreten
kann und wie "schlimm" sich das tatsächlich auswirkt.
Im Prinzip ist ja nur das "Gedächtnis" der "Zentrale" erddcd beschränkt
auf 2000 nicht abgearbeitete Einträge. Wie wäre es mit folgender
einfachen Lösung: Die Größe des Ringpuffers kann per Konfig-Datei oder
Kommandozeilenargument festgelegt werden. Der Defaultwert ist 2000.
Dann kann jeder Anwender bei Bedarf reagieren.
Torsten
--
Torsten Vogt, Diplom Wirtschaftsinformatiker
SW-Entwicklung, IT-Beratung, Schulung, WWW-Anwendungen und E-Commerce
Tel: 06322/948736 Fax: 06322/948737 Mail: vogt@vogt-it.com
WWW: http://www.vogt-it.com