Frage zur Arbeit mit eigenen Thread's

  • Hallo @red5, eigentlich wollte ich dich erst wieder nerven:saint: wenn du wieder Zeit für Plugins hast.
    Aber ich habe etwas Mysteriöses festgestellt, das ich besprechen muss.


    Ich bin mir zu 99% sicher das ich die Thread's, mittlerweile gut synchronisiere und sinnvoll Locke.
    Unter anderem wird eine Aufwendige GUI erstellt, die durch Plugin.enqueue "Ausgelagert" wird. Hier wird ein größeres Raster erstellt (Teste 5x5, 5,10 & 30x30), was auch alles soweit super klappt.

    Das Phänomen:
    -1- Frisch gestarteter DedicatedServer und RW-Spiel: Ich kann die 30x30 (900 Elemente) Liste Öffnen und habe keine Probleme.
    -2- Frisch gestarteter DedicatedServer, RW nach Disconekt (vom Fehler) weiter genutzt: Wenn ich jetzt die 30x30 Liste Öffne, bekomme ich den Kirtischen Fehler Trying to close low level socket support, but we still have sockets open! schon nach kurzer Zeit ca. 90sec.


    Da ich normalerweise das Spiel nach einem Server Absturz nicht schlisse, hat es eine Weile gedauert, bis es mir aufgefallen ist. Ich vermute das ich oder das Spiel im Client die Threads nicht richtig aufräumen.


    Wenn ich im "1.Phänomen" nach ca. 30min. von der 30x30 auf eine andere Liste Wechsel habe ich wieder 90-120 sec. bis zum Absturz.

    Kurioserweise kann ich nach diesem kritischen Fehler (Server mit restart), die kleineren Listen 5x5 & 5x10 ohne Probleme lange hin und her Schalten.


    Es deutet, für mich, darauf hin, dass es etwas gibt, das bei den 30x30 Listen, etwas im Client durcheinander bringt, was aber bei frischem Start nicht auftrit.



    Ich widme mich diesem Problem schon eine Weile, ich weiß nicht wie ich das weiter untersuchen kann.


    Wenn du etwas im Spiel-Code findest, was dieses Verhalten erklären kann, lass es mich wissen:thumbup:

    Oder es für dich nach einem typischen Fehler bei ... anhört.
    Danke.

  • Unter anderem wird eine Aufwendige GUI erstellt, die durch Plugin.enqueue "Ausgelagert" wird. Hier wird ein größeres Raster erstellt (Teste 5x5, 5,10 & 30x30), was auch alles soweit super klappt.

    Bei "enqueue()" musst du nur bedenken, dass dadurch alles in den Main-Thread des Servers ausgelagert wird. Wenn dort zB eine umfangreiche Berechnung stattfindet, kann das den Server solange zum Hängen bringen.


    Wenn ich jetzt die 30x30 Liste Öffne, bekomme ich den Kirtischen Fehler Trying to close low level socket support, but we still have sockets open! schon nach kurzer Zeit ca. 90sec.

    Diese Meldung ist nicht der Fehler, das ist nur eine Meldung von Steam, die auftritt, wenn der Prozess unerwartet beendet wurde ;) Der Crash tritt also zwischen dieser Ausgabe und der letzten Ausgabe des Servers ("Saved 1 players in database") auf. Da es den Server zerreißt, findet leider keine Fehlermeldung über den Crash statt.


    Es deutet, für mich, darauf hin, dass es etwas gibt, das bei den 30x30 Listen, etwas im Client durcheinander bringt, was aber bei frischem Start nicht auftrit.

    Crasht der Client denn? Ansonsten hat er keinen Einfluss auf den Server oder die API, d.h. der Client kann den Server nicht direkt zum crashen bringen (oder umgekehrt).


    Du kannst aber ggf. mal die neueste hs_err_pid Datei im Serververzeichnis hier hochladen (das hilft aber leider nur, wenn der Fehler irgendwo auf Java Seite stattfindet). Ansonsten ist die Fehlersuche leider etwas schwierig... hast du sonst ggf. irgendwie die Chance, das Problem clientseitig zu reproduzieren (also die Plugins auf dem Client installieren und im Singleplayer zu testen, ganz ohne Server)? Da kann im Falle eines Crashes dann wenigstens der Client neugestartet und ein Report gesendet werden (der mehr Infos enthält) :thinking:

  • Leider wird bei mir keine hs_err_pid mehr erstellt, meine Letzte ist vom (26.06.2023):thinking: nur das Jahr Stimmt nicht:thinking:denke aber nicht das, die Falsch datiert sind.
    Habe ich das eventuell in der Config abgeschaltet?


    Bei "enqueue()" musst du nur bedenken, dass dadurch alles in den Main-Thread des Servers ausgelagert wird. Wenn dort zB eine umfangreiche Berechnung stattfindet, kann das den Server solange zum Hängen bringen.

    Und Plugin().executeDelayed ist dann ein Asyncroner Thread?


    Crasht der Client denn? Ansonsten hat er keinen Einfluss auf den Server oder die API, d.h. der Client kann den Server nicht direkt zum crashen bringen (oder umgekehrt).

    Nein der Client bleibt stabil:thumbup:

    Das habe ich auch eigentlich nicht erwartet:D Es war nur ein Bauchgefühl:wacko:

    hast du sonst ggf. irgendwie die Chance, das Problem clientseitig zu reproduzieren

    Klar, den Single Player Test werde ich mal machen:thumbup:und ein Report senden, wenn er kommt.

  • Leider wird bei mir keine hs_err_pid mehr erstellt, meine Letzte ist vom (26.06.2023) :thinking: nur das Jahr Stimmt nicht :thinking: denke aber nicht das, die Falsch datiert sind.
    Habe ich das eventuell in der Config abgeschaltet?

    Sorry, standardmäßig sind die tatsächlich deaktiviert. Du kannst das aber in der server.properties Datei ändern, indem du Plugins_SuppressFatalErrorLogs auf false änderst ;)

    Wenn du clientseitig testest, kannst du diese Zeile so kopieren und zur config.properties Datei hinzufügen.


    Und Plugin().executeDelayed ist dann ein Asyncroner Thread?

    Nein, auch das wird im Main-Thread ausgeführt. Der einzige Unterschied ist, dass der Code erst nach der angegebenen Verzögerung ausgeführt wird. Die API bietet keine direkte Methode, irgendwas direkt asynchron oder im Hintergrund auszuführen. Java bietet aber eine Reihe an Möglichkeiten, zB kannst du direkt mit Threads arbeiten, oder zB für eine Pendant zum C# async könntest du "CompletableFuture" verwenden.


    Wir überlegen aber auch, die API auf eine neuere Java Version zu updaten, da es seit Java 21 "Virtual Threads" gibt, die deutlich weniger Overheat als klassische Threads haben. Wir könnten dann auch direkt der Plugin-Klasse eine entsprechende Funktion geben ^^


    Klar, den Single Player Test werde ich mal machen :thumbup: und ein Report senden, wenn er kommt.

    :):thumbup:

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!