[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