CHANGELOG.md 31.2 KB
Newer Older
Jonathan Haas's avatar
Jonathan Haas committed
1 2 3
# Release Notes

## [Noch nicht veröffentlicht]
Jonathan Haas's avatar
Jonathan Haas committed
4

5 6
## [Version 4.3.0]   

Christian Kniss's avatar
Christian Kniss committed
7
- Defekte Containerdateien werden nun beim Wiederherstellungslauf und beim Update der 
Jonathan Haas's avatar
Jonathan Haas committed
8 9 10 11 12 13
  Datenstrukturen auf das neue Format zuverlässiger erkannt. 
  Durch das neue Aufrufargument 
  `-defekteDateienVerschieben=[nein|ja]`
  kann das Archivsystem angewiesen werden, defekte Dateien zu ignorieren und umzubenennen. 
  Damit kann das Archivsystem nun auch gestartet werden, wenn einige Dateien defekt 
  sind, und man muss diese nicht manuell löschen.
Christian Kniss's avatar
Christian Kniss committed
14
 
Jonathan Haas's avatar
Jonathan Haas committed
15 16 17 18 19
  Wird der Parameter nicht angegeben, wird automatisch der Defaultwert "nein" verwendet.
  Wird der Aufrufparamter ohne Wert angegeben (`-defekteDateienVerschieben`) wird der Wert "ja" gesetzt.
 
- Die Korrektur von defekten Containerdateien (Nerz-Ä-79) erkennt nun auch zu kurze 
  Containerdateien ohne oder mit unvollständigem Header und sorgt dafür, dass diese ignoriert werden.
Jonathan Haas's avatar
Jonathan Haas committed
20 21
  
- Die Korrektur von Containerdateien erkennt nun Container mit Datenzeitstempel-Werten von 0 (=1. Jan 1970) nicht mehr als Fehlerhaft, da solche Daten wirklich schon archiviert wurden.
22
   
Jonathan Haas's avatar
Jonathan Haas committed
23
- [Fehler 8](https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/issues/8): Eine Archivinformationsanfrage mit einem Anfragebereich, in dem keine Daten ermittelbar sind, resultierte in einem Ergebnis von Zeitstempel -1 bis -1 (1.1.1970 bis 1.1.1970) und Markierung "Keine Lücke". Dieser Datensatz wird nun nicht mehr gesendet.
Jonathan Haas's avatar
Jonathan Haas committed
24 25
 
- Die minütlichen Debug-Ausgaben über die Queue-Größen und Anzahl empfangener Datensätze werden nun wieder (wie bei Version 3.x) am Anfang jeder Minute publiziert, statt willkürlich ungefähr alle 60 Sekunden. Da viele Verkehrswerte ebenfalls minütlich erzeugt werden, ist dadurch eine bessere Vergleichbarkeit der Werte gegeben.
Jonathan Haas's avatar
Jonathan Haas committed
26 27 28 29 30 31

- Bei der Migration von verkürzten Containerdateien in die neue `_deleted.dat`-Datei (siehe Update-Hinweise zu 4.0.0 Beta) wurde ein Datei-Handle nach Benutzung nicht korrekt geschlossen, was zu "Too many open files"-Fehlern führen konnte. 

- Der Nachfordern-Task blockiert, während er läuft, jetzt keine gleichzeitigen lesenden Zugriffe auf die Containerdateien mehr, sodass sich Archivanfragen und Nachforderungen nicht mehr gegenseitig behindern.

- Tippfehlerkorrektur in Debug-Ausgaben.
Jonathan Haas's avatar
Jonathan Haas committed
32
   
33
## [Version 4.2.0 Beta]   
34 35
   
- Die Performance der Methode `ContainerFileHandle.getCreatePersDir` wurde verbessert, die Performance des Archivierens kann dadurch um ungefähr den Faktor 2 gesteigert werden.
36 37 38

## [Version 4.1.0 Beta]

Jonathan Haas's avatar
Jonathan Haas committed
39 40
### Änderungen

41 42 43 44 45
- Die Klasse `DataIteratorAdapter` wurde eliminiert und die Iteration im ContainerFile in eigene Klassen ausgelagert, wodurch der Code modularer und weniger fehleranfällig ist. Es wird nun ein getrennter Puffer zum Lesen der Header und Daten eines Containers verwendet.

- Eine IllegalArgumentException, die beim Aufruf der ContainerRescue-Applikation mit rekursivem Verzeichnisdurchlauf auftrat, wurde korrigiert. 

- Bei der geschätzten Fortschritts-Ausgabe von verschiedenen Tasks wurden kleinere Grammatikfehler korrigiert und die Ausgabe in bestimmten Fällen klarer gemacht.
46 47 48 49 50

- Die ContainerRescue-Applikation wurde optimiert und unterstützt nun Debug-Aufrufparameter wie `-debugLevelStdErrText=INFO`, womit eine detaillierte Ausgabe erzeugt werden kann.

- Der ContainerDirWalk wurde optimiert.

Jonathan Haas's avatar
Jonathan Haas committed
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
- Das Start des Archiv-Systems wurde optimiert, indem bei der Initialisierung der Indexe der neue Verwaltungsdatenindex benutzt wird, statt alle Containerdateien aufzulisten.

- Das Beenden des Archivs hebt nun die Blockierung von verschiedenen Tasks wegen Überlastung auf, wodurch unnötige Verzögerungen beim Beenden vermieden werden können.

- Die Queue-Größe wird nun auch periodisch ausgegeben, während das Archivsystem beendet wird, um abschätzen zu können, wie lange das Beenden noch dauert.

- NFM-55 Nachtrag: Die Implementierung der Sicherung wurde überarbeitet:

  - Die BackupIndex-Implementierung wurde entfernt und zur Indizierung der zu sichernden Dateien wird nun der Verwaltungsdatenindex benutzt
  
  - Bei der Indizierung der zu sichernden Containerdateien wird nun eine Fortschrittsanzeige über Debug ausgegeben.
  
  - Die Containerdateien im Persistenzverzeichnis werden nun erst auf gesichert gesetzt, wenn das Medium erfolgreich abgeschlossen wurde
  
  - Das Interface für die Backup-Module wurde geändert, um beim Kopieren der Containerdateien auf das Medium automatisch die Medien-ID im gesicherten Container zu vermerken.
    Alte Backup-Implementierungen werden durch eine Kompatibilitätsschicht weiterhin unterstützt, aber ohne optimale Performance. 
    
    Um eine Backup-Implementierung auf die neuen Klassen umzustellen sind zwei Interfaces zu implementieren:

    `BackupModule` muss implementiert werden und wird wie das bisherige `BackupModul` (ohne e am Ende) in der Properties-Datei angegeben. Diese Klasse enthält eine Factory-Methode um einer Instanz der `BackupImplementation` zu erzeugen:
    
    Das Interface `BackupImplementation` entspricht von den enthaltenen Methoden größtenteils dem bisherigen `BackupModul`-Interface, es gibt aber folgende Änderungen:
    
     *  Die Methode `backupContainer` erhält jetzt statt der Container-ID und dem Dateinamen einen Parameter der Klasse `Container`, mit dem Informationen über den Container (und ein InputStream für die Datei-Inhalte) abgerufen werden können. Sie gibt außerdem einen boolean zurück, der bei der Rückgabe von false signalisiert, dass der Container nicht mehr auf das aktuelle Medium gepasst hat.
     
     *  Die Methode `hasMediumCapacity` wird aufgrund dieses Rückgabewerts nicht mehr benötigt und entfällt.
     
     *  Die Methode `getAllContFileNames` verliert den letzten Parameter `maxLimit`, da dieser nicht benötigt wird.

## [Version 4.0.0 Beta]

### Update-Hinweise

Dieses Update ändert die Art, wie gelöschte Container im Dateisystem gespeichert werden. Sobald das Archivsystem auf diese Version oder eine höhere aktualisiert wurde, ist es nicht mehr möglich, eine frühere Version zu installieren und mit dieser gelöschte Daten wiederherzustellen oder anders auf diese zuzugreifen.

Da neue Index-Dateien angelegt werden, kann es beim ersten Start nach dem Update oder beim ersten Reparatur-Wiederherstellungslauf im Persistenzverzeichnis nach dem Update zu einer Performance-Verringerung gegenüber
dem normalen Betrieb kommen.

### Änderungen

Jonathan Haas's avatar
Jonathan Haas committed
91
- Nerz-Ä-9: Der Zeitstempel des Ende-Archiv-Datensatzes ergibt sich nun nicht mehr aus dem Zeitstempel des letzten Datensatzes sondern ergibt sich nun aus dem Zeitstempel des folgenden Datensatzes (d. h. dem Gültigkeitsende des letzten Datensatzes) oder dem Ende des Anfrageintervalls, je nachdem was vorher ist. Der Ende-Archiv-Datensatz gibt damit an, wie lange ein Datensatz innerhalb des Anfrageintervalls noch gültig ist.
Jonathan Haas's avatar
Jonathan Haas committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

- Nerz-Ä-72 / Nerz-Ä-73: Das Archivsystem speichert alle relevanten Container-Verwaltungsinformationen (Container-Header) nun in einem eigenen Index ab, damit bei vielen Operationen
  wie Archivanfragen, Löschen, Nachfordern usw. nicht mehr alle Containerdateien einzeln geöffnet und analysiert werden müssen. Hierdurch wird die Performance wesentlich gesteigert,
  da wesentlich weniger Dateioperationen erforderlich sind. Vor allem der Lösch-Task kann nun ohne großen Aufwand ermitteln, welche Container zu löschen sind und wird dadurch wesentlich
  beschleunigt.
  
  Außerdem werden die Container-Dateien beim Löschen nun komplett gelöscht, statt die Datei nur auf die Container-Header zu verkürzen.
  
  Pro Containerverzeichnis gibt es nun folgende neue Dateien:
  
  - `_cthead.idx`: Enthält alle relevanten Container-Verwaltungsinformationen der Container in diesem Verzeichnis um den Zugriff wesentlich zu beschleunigen. Diese Datei wird (falls
    sie nicht vorhanden ist) automatisch beim ersten Zugriff aus den Containerdateien (und der `_deleted.dat`) in dem Verzeichnis neu gebildet.
  
  - `_deleted.dat`: Enthält alle weiteren Informationen, die für gelöschte Container relevant sind. Diese Datei ersetzt alle verkürzten Container-Dateien im Verzeichnis und
    wird beim ersten Zugriff automatisch aus diesen generiert. Außerdem enthält sie die bisher in den gelöschten Containern gespeicherten Datenindexbereiche, die beim Nachfordern ignoriert werden.
    Diese Datei darf (wie die verkürzten Container) nicht gelöscht werden, sonst gibt es möglicherweise Datenverlust beim Wiederherstellen und Probleme beim Nachfordern.
    
  - `_deleted.tmp`, `_deleted.backup`: Temporäre Kopien der `_deleted.dat`, mit denen sichergestellt wird, dass die Datei immer konsistent bleibt.
  
Jonathan Haas's avatar
Jonathan Haas committed
111
  Alle Tasks, die Container-Header lesen, wurden nun auf die Benutzung des Verwaltungsdatenindex umgestellt, außer der Task muss sowieso die gesamte Containerdatei lesen oder der Index ist nicht verfügbar.
Jonathan Haas's avatar
Jonathan Haas committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
  
  Alle Tasks, die Containerdaten lesen (im wesentlichen Archivanfragen und Informationsanfragen, aber auch Löschen und Nachfordern) wurden so geändert, dass das neue Format der gelöschten Daten
  berücksichtigt wird. Hierzu wurden die verschiedenen `ContainerWalk`-Methoden komplett überarbeitet und im wesentlichen durch eine einzelne Implementierung ersetzt, sodass doppelter Code reduziert wird.
  Dies entspricht einer Fortführung der Korrekturen zu Nerz-F-150, sodass Archivanfragen und Archivinformationsanfragen nun in wesentlichen Teilen den selben Code verwenden und daher nun auch
  übereinstimmende Ergebnisse liefern.
  
- Durch diese Änderungen wurden Einschränkungen bei der Verwendung von Relativanfragen eliminiert, d. h. diese sind nun z. B. auch auf Archivinformationsanfragen anwendbar. Ebenfalls sollte die Performance von Relativanfragen durch die Verwendung des Verwaltungsinformationen-Index nun wesentlich beschleunigt worden sein.   
  
- Nerz-Ä-76: Das Archivsystem besitzt nun die Möglichkeit, Archivdaten endgültig und inklusive Metadaten zu löschen. Endgültig gelöschte Daten sind nicht mehr von Sicherungsmedien wiederherstellbar und verbrauchen keinerlei Platz im Archivsystem.
  Die Parametrierung erfolgt über die Attributgruppe atg.archivDatenEndgültigLöschen am Archiv/AOE-Objekt. 
  
- Nerz-Ä-78: Die potentiellen Datenlücken, die vor dem ersten archivierten Datensatz nach einem Neustart angelegt werden, erhalten jetzt 
  als Datenzeitstempel nicht mehr den Zeitstempel des vorherigen Datensatzes sondern den letzten Zeitpunkt, den das Archivsystem den letzten Datensatz (vor dem Beenden) noch empfangen hatte.
  
  Hierzu werden die Zeitstempel in der neuen Datei `_restartTime.property` im Wurzelverzeichnis des Archivsystem gespeichert. Fehlt diese Datei (z. B. direkt nach dem Update) wird wie bisher das alte Verhalten benutzt.
  
- Nerz-Ä-79: Das Archivsystem prüft nun vor dem ersten schreibenden Zugriff (d. h. vor dem ersten Anhängen von Archivdaten an einen vorhandenen offenen Container), ob dieser mit den 3 Bytes "`##\n`"
  endet. Ist das nicht der Fall, dann wird die Containerdatei als defekt erkannt und eine Reparatur gestartet, d. h. alle Datensätze werden gelesen und alle überflüssigen Bytes nach dem letzten gültigen Datensatz werden verworfen.
  
  Ist durch das Verwerfen von defekten Daten eine Datenlücke entstanden wird hier (wie sonst auch) ein leerer Datensatz mit Markierung "potentielle Datenlücke" eingefügt. Ebenfalls werden die Indexdateien
  aktualisiert, damit die Informationen konsistent bleiben.   
  
- Der Arbeitsspeicher-Verbrauch der Klasse `DataIdentNode`, die je Datenidentifikationen die Indexe bereitstellt und weitere Informationen zwischenspeichert, wurde optimiert.

- Beim Schreiben des Caches beim Beenden wird nun jede Minute ein Fortschritt über die Debug-Ausgabe ausgegeben.

- Beim Beenden aufgrund eines schweren Fehlers (z. B. zu wenig freier Arbeitsspeicher) beendet sich das Archivsystem nun so schnell wie möglich. Nicht unbedingt notwendige langwierige Aufräumarbeiten wie das Leeren der Queues werden übersprungen, damit in jedem Fall zeitnah wichtige Aufräumarbeiten wie das Schreiben der Indexdateien durchgeführt werden können.

- Es können nun mit dem Aufrufparameter "-lzvThreads=<Anzahl>" eine Anzahl Threads für das Löschen und Löschzeitverlängern angegeben werden. Durch eine Erhöhung vom Standardwert 1 kann das Löschen (ggf. unter Erhöhung der Gesamtlast) beschleunigt werden.

- Die Performance des Wiederherstellungslaufs nach einem nicht ordnungsgemäßen Beenden wurde verbessert.

- Weitere Verbesserungen bei der Performance beim Löschen.

- Das Archiv gibt nun beim Wiederherstellungslauf und bei verschiedenen Löschoperationen einen detaillierten Fortschritt und eine Prognose über die verbleibende Zeit über die Debug-Ausgabe aus. 

### Bugfixes

- Nerz-F-55: Wenn das Abschließen eines Sicherungsmediums fehlschlägt wurden nur die Container als ungesichert markiert, die auf diesem Medium gesichert wurden wären. Container, die auf weiteren Medien gesichert worden wären, wurden nicht korrekt im Backup-Index aktualisiert.

- Nerz-F-168, Nerz-F-253: In den Implementierungen der Indexe gab es mehrere nicht betrachtete Randfälle und fehleranfällige Code-Stellen bei der binären Suche, die unter bestimmten 
  Bedingungen zu scheinbar zufälligen `ArrayIndexOutOfBoundsException`s und anderen Fehlern führen konnten. Die Implementierungen der Indexe verwenden nun die gemeinsame Basisklasse `AbstractIndex`, wurden grundlegend überarbeitet und durch neue Caching-Mechanismen optimiert.
  
  Insbesondere wurden folgende Probleme korrigiert:
  
  - Die Methode ATimeMonotoneIndex.binaryMemSearch() konnte in mehreren Situationen den Wert -1 zurückliefern. Unter Umständen wurde darauf nicht korrekt reagiert, was zu Exceptions führte, die mangels korrekter Behandlung dazu führten, dass der Index in einen undefinierten, fehlerhaften Zustand wechselte.
  
  - Die Methode DataIdentNode.getOpenContID() lieferte in manchen Situationen, z. B. nach dem Unterdrücken eines übergroßen Datensatzes oder nach einer Parameteränderung fehlerhafterweise den zuletzt geschlossenen Container als offenen Container zurück, was dazu führte, dass der Container ein zweites Mal abgeschlossen werden konnte, was zu doppelten Indexeinträgen führen konnte.
  
  - Ein Fehler in der Methode DataIndexIndex.getContainerID() konnte bei Archivanfragen falsche Ergebnisse liefern und dazu führen, dass falsche Daten nachgefordert werden, insbesondere auch solche, die bereits im Archiv enthalten sind.
  
  - Verschiedene weitere Inkonsistenzen in den Klassen DataTimeIndex und DataIndexIndex, die u. a. bei Datenindexrücksprüngen unter bestimmten Umständen zu fehlerhaften Indexeinträgen führen können. 
  
- Nerz-F-230: Das Archivsystem führt keine überflüssigen Archivanfragen mehr durch, wenn das Archiv, von dem nachgefordert werden soll, nicht erreichbar ist.
  Das Archivsystem führt beim Nachfordern intern eine Archivanfrage bei sich selbst durch um festzustellen, wo Datenlücken vorliegen. Dies wurde auch dann gemacht, wenn keines der Archive, von denen nachgefordert werden soll,
  erreichbar ist und konnte dann bei entsprechend umfangreicher Parametrierung zu hoher Last führen, insbesondere weil der Vorgang nicht durch die Übertragung von Daten und die Anfrage beim anderen Archiv ausgebremst wird.
  
  Das Archivsystem überspringt nun automatisch die Nachforderung, wenn keines der parametrierten bzw. in der Nachforderungsanfrage spezifizierten Archivsysteme erreichbar ist. Ebenfalls wird die Eintragung der Information in die Lückendatei, dass
  das andere Archivsystem die Daten nicht gespeichert hat, nur noch dann vorgenommen, wenn das andere Archivsystem wirklich erreichbar war. Dadurch wird bei der automatischen Nachforderung die Nachforderung dann nachgeholt, wenn
  das andere Archiv wieder online ist. Bisher wurde in so einem Fall angenommen, dass die Daten dort generell nicht verfügbar sind.

- Beim Mischen von Online-Daten und nachgelieferten Daten in Archivanfragen werden gemäß den Technischen Anforderungen nachgelieferte Datensätze nur noch zur Bestimmung des Anfangszustands eliminiert, d. h.
  falls diese vor dem Anfragezeitraum liegen. In bisherigen Versionen wurden unnötigerweise alle nachgelieferten Daten vor dem ersten aktuellen Datensatz eliminiert, selbst
  wenn diese im Anfragebereich lagen. Die Software kann daher jetzt nachgelieferte Datensätze als initiale Datensätze verschicken, sofern das nicht der geforderten Sortierung der Daten
  widersprechen würde.

## [Version 3.10.0 Beta 2]

### Änderungen

- Die neue Version des Archivsystems benötigt als zusätzliche Abhängigkeit die Kernsoftware in Mindestversion 3.9.6. Die Archiv-Fehler Nerz-F-44 und Nerz-F-141 wurden in dieser Kernsoftwareversion korrigiert.

- Nerz-Ä-8: Die Anzahl der gleichzeitig geöffneten Container-Dateien beim Lesen von Archivdaten wird auf standardmäßig 500 begrenzt 
  um Limits des Betriebssystems zu umgehen. Hierzu wurde eine Zugriffsschicht implementiert, die beim Überschreiten des Grenzwertes die 
  älteste geöffnete Containerdatei schließt.
  Bei Bedarf lässt sich mit den neuen Aufrufargument `-maxOffeneDateien=500` ein anderer Grenzwert vorgeben.

- Nerz-Ä-10: Das Archivsystem veröffentlicht jetzt den verfügbaren Speicherplatz im Persistenzverzeichnis am Archiv-Objekt unter der Attributgruppe `atg.archivSpeicherplatz`. 

- Nerz-F-49: Beendet sich das Archivsystem aufgrund eines Fehlers, wird nun über die Debug-Ausgabe ein Thread-Dump ausgegeben, um Fehler besser diagnostizieren zu können.
  
- Nerz-F-55: Die Implementierung des Backup-Indexes wurde angepasst, sodass das Einfügen von doppelten Container-IDs im Code mit einer Fehlermeldung verhindert wird.
  
- Nerz-F-91: Folgende zusätzliche Hintergrund-Tasks werden beim Beenden des Archivsystems nun zeitnah beendet (ohne Datenverlust):

  - Sichern
  - Archivanfragen
  - Archiv-Informations-Anfragen
  
  Beim Sichern wird das aktuelle Medium mit den ggf. bereits gesicherten Daten abgeschlossen, weitere zu sichernde Daten werden dann erst 
  beim nächsten Sicherungslauf gesichert. Die Archivanfragen werden abgebrochen, sodass der Anwender beim Abruf eine entsprechende Fehlermeldung erhält.
  
- Nerz-Ä-66: Die Anzahl der Threads zur Archivierung für Online-Datensätze kann nun mit dem Aufrufargument `-archivierungsThreads=` angegeben werden.
  Der Standardwert wurde von 61 auf 11 geändert. Die Anzahl Threads zur Archivierung von nachgeforderten Datensätzen lässt sich mit 
  `-nachforderungsThreads=` beeinflussen. Der Standardwert hierfür ist jetzt 3 statt vorher 8.
  
  Zusätzlich kann nun die von allen Threads geteilte Puffergröße durch ein Aufrufargument angepasst werden. Frühere Archivsystem-Versionen besaßen 
  eine feste Gesamtgröße von 183.000 für Onlinedaten und eine Gesamtgröße von 16.000 für nachgeforderte Daten.
  Die Puffergröße kann nun durch die folgenden Aufrufargumente angepasst werden (mit neuen Standardwerten):
  
    -archivierungsPuffer=200000
    -nachforderungsPuffer=20000
    
  Mit einer größeren Puffergröße kann (zusammen mit den Änderungen aus Nerz-Ä-75) das Terminieren der Verbindung wegen zu geringem Durchsatz
  während Lastspitzen vermieden werden.

- Nerz-Ä-68: Das Schreiben der Indexdateien beim Beenden erfolgt nun in mehreren Threads gleichzeitig. Die Threadanzahl entspricht standardmäßig 
  der Anzahl Threads für die Online-Archivierung (Aufrufargument `-archivierungsThreads=11` aus Nerz-Ä-66), kann jedoch mit dem Aufrufargument 
  `-indexUpdateThreads=` überschrieben werden. Es erfolgt nun alle 10 Sekunden eine Debug-Ausgabe über den Fortschritt.

- Nerz-Ä-69: Die manuelle Konsistenzprüfung erfolgt nun in mehreren Threads gleichzeitig. Die Threadanzahl beträgt standardmäßig der Anzahl 
  Threads für die Online-Archivierung (Aufrufargument `-archivierungsThreads=11` aus Nerz-Ä-66), kann jedoch mit dem Aufrufargument 
  `-pruefThreads=` überschrieben werden. Es erfolgt nun alle 10 Sekunden eine Debug-Ausgabe über den Fortschritt.

- Nerz-Ä-70: Das Sichern von Containern wurde durch Verwendung eines `BufferedInputStream`s und einer größeren Puffergröße von 8 kB optimiert.

- Nerz-Ä-75: Die Anmeldungen von Daten nach dem Start des Archivsystems oder bei einer Parameteränderung werden nun automatisch gedrosselt, 
  um eine Überlastung des Systems zu vermeiden. Hierzu wurde ein Sliding-Window-Mechanismus implementiert, der die Anzahl noch nicht quittierter
  Anmeldungen beschränkt und weitere Anmeldungen erst dann zulässt, wenn schon durchgeführte Anmeldungen (durch den initialen Datensatz) quittiert werden.

  Bei Bedarf lässt sich der Mechanismus über folgende neue Aufrufparameter (Standardwerte sind angegeben) einstellen:
  
    -maxAnmeldungenGleichzeitig=1000
    -minAnmeldungenProSekunde=1
    -maxAnmeldungenProSekunde=<Unendlich>
    
  `maxAnmeldungenGleichzeitig` definiert die Größe des Sliding-Windows, also die maximale Anzahl gleichzeitig unbestätigter Anmeldungen. 
  Mit zum Beispiel `-maxAnmeldungenGleichzeitig=1` würde das Archivsystem immer nur eine Anmeldung gleichzeitig durchführen und dann warten
  bis diese bestätigt wurde, bevor die nächste Anmeldung durchgeführt wird. 
  
  Mit `minAnmeldungenProSekunde` lässt sich der Sliding-Window-Mechanismus beschleunigen, beispielsweise würde  `-minAnmeldungenProSekunde=2000` dafür sorgen,
Jonathan Haas's avatar
Jonathan Haas committed
243
  dass pro Sekunde 2000 Anmeldungen durchgeführt werden, selbst wenn es mehr als `maxAnmeldungenGleichzeitig` unbestätigte Anmeldungen gibt und
Jonathan Haas's avatar
Jonathan Haas committed
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
  die Anmeldung dadurch verzögert worden wäre.
  
  Mit `maxAnmeldungenProSekunde` lassen sich die Anmeldungen unabhängig vom Sliding-Window-Mechanismus verzögern. Beispielsweise würden mit 
  `-maxAnmeldungenProSekunde=10` maximal 10 Anmeldungen in der Sekunde durchgeführt werden, unabhängig von allen anderen Faktoren. Diese 
  Funktion ist dadurch implementiert, dass das Archivsystem zwischen den Anmeldungen eine definierte Zeit wartet.
  Die hierzu verwendete Funktion der virtuellen Maschine besitzt nur eine eingeschränkte Genauigkeit, die auch stark vom verwendeten Betriebssystem abhängt,
  wodurch unter Umständen eine weitere unbeabsichtigte Verzögerung der Anmeldungen entstehen kann, das Setzen von `-maxAnmeldungenProSekunde=100000`
  oder einem ähnlich hohen Wert führt daher wahrscheinlich zu einer unerwartet hohen Verzögerung und ist nicht empfehlenswert.
  Falls es Überlastungsprobleme gibt, ist in der Regel das Reduzieren von `maxAnmeldungenGleichzeitig` ausreichend, die anderen Parameter sollten daher nur
  in Ausnahmefällen benutzt werden.
  
- Nerz-Ä-79 (teilweise): Das ContainerRescue-Programm erkennt jetzt unvollständig geschriebene (in der Regel noch nicht abgeschlossene) Containerdateien und
  kann überflüssige Bytes am Ende sowie unvollständige Datensätze erkennen und entfernen.
  
### Bugfixes

Folgende Probleme vorhergehender Versionen wurden behoben:

- Nerz-F-2: Falls ein Container nicht gesichert werden konnte, weil die Datei nicht vorhanden ist, wird nun eine klare Fehlermeldung erzeugt und der Container
  zukünftig ignoriert (aus dem Index entfernt). In vorherigen Versionen kam es bei jedem Backup zu Fehlermeldungen, da der gelöschte Container im Index blieb. 

- Nerz-F-4: Ein Problem, bei dem während des spontanen Löschens im Lösch-Level 2 alle abgeschlossenen Container gelöscht wurden, wurde korrigiert.
  In vorigen Versionen wurden wegen fehlender `break;`-Statements in einem `switch`-Block schon in Lösch-Level 2 die Lösch-Verfahren aus Level 3 und 4 angewendet.
  Außerdem wurden im Lösch-Level 4 wegen eines fehlerhaften String-Vergleichs alle abgeschlossenen Container gelöscht, nicht wie spezifiziert alle bereits gesicherten.  

- Nerz-F-36: Die Queue-Füllstände für nachgeforderte Datensätze werden in den periodischen Debug-Ausgaben nun getrennt von den Online-Daten 
  aufgeführt und auch im Code besser voneinander unterschieden.
  
  Das Nachfordern von Daten führte wegen Fehlern bei der Verwendung von globalen Statistik-Variablen zu negativen Angaben der Queue-Größe in den Debug-Meldungen.

- Nerz-F-37 / Nerz-F-164: Das Archivsystem erstellt keine überflüssigen temporären Container-Dateien mehr, wenn Daten wiederhergestellt werden sollen. In alten Versionen
  konnte es zu Problemen kommen, wenn der Speicherort nicht beschreibbar war oder wenig freier Festplattenplatz zur Verfügung stand.

- Nerz-F-38: Das manuelle Löschen über die DAF-API-Funktionen war fehlerhaft implementiert. Das sofortige Löschen (deleteImmediately==true) bewirkte intern ein Anstoß der
  spontanen Löschfunktion, die bei ausreichend verfügbarem Speicherplatz keine Daten löscht. Das verzögerte Löschen (deleteImmediately==false) bewirkte stattdessen einen
  sofortigen Anstoß der regulären periodischen Löschfunktion, die in der Regel ebenfalls nichts gelöscht hat, da sie den Löschschutz betrachtet. 

- Nerz-F-90 / Nerz-F-193 / Nerz-F-205: Es ist nicht mehr möglich, das Archivsystem mehrfach zu beenden. Hierzu wurde die Synchronisierung beim Beenden überarbeitet.

- Nerz-F-101 / Nerz-F-188 / Nerz-F-189 / Nerz-F-203: Tasks, die vorzeitig terminiert wurden, führen nicht mehr zu einem Blockieren beim Beenden. Der Code wurde korrigiert, indem die 
  nicht korrekt implementierte Semaphore durch eine einfache Abfrage der Thread-Zustände ersetzt wurde.

  Zusätzlich wurde der Mechanismus zum Starten und Beenden der Tasks komplett überarbeitet. Es kann nun nicht mehr passieren, dass sich ein Task wegen einer
  unbehandelten Exception oder wegen eines Interrupts ohne Rückmeldung terminiert. Ein Fehler in einem Task führt bei einem schweren Fehler nun zum kontrollierten Beenden
  des Archivsystems. Andere Fehler führen zu einer Debug-Ausgabe und lassen den Task weiterlaufen.
  
  Es wurde ein UncaughtExceptionHandler implementiert, der auch außerhalb von Tasks dafür sorgt, dass unbehandelte schwerwiegende Fehler (z. B. `OutOfMemoryError`s) 
  zu einem sofortigen Beenden des Archivsystems führen. Andere unbehandelte Fehler führen zu einer Debug-Warnung.
  
- Nerz-F-150: Die Ergebnisse von Archiv-Informations-Anfragen wurden grundsätzlich überarbeitet, insbesondere wurden folgende Fehler korrigiert:

  - Es wurden immer Ergebnisse für alle Datenarten zurückgeliefert, unabhängig von den angefragten Datenarten
  
  - Es konnte zu Performanceproblemen kommen, wenn nicht alle Datenarten angefragt wurden.
  
  - Das Behandeln von Datenlücken und das Mischen der einzelnen Datenidentifikationen wurde überarbeitet und verhält sich jetzt analog zu den Archivanfragen.
  
  - Nachgelieferte Daten werden nun (bei entsprechender Anfrage) korrekt einsortiert und führen nicht mehr zu erkannten Datenlücken.
  
  - Das Archivierungs-Bit in den Datenindizes wurde bei Datenlücken nicht immer korrekt gesetzt.
  
- Nerz-F-156: Bei der Wiederherstellung von Containern wurde der Sekunden-Wert der Löschschutzverlängerung fälschlicherweise als Millisekunden interpretiert, wodurch der
  Löschschutz-Zeitraum von wiederhergestellten Containern um den Faktor 1000 zu klein war. Hierdurch wurden beim regulären Löschen häufig wiederhergestellte Container
  gelöscht, die laut Parametrierung eigentlich einen Löschschutz haben müssten.
  
  Bei Archivanfragen  und  Archiv-Info-Anfragen war außerdem der Standardwert der maximalen Löschschutzverlängerung in der Klasse `QueryTask` in Millisekunden 
  definiert, er wird aber aber als Sekundenwert interpretiert. Der um den Faktor 1000 zu hohe Wert führte dabei zu einem Überlauf bei der Verarbeitung als 32-bit-Wert. 

- Nerz-F-197: Das Archivsystem kann sich jetzt auch dann aus einer Überlastsituation befreien, bei der Archivanfragen angehalten wurden, wenn keine neuen Datensätze
  eintreffen. In älteren Versionen wurde die Prüfung, ob die Überlastsituation vorbei ist und die Bearbeitung der Anfragen fortgesetzt werden soll, nur beim Eintreffen
  eines neuen, nicht ignorierten, Archiv-Datensatzes vorgenommen. 

- Nerz-F-209: Die Applikations-Fertigmeldung des Archivsystems wird jetzt erst versendet, wenn zum ersten mal alle zu archivierenden Daten angemeldet wurden. Vorher
  wurde sie direkt beim Programmstart versendet. Archivanfragen können erst dann durchgeführt werden, wenn alle Daten angemeldet sind.

- Der Wiederherstellungsauftrag hat die vom Anwender übergebenen Minimum- und Maximum-Werte zur Angabe des Zeitbereichs immer als Archivzeitstempel interpretiert, auch
  wenn vom Anwender Datenindex- oder Datenzeitwerte übergeben wurden. Unter Umständen wurden dadurch nicht die gewünschten Container wiederhergestellt. 

- Das Archivsystem hat Archivanfragen sofort verworfen, wenn eine negative Sendesteuerung vor dem Senden der Antwort registriert wurde. Das konnte dazu führen, dass
  Archivanfragen nicht beantwortet wurden und Aufrufe der Methode ArchiveQueryResult.isRequestSuccessful() blockierten. Da die Sendesteuerung insbesondere bei der Kopplung von Datenverteilern verzögert eintreffen kann, wird
  nun auf die Sendesteuerung mit einem Timeout gewartet. Sollte eine bereits positiv quittierte Übertragung unterbrochen werden (durch eine negative Quittung), wird
  wie bisher die Übertragung der Antwort sofort abgebrochen.

- Beim Wiederherstellungslauf nach einem Archivsystemabsturz konnte es aufgrund eines ungünstig programmierten rekursiven Algorithmus zu einer StackOverflowException
  kommen, wenn im Persistenzverzeichnis viele Ordner ohne Archivdatenart-Unterordner ("oa", "on", "na", "nn") existieren. Eine solche Ordnerstruktur kann beispielsweise
  entstehen, wenn Daten nachgefordert werden sollen, die in beiden beteiligten Systemen noch nie archiviert wurden. Der Algorithmus in der Klasse ContainerFileDirIterator
  wurde in einen iterativen Algorithmus umgewandelt, wodurch der Fehler trotz ungünstiger Ordnerstruktur nicht mehr auftreten kann. Die betroffene Klasse wurde ebenfalls
  beim Backup, Löschen, Löschzeitverlängern, Archivdaten aus einer Sicherung Wiederherstellen und bei der Konsistenzprüfung verwendet, sodass es dort möglicherweise zu
  ähnlichen Exceptions kommen konnte.

334
## Version 3.9.0
Jonathan Haas's avatar
Jonathan Haas committed
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359

### Neue Features

Folgende Erweiterungen gegenüber vorhergehenden Versionen wurden durchgeführt:

- Nerz-Ä-12: Begrenzung der Anzahl parallel zu verarbeitenden Archivanfragen seitens einer einzelnen Applikation.
  - Im Archivsystem kann die maximale Anzahl von gleichzeitig für eine Applikation
    bearbeiteten Archivanfragen über den Aufrufparameter `-maxAnfragenProApplikation`
    eingestellt werden. Defaultwert ist 5.
  - Über eine entsprechende Archivanfrage kann der aktuell eingestellte Wert zur
    Laufzeit seitens einer Applikation abfragt werden.

### Änderungen

Folgende Änderungen zu vorhergehenden Versionen wurden durchgeführt:

- Nerz-Ä-16: Performance-Verbesserungen bei der Verwendung von ByteArrays in den Datenverteiler-Applikationsfunktionen.
  Verwendung der neuen Methoden des Data-Interface zum Setzen von `byte[]`, `short[]`, `int[]` etc.

### Bugfixes

Folgende Probleme vorhergehender Versionen wurden behoben:

- Bei Archivanfragen mit relative Zeitangaben konnte es unter bestimmten Umständen passieren, dass das Archivsystem
  in einer Endlosschleife  hängen blieb.
360 361


362
[Noch nicht veröffentlicht]: https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/compare/v4.3.0...HEAD
Christian Kniss's avatar
Christian Kniss committed
363 364 365 366
[Version 4.3.0]: https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/compare/v4.2.0-BETA...v4.3.0
[Version 4.2.0 Beta]: https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/compare/v4.1.0-BETA...v4.2.0-BETA
[Version 4.1.0 Beta]: https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/compare/v4.0.0-BETA...v4.1.0-BETA
[Version 4.0.0 Beta]: https://gitlab.nerz-ev.de/ERZ/SWE_de.bsvrz.ars.ars/compare/v3.9.0...v4.0.0-BETA