public class ContainerFile
extends java.lang.Object
Diese Klasse enthaelt die Funktionalitaet zum Erzeugen, Lesen, Schreiben und Loeschen von Container-Dateien. Jeder Task, der mit Container-Dateien arbeitet, enthaelt ein Objekt dieser Klasse. Die Sichtbarkeit von Konstruktor und Methoden ist beschraenkt, da diese Klasse nur durch den PersistenceManager
im gleichen Package benutzt wird. Dieser haelt für jede anfragende RepeatingTask
ein Objekt dieser Klasse und leitet Anfragen bzgl. Container-Dateien an dieses ContainerFile
-Objekt weiter.
Modifier and Type | Class and Description |
---|---|
private class |
ContainerFile.MyCloseableRandomAccessFile |
Modifier and Type | Field and Description |
---|---|
private CacheManager.Cache |
_cache |
private CacheManager |
_cacheManager |
private static Debug |
_debug |
private static java.util.concurrent.atomic.AtomicInteger |
_numOpenFiles |
private static java.lang.ThreadLocal<java.util.LinkedHashSet<ContainerFile.MyCloseableRandomAccessFile>> |
_openFilesInCurrentThread |
private boolean |
accessed
Container adressiert.
|
private byte[] |
actualWriteBuf
Referenz auf den tatsaechlichen, von
ContainerFile#serializeData(ResultData,long) verwendeten Puffer, der von writeBuf abweicht, falls dieser zu klein ist). |
private long |
aspId
Aktuelle Aspekt-ID.
|
private long |
atgId
Aktuelle Attributgruppen-ID.
|
private java.io.ByteArrayOutputStream |
bos
Puffer für den Serialisierer und zum Lesen eines Datensatzes.
|
private static int |
BUFFER_SIZE
Größe der Daten-Puffer in Byte.
|
private byte[] |
byte8Buf
Puffer zum Einlesen von Laengenbytes etc.
|
private static int |
COMPRESS_LEN
Laenge des Compress-Info-Feldes.
|
static java.io.FilenameFilter |
CONT_FILENAME_FILTER
Filter zur Erkennung von Containerdateien anhand des Dateinamens.
|
(package private) static java.util.regex.Pattern |
CONT_FILENAME_PAT
Regulaerer Ausdruck zur Erkennung von Containerdateinamen.
|
(package private) static java.lang.String |
CONT_FILENAME_PREFIX
Praefix eines Containerdateinamens.
|
(package private) static java.lang.String |
CONT_FILENAME_SUFFIX
Dateiendung eines Containerdateinamens.
|
private ContainerHdr |
containerHdr
Container-Header Parameter als Key/Value-Paare.
|
private long |
containerId
Aktuelle Container-ID.
|
private java.io.File |
contFile
Aktuelle Container-Datei.
|
private static int |
DATAHDR_LEN
Laenge des Headers eines jeden Datensatzes.
|
private ContainerDataIterator |
dataIter
Iterator für das Durchlaufen angefragter Datensätze aus einem Container.
|
private ArchiveDataKind |
dataKind
Aktuelle Datensatzart.
|
private static int |
DATALEN_LEN
Laenge des Laengenbytes vor jedem Datensatz (4 Bytes, Integer).
|
private static boolean |
DEBUG_CALLS |
static boolean |
DECOMPRESS_QUERY_RESULTS
Falls wahr, werden Archivanfragen komprimiert beantwortet (ist langsam, weil das Stream-Interface der Kernsoftware langsam ist)
|
private boolean |
deletedHeaderFlag
Gibt an, ob im aktuellen Container das “deleted”-Flag gesetzt ist
|
private boolean |
deletedSpecialTreatment
Gibt an, ob ausgelagerte Container beim Nachfordern so behandelt werden, dass ein Iterator normal darüber iterieren kann
|
private static int |
HEADER_LENGTH |
private boolean |
headerRead
Container-Header eingelesen.
|
(package private) byte[] |
indexListSep
Gibt den Seperator an, der für den Datenindexlistenaufbau beim Löschen eines Containers verwendet wird
|
private static boolean |
IS_PERFORMANCE_TEST
Gibt an, ob gerade ein Performance-Test mit Dummy-Daten (um den Overhead durch Deserialisieren/Serialisieren zu vermeiden) laeuft.
|
private int |
iterBufPos
Position innerhalb des Puffers im Speicher.
|
private int |
iterBytesRead
Zahl der beim letzten iterLoadDataChunk() gelesenen Bytes.
|
private boolean |
iterDataRead
Marker, ob nach jedem iterReadNextData() genau einmal iterGetDataElem() aufgerufen wurde (sonst stimmt die readPos nicht)
|
private boolean |
iterEOC
Wahr, wenn das Ende eines Containers erreicht ist
|
private boolean |
iterIsHdrIterator
Wahr, falls der Iterator nur ueber Min- und Maxwert aus dem Container-Header iteriert.
|
private java.util.ArrayList<java.lang.Long> |
iterlistOfDataIdx
Für gelöschte Container beim Nachfordern:
Liste der Datenindizes im Container |
private int |
iterlistOfDataIdxPos
Für gelöschte Container beim Nachfordern:
aktuelle Position in der Liste der Datenindizes |
private int |
iterNextDataLen
Laenge des naechsten Datensatzes (wird in iterReadNextData() besetzt)
|
private ContainerFile.MyCloseableRandomAccessFile |
iterRaf
Container-Datei.
|
private int |
iterUncompressedLen
Unkomprimierte Laenge des Datensatzes (oder 0 falls dieser nicht komprimiert ist).
|
static int |
MAX_UNCOMPRESSED
Datensätze bis zu dieser Laenge bleiben immer unkomprimiert.
|
private static byte[] |
NO_DATA
Datensatzbytes, falls “keine Daten” signalisiert wurde
|
private static byte[] |
NO_RIGHTS
Datensatzbytes, falls “keine Rechte” signalisiert wurde
|
private static byte[] |
NO_SOURCE
Datensatzbytes, falls “keine Quelle” signalisiert wurde
|
static int |
NOT_COMPRESSED
Wert des Compress-Info-Feldes, wenn DS nicht komprimiert ist
|
private long |
objId
Aktuelle Objekt-ID.
|
private static int |
OPEN_FILE_LIMIT |
private static byte[] |
PERF_TESTDATA
Dummy-Daten für den Performance-Test.
|
private static byte[] |
POT_GAP
Datensatzbytes um eine potentielle Datenluecke zu kennzeichnen
|
private byte[] |
readBuf
Puffer zum Ein-/Auslesen des Container-Headers und anderer Daten.
|
private boolean |
readOnly
Container read-only adressiert.
|
private Serializer |
serializer
Datensatz-Serialisierer.
|
private int |
sv
Aktuelle Simulationsvariante.
|
private int |
totalWriteDataSize
Laenge des von
ContainerFile#serializeData(ResultData,long) serialisierten Datensatzes. |
private static byte[] |
VERSION_STRING
4 Byte langes Versionskennzeichen.
|
private byte[] |
writeBuf
Puffer zum Kopieren von Dateien oder Einlesen von Strings und Zahlen.
|
Constructor and Description |
---|
ContainerFile()
Konstruktor für ContainerFile.
|
Modifier and Type | Method and Description |
---|---|
(package private) void |
accessContainer(long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind,
long contId,
java.io.File containerDir)
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen.
|
(package private) void |
accessContainerReadOnly(java.io.File contFile)
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen.
|
(package private) void |
appendSerializedData()
Haengt den bereits uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.
|
(package private) void |
appendSerializedDataRaf()
Haengt den bereits mit
ContainerFile#preserializeData(ResultData,long) uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an. |
private void |
checkContainerAccessed()
Prueft, ob ein Container zum Lesen im Zugriff ist.
|
private void |
checkContainerAccessedHeaderRead()
Prueft, ob ein Container zum Lesen im Zugriff ist und dessen Container-Header bereits eingelesen ist.
|
private void |
checkContainerAccessedRW()
Prueft, ob ein Container zum Lesen und Schreiben im Zugriff ist.
|
(package private) void |
closeContainer(long containerEntries,
long minArcTime,
long maxArcTime,
long minDataTime,
long maxDataTime,
long minDataIdx,
long maxDataIdx,
long vorhalteZeit)
Schliesst die Container-Datei für den mit einer der
accessContainer() -Methoden spezifizierten Container. |
void |
closeContainerRecount(long vorhalteZeit)
Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensätze zu bestimmen.
|
private void |
closeRandomAccessFile(FileAccess raf)
Schliesst ein RandomAccessFile und faengt die Exception ab.
|
static long |
compareContainerFile(java.io.File file1,
java.io.File file2)
Vergleicht die ID’s von zwei ContainerFiles:
- grösser 0, wenn die ID des ersten ContainerFiles grösser ist, als die Zweite; - kleiner 0, wenn sie kleiner ist als die Zweite; - 0, wenn sie gleich sind. |
long |
compareContainerFile(long fileID2CompareWith)
Vergleicht die ID’s von zwei ContainerFiles
grösser 0, wenn die ID dieses ContainerFiles grösser ist, als die zu Vergleichende kleiner 0, wenn sie kleiner ist als die zu Vergleichende 0, wenn sie gleich sind |
(package private) int |
countContainerEntries()
Zaehlt die Anzahl der Datensätze in dem mit einer
accessContainer() -Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensätze in der Container-Datei. |
(package private) void |
createContainer(boolean toSave)
Erzeugt eine neue Container-Datei für den mit accessContainer() spezifizierten Container.
|
(package private) byte[] |
createDataIndexBuffer()
Erzeugt eine verkürzte Liste von Datenindizes, die im aktuellen Datencontainer archiviert sind und schreibt sie in ein Byte-Array (falls z.B. 0,4,8,16,24,28,32 die Indizes der Datensätze sind, wird daraus: 0-8,16,24-32)
|
private void |
createDefaultContainerHeader(boolean toSave)
Erzeugt Default-Header-Parameter für den Anfang einer neuen Container-Datei.
|
private void |
createWriteBuffers()
Legt alle zum Schreiben benoetigte Puffer an.
|
(package private) void |
deleteContainerData()
Loescht alle Datensätze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.
|
(package private) int |
embedSerialializedData(long arcTime,
long dataTime,
long dataIdx,
byte[] serData,
byte[] dest,
java.util.zip.Deflater compresser)
Schreibt das Bytefeld mit allen Datensatz-Headern, so dass es mit
appendSerializedData() geschrieben werden kann. |
(package private) boolean |
existsContainer()
Liefert Kennzeichen, ob bereits eine Container-Datei für den mit
#accessContainer(long,long,long,int,ArchiveDataKind,long,String) spezifizierten Container besteht. |
private void |
flushCache() |
private void |
forgetCache() |
(package private) long |
getAspId() |
(package private) long |
getAtgId() |
private static byte[] |
getBuf(byte[] defaultBuffer,
int desiredSize)
Liefert den uebergebenen Puffer falls dessen Größe ausreichend ist, andernfalls einen neu angelegten.
|
static java.lang.String |
getContainerFileName(long containerId)
Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
|
(package private) long |
getContainerId() |
(package private) long |
getContainerSize()
Ermittelt die Gesamtlaenge des mit
accessContainer() im Zugriff befindlichen Containers. |
(package private) java.io.File |
getContFile() |
(package private) ArchiveDataKind |
getContHdrParamAsArchiveDataKind(KeyValParam param)
Nachdem mit
readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
(package private) boolean |
getContHdrParamAsBool(KeyValParam param) |
(package private) int |
getContHdrParamAsInt(KeyValParam param) |
(package private) long |
getContHdrParamAsLong(KeyValParam param)
Nachdem mit
readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
(package private) java.lang.String |
getContHdrParamAsString(KeyValParam param)
Nachdem mit
readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
static long |
getContID(java.io.File file)
Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
|
static long |
getContID(java.lang.String fileName)
Liefert die Container-ID zum angegebenen Container-Datei-Namen, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
|
static int |
getHeaderLen()
Ermittelt die Gesamtlaenge des mit
accessContainer() im Zugriff befindlichen Containers. |
(package private) java.util.ArrayList<java.lang.Long> |
getListOfIndexesDeleted()
Für Testfälle
|
(package private) long |
getObjId() |
static int |
getOpenFileLimit() |
(package private) int |
getSv() |
static int |
getTotalDataOverhead()
Ermittelt den vollstaendigen Overhead für einen Datensatz.
|
(package private) boolean |
isContainerClosed()
Prueft ob der mit einer der
accessContainer() -Methoden spezifizierte Container bereits abgeschlossen ist. |
static boolean |
isContainerFile(java.io.File f)
Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
|
static boolean |
isContainerFileName(java.lang.String name)
Liefert Kennzeichen, ob der angegebene Dateiname eine moegliche Container-Datei ist.
|
private static boolean |
isGap(long start,
long end)
Prüft ob zwischen dem Index start und end eine Lücke ist.
|
(package private) void |
iterClose()
Schliesst das RandomAccessFile, das zum Iterieren verwendet wurde.
|
(package private) ContainerDataIterator |
iterGetDataIterator()
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
(package private) ContainerDataIterator |
iterGetDataIterator(boolean considerDel)
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
(package private) ContainerDataIterator |
iterGetHeaderIterator() |
(package private) byte[] |
iterGetRawData(java.util.zip.Inflater decompresser)
Liefert den naechsten Datensatz so wie er im Container gespeichert wurde.
|
private void |
iterLoadDataChunk(long stepBack)
Springt stepBack Bytes in der Datei zurueck und liest Datensätze aus in den Lese-Puffer bis dieser voll ist oder das Ende der Datei erreicht ist.
|
private void |
iterLoadExtraBuffer(long stepBack,
byte[] extraBuffer)
Laedt den Datensatz in einen Extra-Puffer, weil er zu gross für den Standard-Buffer ist.
|
(package private) boolean |
iterReadNextDataHdr()
Prueft, ob ein weiterer Datensatz zur letzten Abfrage verfuegbar ist.
|
(package private) void |
iterSkipData()
Ueberspringt den naechsten Datensatz
|
(package private) boolean |
iterStillCompressed() |
(package private) void |
leaveContainer()
Beendet das Arbeiten mit dem zuvor ueber eine der
accessContainer() -Methoden definierten Container. |
private static long |
noModBits(long dataIndex) |
static void |
prepareForPerformanceTest(byte[] testDat)
Wenn diese Methode aufgerufen wird, koennen keine Daten archiviert werden.
|
(package private) void |
readContainerHeader()
Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header.
|
(package private) void |
readContainerHeader(FileAccess raf) |
private static <T> T |
removeOldest(java.util.LinkedHashSet<T> set)
Entfernt den ältestem Eintrag aus dem LinkedHashSet und gibt ihn zurück.
|
(package private) void |
restoreHeader(java.io.File srcFile)
Der Container-Header der Container-Datei, die mit der
accessContainer() -Methode spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben. |
(package private) int |
serializeData(ResultData rd,
long arcTime,
java.util.zip.Deflater compresser)
Serialisiert den uebergebenen Datensatz und speichert ihn in
actualWriteBuf und totalWriteDataSize . |
(package private) int |
serializeDataGap(long dataIndex,
long dataTime,
long archiveTime,
java.util.zip.Deflater compresser)
Serialisiert einen Datensatz der eine Datenluecke kennzeichnet und speichert ihn in
actualWriteBuf und totalWriteDataSize . |
(package private) int |
serializeReqData(ArchiveData ad,
long arcTime,
java.util.zip.Deflater compresser)
Serialisiert den uebergebenen Datensatz und speichert ihn in
actualWriteBuf und totalWriteDataSize . |
(package private) void |
setContHdrParam(KeyValParam param,
ArchiveDataKind val)
Setzt einen Parameters im Container-Header.
|
(package private) void |
setContHdrParam(KeyValParam param,
boolean val)
Setzt einen Parameters im Container-Header.
|
(package private) void |
setContHdrParam(KeyValParam param,
long val)
Setzt einen Parameters im Container-Header.
|
(package private) void |
setContHdrParam(KeyValParam param,
java.lang.String val)
Setzt einen Parameters im Container-Header.
|
(package private) void |
setListOfIndexesDeleted(FileAccess raf)
Erzeugt eine Liste der Datensatz-Indizes, die im durch raf spezifizierten Container vorkommen (sortiert)
|
static void |
setOpenFileLimit(int openFileLimit) |
private void |
skipContainerHeader(FileAccess raf)
Springt im uebergebenen Eingabestrom an die Stelle hinter dem Header der Container-Datei.
|
java.lang.String |
toString() |
void |
writeContainerHeader()
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei.
|
private byte[] |
writeDataModifier(ResultData rd)
Wenn der Originaldatensatz keine Daten enthaelt, liefert diese Methode die Daten, die stattdessen im Container (zur Markierung) gespeichert werden sollen.
|
void |
writeInitialContainerHeader()
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei.
|
private static final Debug _debug
private static final boolean DEBUG_CALLS
private static final byte[] VERSION_STRING
4 Byte langes Versionskennzeichen.
private static final int DATALEN_LEN
Laenge des Laengenbytes vor jedem Datensatz (4 Bytes, Integer).
private static final int DATAHDR_LEN
Laenge des Headers eines jeden Datensatzes. Archivzeitstempel (6B), Datenzeitstempel (6B), Datenindex (8B), Pruefsumme (4B).
private static final int COMPRESS_LEN
Laenge des Compress-Info-Feldes. Compress-Info enthaelt 0 bei unkomprimierten Datensatz, sonst dekomprimierte Laenge des komprimierten Datensatzes.
public static final int NOT_COMPRESSED
Wert des Compress-Info-Feldes, wenn DS nicht komprimiert ist
private static int OPEN_FILE_LIMIT
public static boolean DECOMPRESS_QUERY_RESULTS
Falls wahr, werden Archivanfragen komprimiert beantwortet (ist langsam, weil das Stream-Interface der Kernsoftware langsam ist)
private static final byte[] NO_SOURCE
Datensatzbytes, falls “keine Quelle” signalisiert wurde
private static final byte[] NO_DATA
Datensatzbytes, falls “keine Daten” signalisiert wurde
private static final byte[] NO_RIGHTS
Datensatzbytes, falls “keine Rechte” signalisiert wurde
private static final byte[] POT_GAP
Datensatzbytes um eine potentielle Datenluecke zu kennzeichnen
public static int MAX_UNCOMPRESSED
static final java.lang.String CONT_FILENAME_PREFIX
Praefix eines Containerdateinamens.
static final java.lang.String CONT_FILENAME_SUFFIX
Dateiendung eines Containerdateinamens.
static final java.util.regex.Pattern CONT_FILENAME_PAT
Regulaerer Ausdruck zur Erkennung von Containerdateinamen.
public static final java.io.FilenameFilter CONT_FILENAME_FILTER
Filter zur Erkennung von Containerdateien anhand des Dateinamens.
private static final int BUFFER_SIZE
Größe der Daten-Puffer in Byte. Wenn eine Anfrage 10000 Unteranfragen enthaelt, werden auch 10000 ContainerFile-Objekte angelegt. Drum nicht zu gross waehlen. Bei Bedarf werden Größere Puffer extra angelegt.
private static boolean IS_PERFORMANCE_TEST
Gibt an, ob gerade ein Performance-Test mit Dummy-Daten (um den Overhead durch Deserialisieren/Serialisieren zu vermeiden) laeuft.
private static byte[] PERF_TESTDATA
Dummy-Daten für den Performance-Test.
private boolean deletedSpecialTreatment
Gibt an, ob ausgelagerte Container beim Nachfordern so behandelt werden, dass ein Iterator normal darüber iterieren kann
private boolean deletedHeaderFlag
Gibt an, ob im aktuellen Container das “deleted”-Flag gesetzt ist
byte[] indexListSep
Gibt den Seperator an, der für den Datenindexlistenaufbau beim Löschen eines Containers verwendet wird
private byte[] byte8Buf
Puffer zum Einlesen von Laengenbytes etc.
private byte[] writeBuf
Puffer zum Kopieren von Dateien oder Einlesen von Strings und Zahlen. Wird nur von ArchivTasks benutzt (und damit automatisch angelegt)
private byte[] actualWriteBuf
Referenz auf den tatsaechlichen, von ContainerFile#serializeData(ResultData,long)
verwendeten Puffer, der von writeBuf
abweicht, falls dieser zu klein ist). Notwendig, da Daten vorserialisiert werden müssen, um deren Länge zu bestimmen.
private int totalWriteDataSize
Laenge des von ContainerFile#serializeData(ResultData,long)
serialisierten Datensatzes.
private byte[] readBuf
Puffer zum Ein-/Auslesen des Container-Headers und anderer Daten. Muss ein extra Puffer sein, damit man zwischen dem Vorserialisieren und dem tatsächlichen Schreiben eines Datensatzes z.B. einen neuen Container anlegen kann (dazu muss man einen Header schreiben) ohne das vorserialisierte Datum zu beschaedigen.
private ContainerDataIterator dataIter
Iterator für das Durchlaufen angefragter Datensätze aus einem Container.
private java.io.ByteArrayOutputStream bos
Puffer für den Serialisierer und zum Lesen eines Datensatzes.
private Serializer serializer
Datensatz-Serialisierer.
private ContainerHdr containerHdr
Container-Header Parameter als Key/Value-Paare. Die Parameter sind in KeyValParam
statisch deklariert. Als Key eines Parameters wird KeyValParam.getKey()
benutzt.
private long objId
Aktuelle Objekt-ID.
private long atgId
Aktuelle Attributgruppen-ID.
private long aspId
Aktuelle Aspekt-ID.
private int sv
Aktuelle Simulationsvariante.
private ArchiveDataKind dataKind
Aktuelle Datensatzart.
private long containerId
Aktuelle Container-ID.
private java.io.File contFile
Aktuelle Container-Datei.
private boolean accessed
Container adressiert.
private boolean readOnly
Container read-only adressiert.
private boolean headerRead
Container-Header eingelesen.
private ContainerFile.MyCloseableRandomAccessFile iterRaf
Container-Datei. Ist ein RandomAccessFile, da Rueckspruenge noetig sind, wenn der letzte Datensatz nur teilweise in den Puffer eingelesen wurde.
private boolean iterIsHdrIterator
Wahr, falls der Iterator nur ueber Min- und Maxwert aus dem Container-Header iteriert.
private int iterBufPos
Position innerhalb des Puffers im Speicher. Bei iterIsHdrIterator
der Zaehler für gelieferten Min- und Maxwert.
private int iterUncompressedLen
Unkomprimierte Laenge des Datensatzes (oder 0 falls dieser nicht komprimiert ist).
private int iterBytesRead
Zahl der beim letzten iterLoadDataChunk() gelesenen Bytes.
private int iterNextDataLen
Laenge des naechsten Datensatzes (wird in iterReadNextData() besetzt)
private boolean iterDataRead
Marker, ob nach jedem iterReadNextData() genau einmal iterGetDataElem() aufgerufen wurde (sonst stimmt die readPos nicht)
private boolean iterEOC
Wahr, wenn das Ende eines Containers erreicht ist
private java.util.ArrayList<java.lang.Long> iterlistOfDataIdx
Für gelöschte Container beim Nachfordern:
Liste der Datenindizes im Container
private int iterlistOfDataIdxPos
Für gelöschte Container beim Nachfordern:
aktuelle Position in der Liste der Datenindizes
private static final java.lang.ThreadLocal<java.util.LinkedHashSet<ContainerFile.MyCloseableRandomAccessFile>> _openFilesInCurrentThread
private static final java.util.concurrent.atomic.AtomicInteger _numOpenFiles
private final CacheManager _cacheManager
private CacheManager.Cache _cache
private static int HEADER_LENGTH
public static int getOpenFileLimit()
public static void setOpenFileLimit(int openFileLimit)
public static void prepareForPerformanceTest(byte[] testDat)
Wenn diese Methode aufgerufen wird, koennen keine Daten archiviert werden. Stattdessen werden Dummy-Daten mit bekannter Laenge archiviert, um die Performance des Speichersystems testen zu koennen.
testDat
- Daten, die pro Datensatz in die Container geschrieben werden.public long compareContainerFile(long fileID2CompareWith)
Vergleicht die ID’s von zwei ContainerFiles
grösser 0, wenn die ID dieses ContainerFiles grösser ist, als die zu Vergleichende
kleiner 0, wenn sie kleiner ist als die zu Vergleichende
0, wenn sie gleich sind
fileID2CompareWith
- public static long compareContainerFile(java.io.File file1, java.io.File file2) throws PersistenceException
Vergleicht die ID’s von zwei ContainerFiles:
- grösser 0, wenn die ID des ersten ContainerFiles grösser ist, als die Zweite;
- kleiner 0, wenn sie kleiner ist als die Zweite;
- 0, wenn sie gleich sind.
file1
- das erste Filefile2
- das zweite FilePersistenceException
- falls die Dateien keine ContainerFiles sindpublic java.lang.String toString()
toString
in class java.lang.Object
public static boolean isContainerFile(java.io.File f)
Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
f
- Dateipublic static boolean isContainerFileName(java.lang.String name)
Liefert Kennzeichen, ob der angegebene Dateiname eine moegliche Container-Datei ist.
name
- Dateinamepublic static long getContID(java.io.File file)
Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird. Alternativ kann die Container-ID aus den Container-Header-Parametern gelesen werden; siehe dazu #getContainerHeaderParam(KeyValParam)
.
file
- Container-Dateipublic static long getContID(java.lang.String fileName)
Liefert die Container-ID zum angegebenen Container-Datei-Namen, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird. Alternativ kann die Container-ID aus den Container-Header-Parametern gelesen werden; siehe dazu #getContainerHeaderParam(KeyValParam)
.
file
- Container-Dateipublic static java.lang.String getContainerFileName(long containerId)
Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
containerId
- Container-IDvoid accessContainer(long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, long contId, java.io.File containerDir) throws PersistenceException
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen. Muss immer aufgerufen werden bevor mit einem Container gearbeitet werden kann. Der Containerdateiname wird aus der Container-ID gebildet. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer()
aufgerufen werden.
objId
- Objekt-ID (muss >= 0 sein)atgId
- Attributgruppen-ID (muss >= 0 sein)aspId
- Aspekt-ID (muss >= 0 sein)sv
- Simulationsvariante (zwischen 0 und 999)dataKind
- DatensatzartcontId
- Container-ID (muss zwischen 0 und 2^40-1 liegen)containerDir
- Pfad des Verzeichnisses, das die Container-Datei enthaeltPersistenceException
void accessContainerReadOnly(java.io.File contFile) throws PersistenceException
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen. Es koennen nur lesende Operationen auf die Container-Datei ausgeführt werden. Vorgesehen für den Zugriff auf Container, die bereits auf ein Medium vom Typ B ausgelagert sind. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer()
aufgerufen werden. Die Containerdatei kann einen beliebigen Namen haben.
contFile
- Containerdatei (muss existieren)PersistenceException
private final void flushCache() throws PersistenceException
PersistenceException
private final void forgetCache()
void leaveContainer() throws PersistenceException
Beendet das Arbeiten mit dem zuvor ueber eine der accessContainer()
-Methoden definierten Container. Diese Methode muss aufgerufen werden, wenn danach auf einen anderen Container zugegriffen werden soll. Die Methode prueft nicht, ob ein Container vorher mit #accessContainer(long,
long,long,int,ArchiveDataKind,long,String)
definiert wurde. D.h., man kann diese Methode mehrfach aufrufen. Dadurch wird die Ausnahmebehandlung erleichtert.
PersistenceException
boolean existsContainer() throws PersistenceException
Liefert Kennzeichen, ob bereits eine Container-Datei für den mit #accessContainer(long,long,long,int,ArchiveDataKind,long,String)
spezifizierten Container besteht.
PersistenceException
void createContainer(boolean toSave) throws PersistenceException
Erzeugt eine neue Container-Datei für den mit accessContainer() spezifizierten Container. Schreibt den Container-Header und befuellt diesen mit den angegebenen Parametern.
toSave
- SichernPersistenceException
void closeContainer(long containerEntries, long minArcTime, long maxArcTime, long minDataTime, long maxDataTime, long minDataIdx, long maxDataIdx, long vorhalteZeit) throws PersistenceException
Schliesst die Container-Datei für den mit einer der accessContainer()
-Methoden spezifizierten Container. Der Container-Header wird entsprechend aktualisiert.
containerEntries
- Anzahl Datensätze im ContainerminArcTime
- Minimaler Archivzeitstempel im ContainermaxArcTime
- Maximaler Archivzeitstempel im ContainerminDataTime
- Minimaler Datenzeitstempel im ContainermaxDataTime
- Maximaler Datenzeitstempel im ContainerminDataIdx
- Minimaler Datenindex im ContainermaxDataIdx
- Maximaler Datenindex im ContainervorhalteZeit
- parametrierte Vorhaltezeit in SekundenPersistenceException
public void closeContainerRecount(long vorhalteZeit) throws PersistenceException
Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensätze zu bestimmen. Die Information der Indexe reicht nicht aus, weil dort die Anzahl der Datensätze nicht verfuegbar ist.
vorhalteZeit
- parametrierte Vorhaltezeit in SekundenPersistenceException
boolean isContainerClosed() throws PersistenceException
Prueft ob der mit einer der accessContainer()
-Methoden spezifizierte Container bereits abgeschlossen ist.
PersistenceException
private void createDefaultContainerHeader(boolean toSave) throws PersistenceException
Erzeugt Default-Header-Parameter für den Anfang einer neuen Container-Datei. Bevor mit writeContainerHeader()
der Header geschrieben werden kann, muss entweder mit dieser Methode ein neuer Header erzeugt oder mit readContainerHeader()
ein Header eingelesen werden.
toSave
- SichernPersistenceException
public void writeContainerHeader() throws PersistenceException
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei. Bei einer neuen leeren Datei werden die Parameter an den Anfang der Datei angehangen, bei einer zu aendernden Container-Datei werden die vorhandenen Parameter ueberschrieben. Bevor mit dieser Methode der Header geschrieben werden kann, muss entweder mit #createDefaultContainerHeader(boolean,long) neuer Header erzeugt oder mit {@link #readContainerHeader()} ein Header eingelesen worden sein.
PersistenceException
public void writeInitialContainerHeader() throws PersistenceException
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei. Bei einer neuen leeren Datei werden die Parameter an den Anfang der Datei angehangen, bei einer zu aendernden Container-Datei werden die vorhandenen Parameter ueberschrieben. Bevor mit dieser Methode der Header geschrieben werden kann, muss entweder mit #createDefaultContainerHeader(boolean,long) neuer Header erzeugt oder mit {@link #readContainerHeader()} ein Header eingelesen worden sein.
PersistenceException
void readContainerHeader(FileAccess raf) throws PersistenceException
PersistenceException
void readContainerHeader() throws PersistenceException
Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header. Die Container-Header Parameter stehen dann als Key/Value-Paare zur Verfuegung und koennen mit #getContainerHeaderParam(KeyValParam)
abgefragt werden. Bevor mit writeContainerHeader()
der Header geschrieben werden kann, muss entweder mit dieser Methode der Header eingelesen oder mit #createDefaultContainerHeader(boolean,long)
ein neuer Header erzeugt werden.
PersistenceException
private void skipContainerHeader(FileAccess raf) throws java.io.IOException
Springt im uebergebenen Eingabestrom an die Stelle hinter dem Header der Container-Datei. Voraussetzung ist, dass das RandomAccessFile am Anfang der Datei steht.
raf
- RandomAccessFile der Container-Dateijava.io.IOException
java.lang.String getContHdrParamAsString(KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader()
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Wirft eine PersistenceException
, falls der Parameter nicht gefunden wurde. Liefert den Wert des Parameters unabhaengig von dessen Typ immer als String zurueck.
param
- Container-Header-ParameterPersistenceException
ArchiveDataKind getContHdrParamAsArchiveDataKind(KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader()
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Liefert den Wert des Parameters als Datensatzart zurueck. Wirft eine PersistenceException
, falls der Parameter nicht gefunden wurde oder nicht in den Typ ArchiveDataKind
umgeformt werden kann.
param
- Container-Header-ParameterPersistenceException
long getContHdrParamAsLong(KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader()
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Liefert den Wert des Parameters als numerischen Wert vom Typ long
zurueck. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde oder nicht in den Typ long
umgeformt werden kann.
param
- Container-Header-Parameterlong
PersistenceException
int getContHdrParamAsInt(KeyValParam param) throws PersistenceException
PersistenceException
boolean getContHdrParamAsBool(KeyValParam param) throws PersistenceException
PersistenceException
void setContHdrParam(KeyValParam param, long val) throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
param
- Container-Header-Parameterval
- Numerischer Wert des Container-Header-ParametersPersistenceException
void setContHdrParam(KeyValParam param, boolean val) throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
param
- Container-Header-Parameterval
- Wahrheitswert des Container-Header-ParametersPersistenceException
void setContHdrParam(KeyValParam param, java.lang.String val) throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
param
- Container-Header-Parameterval
- Textwert des Container-Header-ParametersPersistenceException
void setContHdrParam(KeyValParam param, ArchiveDataKind val) throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
param
- Container-Header-Parameterval
- Datensatzart des Container-Header-ParametersPersistenceException
void restoreHeader(java.io.File srcFile) throws PersistenceException
Der Container-Header der Container-Datei, die mit der accessContainer()
-Methode spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben.
srcFile
- Container-DateiPersistenceException
private void createWriteBuffers()
Legt alle zum Schreiben benoetigte Puffer an. Wird nur von Schreib-Methoden aufgerufen. Lesende Tasks beanspruchen so erheblich weniger Speicher.
int serializeData(ResultData rd, long arcTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf
und totalWriteDataSize
. Da der ArchivTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeData(ResultData,long)
und appendSerializedData()
aufgeteilt. Wenn der Datensatz ein Spezialfall ist (keine Quelle, keine Daten, Datenluecke), wird ein speziell codierter Datensatz verwendet.
rd
- Zu archivierender DatensatzarcTime
- ArchivzeitstempelPersistenceException
int serializeReqData(ArchiveData ad, long arcTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf
und totalWriteDataSize
. Da der ArchivRequestedTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeReqData(ArchivetData,long)
und appendSerializedData()
aufgeteilt. Wenn der Datensatz ein Spezialfall ist (keine Quelle, keine Daten), wird ein speziell codierter Datensatz verwendet.
Diese Methode wird zum serialisieren von nachgeforderten Datensätzen verwendet.
ad
- Zu archivierender DatensatzarcTime
- ArchivzeitstempelPersistenceException
int serializeDataGap(long dataIndex, long dataTime, long archiveTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert einen Datensatz der eine Datenluecke kennzeichnet und speichert ihn in actualWriteBuf
und totalWriteDataSize
. Da der ArchivTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeData(ResultData,long)
und appendSerializedData()
aufgeteilt.
dataIndex
- DatenindexdataTime
- DatenzeitarchiveTime
- ArchivzeitPersistenceException
int embedSerialializedData(long arcTime, long dataTime, long dataIdx, byte[] serData, byte[] dest, java.util.zip.Deflater compresser) throws PersistenceException
Schreibt das Bytefeld mit allen Datensatz-Headern, so dass es mit appendSerializedData()
geschrieben werden kann. Von aussen wird diese Methode nur für Testzwecke verwendet. Normalerweise sind die Methoden ContainerFile#serializeData(ResultData,long)
bzw. ContainerFile#serializeReqData(ResultData,long)
zu verwenden. Die Daten werden komprimiert abgelegt, wenn sie laenger als MAX_UNCOMPRESSED
sind und die Kompression eine Verkuerzung ergeben hat.
aTime
- ArchivzeitdTime
- DatenzeitdIdx
- DatenindexserData
- zu schreibendes Bytefelddest
- ZielPersistenceException
void appendSerializedDataRaf() throws PersistenceException
Haengt den bereits mit ContainerFile#preserializeData(ResultData,long)
uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.
PersistenceException
void appendSerializedData() throws PersistenceException
Haengt den bereits uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.
PersistenceException
private byte[] writeDataModifier(ResultData rd) throws PersistenceException
Wenn der Originaldatensatz keine Daten enthaelt, liefert diese Methode die Daten, die stattdessen im Container (zur Markierung) gespeichert werden sollen. Derartige Daten werden nur vom DAV erzeugt und muessen deswegen immer ONLINE sein.
rd
- DatensatzPersistenceException
int countContainerEntries() throws PersistenceException
Zaehlt die Anzahl der Datensätze in dem mit einer accessContainer()
-Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensätze in der Container-Datei. Diese Methode ist nur notwendig, wenn ein noch nicht abgeschlossener Container wieder befuellt wird, weil dann die Anzahl nicht im Header steht. Im Normalbetrieb wird die Anzahl im DataIdentNode mitgefuehrt.
PersistenceException
long getContainerSize() throws PersistenceException
Ermittelt die Gesamtlaenge des mit accessContainer()
im Zugriff befindlichen Containers.
PersistenceException
public static int getHeaderLen()
Ermittelt die Gesamtlaenge des mit accessContainer()
im Zugriff befindlichen Containers.
PersistenceException
public static int getTotalDataOverhead()
Ermittelt den vollstaendigen Overhead für einen Datensatz. Inklusive Laengenbyte, Datensatz-Header, Compress-Feld und abschliessendem Separator.
void deleteContainerData() throws PersistenceException
Loescht alle Datensätze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.
Das Header-Flag darf keinesfalls vor dem Loeschen der Daten auf “geloescht” gesetzt werden!
Update 03/05/2006:
Schreibt eine optimierte Liste der Datenindizes (siehe createDataIndexBuffer()
) in den Body des Datencontainers, damit Datensätze aus geloeschten Containern beim Nachfordern ignoriert werden koennen.
PersistenceException
byte[] createDataIndexBuffer() throws PersistenceException
Erzeugt eine verkürzte Liste von Datenindizes, die im aktuellen Datencontainer archiviert sind und schreibt sie in ein Byte-Array (falls z.B. 0,4,8,16,24,28,32 die Indizes der Datensätze sind, wird daraus: 0-8,16,24-32)
PersistenceException
private static boolean isGap(long start, long end)
Prüft ob zwischen dem Index start und end eine Lücke ist.
start
- end
- private static long noModBits(long dataIndex)
ContainerDataIterator iterGetDataIterator(boolean considerDel) throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
atg
- Attributgruppe für das Deserialisieren der Datensätze. Kann null sein, falls die Datensätze nur uebersprungen werden sollen. Vorsicht: Der ContainerDataIterator verwendet den Lesepuffer der Klasse ContainerFile
. Andere Leseoperationen koennen den Lesepuffer ueberschreiben, so dass der ContainerDataIterator nicht mehr funktioniert.
considerDeleted
- Gibt an, ob ausgelagerte Container besonders behandelt werden sollen.PersistenceException
@Nullable private static <T> T removeOldest(java.util.LinkedHashSet<T> set)
Entfernt den ältestem Eintrag aus dem LinkedHashSet und gibt ihn zurück. Falls das Set leer ist wird es nicht verändert und null zurückgegeben.
ContainerDataIterator iterGetHeaderIterator() throws PersistenceException
PersistenceException
void setListOfIndexesDeleted(FileAccess raf) throws java.io.IOException
Erzeugt eine Liste der Datensatz-Indizes, die im durch raf spezifizierten Container vorkommen (sortiert)
raf
- java.io.IOException
java.util.ArrayList<java.lang.Long> getListOfIndexesDeleted()
Für Testfälle
ContainerDataIterator iterGetDataIterator() throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
atg
- Attributgruppe für das Deserialisieren der Datensätze. Kann null sein, falls die Datensätze nur uebersprungen werden sollen. Vorsicht: Der ContainerDataIterator verwendet den Lesepuffer der Klasse ContainerFile
. Andere Leseoperationen koennen den Lesepuffer ueberschreiben, so dass der ContainerDataIterator nicht mehr funktioniert.
PersistenceException
boolean iterReadNextDataHdr() throws PersistenceException
Prueft, ob ein weiterer Datensatz zur letzten Abfrage verfuegbar ist. Wird vom ContainerDataIterator benutzt, um ueber Datensätze zu iterieren.
PersistenceException
private void iterLoadDataChunk(long stepBack) throws PersistenceException
Springt stepBack Bytes in der Datei zurueck und liest Datensätze aus in den Lese-Puffer bis dieser voll ist oder das Ende der Datei erreicht ist. Der letzte Datensatz wird ggf. dabei nur teilweise gelesen. Dies muss die aufrufende Methode erkennen und bei naechsten Aufruf den Parameter stepBack entsprechend setzen.
stepBack
- Zahl der Bytes, um die von der momentanen Position des Dateizeigers zurueckgesprungen wird.PersistenceException
private void iterLoadExtraBuffer(long stepBack, byte[] extraBuffer) throws PersistenceException
Laedt den Datensatz in einen Extra-Puffer, weil er zu gross für den Standard-Buffer ist.
stepBack
- Zahl der Bytes, um die von der momentanen Position des Dateizeigers zurueckgesprungen wird.extraBuffer
- Extra-PufferPersistenceException
void iterSkipData() throws PersistenceException
Ueberspringt den naechsten Datensatz
PersistenceException
boolean iterStillCompressed()
#iterGetRawData()
nocj komprimiert ist. Wenn DECOMPRESS_QUERY_RESULTS
gesetzt ist, werden aus Performancegruenden die Ergebnisdaten bereits im Archivsystem dekomprimiert (das Stream-Interface der Kernsoftware ist etwas langsam).byte[] iterGetRawData(java.util.zip.Inflater decompresser) throws PersistenceException
Liefert den naechsten Datensatz so wie er im Container gespeichert wurde.
PersistenceException
void iterClose() throws PersistenceException
Schliesst das RandomAccessFile, das zum Iterieren verwendet wurde.
PersistenceException
private void checkContainerAccessed() throws PersistenceException
Prueft, ob ein Container zum Lesen im Zugriff ist. Wirft eine PersistenceException
falls nicht.
PersistenceException
private void checkContainerAccessedRW() throws PersistenceException
Prueft, ob ein Container zum Lesen und Schreiben im Zugriff ist. Wirft eine PersistenceException
falls nicht.
PersistenceException
private void checkContainerAccessedHeaderRead() throws PersistenceException
Prueft, ob ein Container zum Lesen im Zugriff ist und dessen Container-Header bereits eingelesen ist. Wirft eine PersistenceException
falls nicht.
PersistenceException
private static byte[] getBuf(byte[] defaultBuffer, int desiredSize)
Liefert den uebergebenen Puffer falls dessen Größe ausreichend ist, andernfalls einen neu angelegten. Zweck: sowenig Arbeit für die Speicherverwaltung wie moeglich.
defaultBuffer
- Vorhandener PufferdesiredSize
- Gewuenschte PufferGrößeprivate void closeRandomAccessFile(FileAccess raf) throws PersistenceException
Schliesst ein RandomAccessFile und faengt die Exception ab. (Nur zur Abkuerzung verwendet).
raf
- Zu schliessendes RandomAccessFilePersistenceException
long getContainerId()
java.io.File getContFile()
long getObjId()
long getAtgId()
long getAspId()
int getSv()