RFC: Striktes Locking für Timer etc.

  • In der nächsten Developer-Version von VDR werden SVDRP-Befehle in einem separaten Thread ausgeführt, was zu teilweise erheblich besseren Response-Zeiten führt. Der Zugriff auf globale Datenstrukturen wie etwa Timer, Channels etc. muß dafür allerdings streng reglementiert werden, damit nicht zwei verschiedene Threads gleichzeitig schreibend zugreifen. Das bisherige BeingEdited() reicht dafür nicht mehr.


    Nun überlege ich seit einigen Tagen, wie ich das am besten angehe. Dabei gibt es aus momentaner Sicht zwei Möglichkeiten (am Beispiel der Timer):

    • Es bleibt im Wesentlichen alles, wie es ist, also weiterhin eine globale Variable 'Timers', auf die einfach zugegriffen werden kann. cTimers bekommt entsprechende Lock() und Unlock() Funktionen, aber ob die wirklich aufgerufen werden ist Sache des Entwicklers. Es wird auch nichts dagegen unternommen, daß man zwar einen Read-Lock() hat, aber dennoch schreibend zugreift.
    • Die gobale Variable 'Timers' wird "versteckt" und ist nur noch über Zugriffsfunktionen erreichbar, die zum Einen für das Locking sorgen und zum anderen auch im Falle eines Read-Locks die Liste nur als 'const' zurückgeben.


    Die erste Variante hätte den Vorteil, daß an Plugin-Code nur wenig geändert werden müsste. Es bräuchten lediglich an den entsprechenden Stellen die Lock()/Unlock()-Aufrufe eingebaut zu werden. Der Nachteil dabei ist, daß nicht garantiert ist, daß alle Stellen richtig gelockt werden, und auch bei neu zu schreibendem Code wird man nicht automatisch dazu verpflichtet, entsprechend zu locken.


    Die zweite Variante hätte den Vorteil, daß ein Zugriff ohne korrektes Locking gar nicht mehr möglich wäre. Alle vorhandenen Zugriffstellen würden automatisch vom Compiler erkannt, da die globale Variabe 'Timers' nicht mehr existiert. Nachteil wäre, daß in allen Plugins, die mit Timern arbeiten, etwas umfangreichere Änderungen nötig wären, da z.B. nicht mehr über 'Timers.Xyz()' zugegriffen wird, sondern über 'Timers->Xyz()'. Aber auch das würde alles der Compiler melden.


    Für die zweite Variante wäre es wohl praktisch, das Locking und die State-Abfrage (d.h. ob sich die Liste seit dem letzten lesenden Zugriff verändert hat) in einem Aufwasch zu machen. Ein mögliches Interface hierzu könnte so aussehen:


    Da ich da jetzt irgendwie hin- und hergerissen bin zwischen "quick&dirty" und einer wohl stabileren, aber aufwändigeren Lösung, würde ich gerne mal ein Paar Meinungen dazu hören. Vielleicht kommt ja auch jemand noch auf eine ganz andere Idee ;-).


    Klaus

  • Erfahrungsgemäß wird Lösung 1 wohl zu komischen Effekten führen, nicht oft, aber wohl öfter, als man erwartet. Deshalb tendiere ich auch eher zur Lösung 2, auch wenn viele Plugins angefasst werden müssen. Das trennt dann die aktiv gepflegten von den alten, es sei denn, es findet sich tatsächlich mal ein neuer Maintainer. Verwaiste Plugins mal loszuwerden finde ich grundsätzlich eine gute Idee.


    Den StateKey speichert man wahrscheinlich in einem länger lebendem Objekt, also z.B. im Plugin-Objekt selbst, damit es dann immer mal wieder prüfen kann, ob sich was verändert hat, um dann was auch immer zu aktualisieren, oder?


    Momentan gibt es ja eigentlich nur bei den Aufnahmen und bei den Schedules sowas wie Locking. Werden diese Interfaces vereinheitlicht? Hätte evtl. auch Vorteile.
    Lösung 2 sieht auch so aus, als ob man mit wenigen ifdefs immer noch abwärtskompatibel sein kann.


    Das Nichtaktualisieren des StateKey beim Schreibzugriff ist dafür gedacht, dass man was ändern wollte, aber zwischendurch feststellt, dass doch nichts geändert wurde, richtig?


    Lars.

  • Moin,


    ich tendiere auch zum zweiten Ansatz, das ist sauberer. Die Umstellung wird zwar wieder knirschen, weil es mehr User als Plugin Maintainer gibt, aber da muss man dann halt durch ;)


    Ciao Louis

  • könnt ihr nochmal kurz beleuchten welche Plugins das real betreffen würde, soviele abgesehen von live und epgsearch seh ich da doch gar nicht auf den ersten Blick?


    Christian

    CKone: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G540, 2x 2GB Kingston DDR3, Zotac GT630 1GB, S2-1600, Ocz Agility 3 60GB, LG GH24NS DVD, 15.6" Selbstbau TFT, Harmony 665, CIR Selbstbau - das Ganze im Silverstone SST-SG03B
    CKtwo: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G1610, 2x 2GB Corsair DDR3, Zotac GT630 1GB, TT S2-1600, Ocz Vertex 2 50 GB, 92 Kanal Seduatmo, Harmony 665, atric USB
    CKthree: yavdr-ansible/22.04 LTS/2.6.1/kodi19.3 auf Intel NUC, Celeron J4005, UHD Graphics 600, 4GB Crucial DDR4, Ocz Vertex2 50 GB, Harmony 350

    PowerEdge: Ubuntu Server 16.04 LTS / VDR 2.4.1 auf Dell PowerEdge T20, Xeon E3-1225 v3, 16GB ECC DDR3, 2x Cine S2 V6 mit Duoflex, Samsung 840 EVO 120GB, 3x WD White WD80EZAZ 8TB in SW Raid5



  • remotetimers und restfulapi

  • Erfahrungsgemäß wird Lösung 1 wohl zu komischen Effekten führen, nicht oft, aber wohl öfter, als man erwartet.


    Das befürchte ich auch.


    Zitat


    Den StateKey speichert man wahrscheinlich in einem länger lebendem Objekt, also z.B. im Plugin-Objekt selbst, damit es dann immer mal wieder prüfen kann, ob sich was verändert hat, um dann was auch immer zu aktualisieren, oder?


    Genau so. Das entspricht der bisher an verschiedenen Stellen verwendeten 'state'-Variablen.


    Zitat


    Das Nichtaktualisieren des StateKey beim Schreibzugriff ist dafür gedacht, dass man was ändern wollte, aber zwischendurch feststellt, dass doch nichts geändert wurde, richtig?


    Exakt.


    Klaus

  • Die Skins werden sicherlich betroffen sein, auch dbus2vdr, recsearch, aber alles nicht weiter wild, denke ich.
    Wenn es soweit ist, wird man schon noch merken, was noch baut und was nicht. Kannst ja mal alle Pluginsourcen aus deinem oder unserem PPA herunterladen und durchsuchen... :)


    Welche Plugins aber betroffen sind, finde ich eher zweitrangig. Bisher hat auch immer alles ganz gut geklappt.


    Lars

  • restfulapi hast du recht, remotetimers wird damit ja idealerweise obsolete, sonst machts ja keinen Sinn ;)


    In dem Zusammenhang gleich ein featurerequest an Klaus das man default Speicherorte für Timer, Direktaufnahmen und Pause/Timeshift hinterlegen kann, zumindest für die Erstgenannten.


    Christian

    CKone: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G540, 2x 2GB Kingston DDR3, Zotac GT630 1GB, S2-1600, Ocz Agility 3 60GB, LG GH24NS DVD, 15.6" Selbstbau TFT, Harmony 665, CIR Selbstbau - das Ganze im Silverstone SST-SG03B
    CKtwo: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G1610, 2x 2GB Corsair DDR3, Zotac GT630 1GB, TT S2-1600, Ocz Vertex 2 50 GB, 92 Kanal Seduatmo, Harmony 665, atric USB
    CKthree: yavdr-ansible/22.04 LTS/2.6.1/kodi19.3 auf Intel NUC, Celeron J4005, UHD Graphics 600, 4GB Crucial DDR4, Ocz Vertex2 50 GB, Harmony 350

    PowerEdge: Ubuntu Server 16.04 LTS / VDR 2.4.1 auf Dell PowerEdge T20, Xeon E3-1225 v3, 16GB ECC DDR3, 2x Cine S2 V6 mit Duoflex, Samsung 840 EVO 120GB, 3x WD White WD80EZAZ 8TB in SW Raid5



  • prima, auf gehts! ;)

    CKone: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G540, 2x 2GB Kingston DDR3, Zotac GT630 1GB, S2-1600, Ocz Agility 3 60GB, LG GH24NS DVD, 15.6" Selbstbau TFT, Harmony 665, CIR Selbstbau - das Ganze im Silverstone SST-SG03B
    CKtwo: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G1610, 2x 2GB Corsair DDR3, Zotac GT630 1GB, TT S2-1600, Ocz Vertex 2 50 GB, 92 Kanal Seduatmo, Harmony 665, atric USB
    CKthree: yavdr-ansible/22.04 LTS/2.6.1/kodi19.3 auf Intel NUC, Celeron J4005, UHD Graphics 600, 4GB Crucial DDR4, Ocz Vertex2 50 GB, Harmony 350

    PowerEdge: Ubuntu Server 16.04 LTS / VDR 2.4.1 auf Dell PowerEdge T20, Xeon E3-1225 v3, 16GB ECC DDR3, 2x Cine S2 V6 mit Duoflex, Samsung 840 EVO 120GB, 3x WD White WD80EZAZ 8TB in SW Raid5



  • Das klingt so, als würdest du damit die Funktion diverser Plugins behindern die tunen müssen und raw TS Daten benötigen, und ohnehin innerhalb VDR auf cReceiver angewiesen sind.


    Ist diese Änderung nützlich und wünschenswert? Was bringen SVDRP Response Zeiten, wenn diese Änderung Plugins in deren Freiheiten einschränkt?

  • ..wenn ein Plugin Änderuingen an den Timern und Kanälen durchführen will, klingt das naheliegend.

  • Ok, aber wo ist das Problem? Du scannst im Hintergrund nach neuen Kanälen und wenn du eine Änderung in die globale Liste einpflegen willst, wird sie gelockt, geändert und wieder freigegeben. Das ließe sich auch intern im Plugin über eine queue und einen extra Thread abbilden, der das Locking übernimmt, so dass der Tuner-Thread vollkommen frei ist.


    Ein vernünftiges Locking der globalen vdr-Listen wünsche ich mir schon länger...


    Lars

  • ..zumindest wenn die globale Kanalliste versteckt wird, dann war es das z.B. mit meinem Plugin wirbelscan. Aber vllt. ist es ja eh mal Zeit für was neues.

  • wirbel: deine Argumentation verstehe ich ehrlich gesagt nicht so ganz. Mit "tunen müssen" und "raw TS Daten" hat das Ganze doch überhaupt nichts zu tun. Und wenn von unterschiedlichen Threads auf die selben Daten zugegriffen werden soll, dann ist es unumgänglich, daß der Zugriff über geeignete Locks geregelt wird - sonst sind Abstürze vorprogrammiert. Wenn die globalen Listen "versteckt" werden, dann heißt das doch nicht, daß du sie in deinem Plugin nicht mehr benutzen kannst. Es bedeutet lediglich, daß du sie dir bei Bedarf über eine wohldefinierte Schnittstelle "holen" musst, damit sichergestellt ist, daß du auch den entsprechenden Lock hältst. Du wirst nach wie vor auf die Listen zugreifen können, halt nur etwas "geregelter" als jetzt.


    Klaus

  • Noch eine Frage:
    Hast du auch vor, das cDevice-Array in eine lockbare Liste umzuwandeln? Das würde meinem Bemühen entgegen kommen, den vdr fit für dynamische Devices zu machen, so dass er zur Laufzeit einzelne Devices wieder zerstören bzw. neue erstellen kann (Stichwort USB-DVB-Sticks).


    Lars.

  • 'remotetimers' dürfte mit der nächsten Developer-Version hinfällig werden, da man dann in VDR selber Timer beliebig zwischen den VDRs im Netzwerk verschieben bzw. editieren werden kann.


    Klaus


    OT:


    Ist für die nächste dev auch ein vdr-to-vdr streaming geplant?



    Gruss
    tec

  • Ich bin auch für Lösung 2.
    Die patches für die bar Plugins die ich verwende werde ich sicher finden ;D
    Hauptsache der VDR läuft stabil.


    mfg Thomas

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!