TopLogic - the automated application engine
  • Releases
  • Dokumentation
  • Github
  • Discord
  1. Home
  2. Releases
  3. TL_8.0.0-alpha10
  4. #29711

8.0.0-alpha10
TopLogic Release

2026-10-09

enhancement

major
#29651
TL Views: Container <accordion> mit einklappbaren Abschnitten
#29652
TL Views: Hinweisbox <alert> im Inhalt einer View
#29654
TL Views: Auswahlfeld als Radio-Gruppe für beliebig viele Optionen
#29661
TL Views: Prototyp "TopLogic UI on MUI" – Adaptermodul mit Material UI für die ersetzbaren Komponenten
#29692
TL Views: Formularfelder, Tabellenzellen und das Bearbeiten eines Formulars richten sich nach den Modell-Zugriffsrechten
#29693
TL Views: Große und mehrwertige Werte erscheinen in Tabellenzellen als einzeilige Vorschau mit einem Knopf, der den vollständigen Editor in einem Dialog öffnet
#29707
Reduce PR CI build time: parallel reactor build, sharded scripted tests, affected-module builds
#29730
React-Oberfläche: Kanban-Board als View-Element (Karten per Drag & Drop zwischen Spalten verschieben)
#29735
User menu: the application cannot say what the account is called
#29741
anonymous-Benutzer soll per Default nicht in Personenauswahlfeldern auftauchen
#29744
TL Views: Entwicklerwerkzeuge (Designer, Aufzeichnen, Untersuchen, Agentenzugriff) in einem eigenen Entwicklungsmenü der App-Leiste
#29752
React-UI: Kleine Verbesserungen der Oberfläche (Snackbar, Hover, Tooltips, Schieberegler, Abstände)
#29758
ModelAccessRights: Anlegerecht in Kompositionsattribut für Spezialisierung des Zieltyps prüfen
#29759
React-UI: Commit-Nachrichten für Änderungen aus Sichten (TL-Script-Aktionen, Transaktionen, Löschen) konfigurierbar, sinnvolle Standard-Nachrichten
#29760
Improve the React UI of the model-based security configuration; let a TL-Script function determine the access parent of a type
#29765
Engine developer docs (FAQ) are not discoverable when developing an application based on the engine
minor
#29513
Drag&Drop: Commit-Nachricht für Drop-Operationen konfigurierbar, sinnvolle Standard-Nachricht
#29747
Make the LDAP configuration ldapConf.xml configurable by system properties / environment variables
#29754
OpenAPI-Server: Variablenname für Request-Parameter, deren Name kein gültiger TL-Script-Bezeichner ist (z.B. Header X-Gitea-Event)

defect

major
#29581
TopLogicServlet: Vertrag dokumentieren - eine Anfrage hat nur im Fenster einen Benutzer
#29642
React dialog size memory: one key for every dialog, stored size beats the declared width and is never clamped to the window
#29646
TL Views: Der Build der React-Client-Module prüft die TypeScript-Typen nicht, in com.top_logic.layout.react sind dadurch 29 Typfehler aufgelaufen
#29697
HistoryQuery: Start- und Stop-Revision aus HistoryQueryArguments werden bei der Suche ignoriert.
#29701
TL Views: a form shown again after its sidebar section or tab was hidden keeps the values it had when hidden; a reload renders the stale values again
#29711
Setzen einer geordneten Liste (ListStorage) ist beim Einfügen vor bestehenden Elementen überquadratisch langsam; TestListStorage misst Wanduhrzeit und scheitert unter Last
#29712
Problem beim Zurücksetzen einer Selektion im Baum
#29716
Modellbasierte Leseprüfung: Rollen-Lookup kompiliert pro Objekt und Gruppe neue KB-Abfragen, Nicht-Admin wartet 70 s statt 9 s
#29723
Model editor class diagram fails with "Comparison method violates its general contract!"
#29724
PathNavigation: abstract attribute rejected by isDerived() check even though concrete overrides exist and are tracked
#29728
FlowChartComponent: Ein Neubau des Diagramms entfernt Objekte aus der Selektion, die im Diagramm nicht dargestellt werden
#29731
TL Views: <persist-transient> copies the draft's empty values over the creation defaults; a sequence number or creation date computed at commit is lost
#29732
TL Views: <create-transient container="…"> creates the draft without the container's context; option lists and context-dependent defaults of the draft see no container
#29734
View form: <store-form-state/> does not persist new rows of a <composition-table>, so saving a persistent owner fails
#29737
TL Views: a collapsing toolbar measures its commands only when its groups change; a command that shows itself later keeps a 0 px toolbar and draws over the panel title
#29740
Fehlender Schutz für den anonymous-Benutzer
#29745
Zugriff auf ein abstraktes Attribut meldet einen Fehler, der nicht sagt, dass das Attribut abstrakt ist: eigene Storage für abstrakte Attribute
#29746
FileManagerOverlay/FileManagerDelegate cannot read resources inside web-fragment WARs (tl_config overlay fails on engine configuration files)
#29773
PostgreSQL: Große SQL-Migrationen werden durch nicht freigegebene Autosave-Savepoints quadratisch langsam
minor
#29029
Incrementally deactivated drop-down select box can still be operated
#29514
Befehlsfreigabe und Berechtigung von Drag&Drop
#29696
Scheduler: Start- und Cluster-Verhalten von Tasks bereinigen – <on-startup/> pro Knotenstart, Tasks erst ab RUNNING, run-on-startup entfernen, kein Default für isNodeLocal()
#29699
TL-Script: htmlText(htmlSource($text), images) drops the images of a stored structured text, since it does not accept the "ref:" references it writes itself
#29700
TL Views: the open session of a deleted account keeps evaluating as that account; every model event logs "DeletedObjectAccess … was already deleted" from its observers
#29722
FlowDiagram: Fehlerhafte Baum-Layout-Berechnung
#29727
TL-Script Auswertungen mit Filtern können zu "null"-Literalen führen.
#29733
TL Views: a click on the padding of the React rich-text editor's content area does not focus the editor; the typed text is lost
#29736
Click-region menu opens flush on the window edge and under the trigger's tooltip
#29738
TL Views: the menu cliques of a toolbar are labelled in English in every language ("More", "View", "Export")
#29739
React tooltip stays open at the window's top-left corner when its anchor is removed under the pointer
#29743
React UI: Tooltip eines Menüeintrags erscheint hinter dem Menü
#29753
OpenAPI-Client: NullPointerException bei Antwort ohne Body (z.B. 204) mit Status ungleich 200
#29774
OpenAPI server: API key authentication cannot resolve an account — Person.byName called without an InteractionContext

task

major
#29725
CheckDependencies: npm-Abhängigkeiten werden nicht aktualisiert, transitive Maven-Abhängigkeiten mit bekannten Sicherheitslücken
#29726
WYSIWYG-Editor: Umstellung auf Tiptap 3 (Sicherheitslücke GHSA-cp6q-959q-f8rh)
defect (User-visible)

major

#29711

Setzen einer geordneten Liste (ListStorage) ist beim Einfügen vor bestehenden Elementen überquadratisch langsam; TestListStorage misst Wanduhrzeit und scheitert unter Last

Test

Beobachtung

Im Jenkins-Build tl-ci-pr #3 (voller Engine-Build mit allen Datenbanken; Modultests, 4 Skripttest-Shards, SpotBugs und 6 DB-Worker laufen gleichzeitig auf einem 8-CPU-Knoten, #29707) scheiterte:

TestAll.testLargeListPerformance with H2_KB
junit.framework.AssertionFailedError: TLObject.setList(50000 elements) should take less than 30 seconds, but took: 33 s 72.210553 ms

Bei der Analyse zeigte sich außerdem, dass das Setzen einer geordneten Liste (ListStorage, z. B. ein mehrwertiges, geordnetes Referenzattribut) sehr langsam wird, wenn viele neue Elemente vor bereits vorhandenen eingefügt werden – das deckte kein Test ab.

Analyse

Zeitmessung im Test

test.com.top_logic.element.meta.kbbased.storage.TestListStorage (com.top_logic.element) setzte in einer Transaktion eine Liste mit 50.000 Elementen und prüfte, dass das weniger als 30 Sekunden dauert. Gemessen wurde mit StopWatch, also Wanduhrzeit. Wanduhrzeit enthält jede Wartezeit auf eine CPU, die durch andere Prozesse belegt ist; bei mehreren parallelen Test-JVMs (PR-Pipeline #29707) überschreitet der Test das Limit, ohne dass sich ListStorage verändert hat.

Messung auf einem unbelasteten Rechner (H2_KB, Anhängen an eine leere Liste in einer Transaktion):

= Elemente = = Wanduhrzeit = = CPU-Zeit des Test-Threads = = gesamter Test =
50.000 4,9 s 4,9 s 18,5 s
20.000 1,4 s 1,4 s 6,7 s
10.000 0,7 s 0,7 s 3,6 s

Ohne Last sind CPU-Zeit und Wanduhrzeit gleich: die gesamte Arbeit (einschließlich eingebetteter H2-Datenbank und Commit) läuft im Test-Thread. Der Knoten im PR-Build war unter Last etwa 7-mal langsamer; das Limit hatte nur 6-fachen Abstand zum Normalwert.

Was der Test prüfte

ListStorage hängt neue Elemente an die Link-Liste an; LiveOrderedAssociationsList.updateOrderOnAppend() vergibt dabei jeweils einen Sortierwert OrderedLinkUtil.APPEND_INC (8192) über dem Vorgänger. Erst wenn der Wertebereich erschöpft ist (MAX_ORDER / APPEND_INC, ca. 262.000 Elemente), wird die Liste neu nummeriert. Weder mit 50.000 noch mit 10.000 Elementen erreicht reines Anhängen die Neunummerierung; der Test prüfte nur die Kosten des Anhängens. Der Verweis des Tests auf #23922 war falsch (das Ticket betrifft die Kafka-Synchronisation).

Einfügen vor bestehenden Elementen

ListStorage.trySetAttributeValue() fügte jedes neue Element, das vor einem bestehenden Element steht, einzeln ein (links.add(destPos, link)). updateIndexOnInsert() gibt dem eingefügten Element einen Sortierwert min(INSERT_INC, Lücke / 2) über dem Vorgänger; folgen mehrere neue Elemente aufeinander, halbiert jedes die verbleibende Lücke. Nach etwa 40 Einfügungen ist die Lücke aufgebraucht und OrderedLinkUtil.updateIndices() nummeriert die gesamte Liste neu – danach beträgt der Abstand wieder höchstens APPEND_INC, so dass sich das wiederholt.

Gemessen (CPU-Zeit eines setList, das k neue Elemente vor k bestehende setzt):

= k = = CPU-Zeit =
2.500 2,2 s
5.000 14,8 s
10.000 82,6 s

Die Laufzeit wächst stärker als quadratisch. Zum Vergleich: 20.000 Elemente anhängen dauert 1,4 s.

Lösung

  • ListStorage fügt jede Folge neuer Elemente vor einem bestehenden Element mit einem einzigen links.addAll(index, folge) ein. updateIndexOnInsert() verteilt die Folge gleichmäßig in der Lücke vor dem bestehenden Element oder nummeriert die Liste – falls die Lücke nicht reicht – einmal für die ganze Folge neu. Neue Elemente am Ende werden ebenfalls gemeinsam angehängt. Das Setzen einer Liste ist damit linear in der Zahl der Elemente: 5.000 Elemente vor 5.000 bestehende einfügen dauert 0,26 s statt 12,7 s CPU-Zeit, 9.000 vor 1.000 dauert 0,3 s statt 5,2 s.
  • StopWatch (com.top_logic.basic) liest die Zeit aus einer austauschbaren Uhr (StopWatch(LongSupplier)). StopWatch.createThreadCpuWatch() / createStartedThreadCpuWatch() messen die CPU-Zeit des aktuellen Threads (ThreadMXBean.getCurrentThreadCpuTime()); Wartezeit auf eine freie CPU zählt damit nicht mit. Unterstützt die JVM keine Thread-CPU-Zeit, misst die Uhr die Wanduhrzeit; isThreadCpuTime() gibt an, welche Uhr verwendet wird.
  • TestListStorage prüft die CPU-Zeit des Test-Threads (Fehlermeldung nennt CPU- und Wanduhrzeit) mit einem Limit von 3 s für vier Szenarien mit 10.000 Elementen statt 50.000:
    • 10.000 Elemente an eine leere Liste anhängen (ca. 0,3 s),
    • 5.000 Elemente vor 5.000 bestehende einfügen (ca. 0,26 s; mit dem früheren Einzel-Einfügen 12,7 s),
    • 9.000 Elemente vor 1.000 bestehende einfügen – die Folge ist größer als die Lücke (APPEND_INC) und erzwingt eine Neunummerierung (ca. 0,3 s; früher 5,2 s),
    • Einfügen an mehreren Stellen einer kleinen Liste mit Prüfung der Reihenfolge. Der Test läuft in ca. 10 s statt 18,5 s.
  • Get Started
  • Github
  • Discord
  • Das Unternehmen hinter TopLogic
  • Softwareentwicklung heute
  • Kontakt

© Copyright – Business Operation Systems GmbH

  • top-logic.com
  • Nutzungsbedingungen
  • Impressum
  • Rechtlicher Hinweis
  • Datenschutz
  • DE
  • Login