Record Manager
description
Transcript of Record Manager
Record Manager
Andreas Bräu, Martin Salzbrenner
Record Manager - Übersicht
● Datenstrukturen– Freispeicherverzeichnis– Datenseiten
● Record Manager– Funktionen
● Record Iterator● Record
Freispeicherverzeichnis
● currentEntries momentan nicht in Benutzung● 2043 Einträge pro FSI-Seite bei 4kB
Seitengröße
pageId pageType
currentEntries
freeSpace freeSpaceBlockfreeSpace freeSpaceBlockfreeSpace freeSpaceBlock
...freeSpace freeSpaceBlock
Freispeicherverzeichnis
● Seitennummern werden implizit mitgeführt● Funktionen zur Manipulation des FSI:
– addFsiPage(...)– addFreeSpaceInventoryEntry(...)– editFreeSpaceInventoryEntry(...)
● Abfrage des FSI:– findFreeSpaceInventoryEntry(...)– findFreeMemoryBlock(...)
● Suche über alle FSI-Seiten, bis entsprechende Seite gefunden
Datenseiten
● 255 Records pro Seite● freeSpace, biggestFreeBlock jeweils genaue
Angabe der verwendeten Bytes● TID Konzept (tableId, pageId, slotId)
Funktionen RM
● insert– einfügen eines Records in eine angegebene
Tabelle– die pageId und die slotId der TID wird ermittelt– d.h. suchen einer passenden Seite / eines Slot– einfügen– FSI updaten
● getNewPageId unperformant– ermitteln einer noch nicht vergebenen pageId– Schleife pageId solange erhöhen bis eine
ungenutzte pageId gefunden– derzeit mit findFreeSpaceInventoryEntry– >unperformant für jede pageId einzeln
Funktionen RM
● freeAvailableSpaceInPage– berechnen des freien Speichers auf einer
Datenseite– Summe des PageHeader und der Länge der
Records– wenn 255 Records in Seite, dann wird der freie
Speicher auf 0 gesetzt● findLargestFreeBlockInPage
– ermitteln des größten freien Blockes einer Seite und dessen Offset
– ordnen der Recordslots nach Offset– berechnen der freien Zwischenräume
Funktionen RM
● createTable:– neues Segment erstellen– und erste FSI-Seite (Seite 0)
● dropTable:– nur durchreichen von oben
● commit:– Schreiben aller veränderten Daten– Freigabe aller Sperren
● rollback:– zurücksetzten aller Änderungen– Freigabe aller Sperren
Funktionen RM
● get:– springt zu der in TupleId angegebenen Seite– sperrt Seite– liest Record aus angegebenen Slot
● remove– löschen eines Records – im Slotpagearray wird recordLength des zu
löschenden Records 0 gesetzt– FSI Eintrag aktualisieren
Funktionen RM
● replace– ersetzten eine vorhandenen Records nur
möglich, wenn neuer Record kleiner oder gleich lang wie der alte Record ist (kein Verändern der TID nötig)
– FSI Eintrag aktualisieren● showPageContent
– zeigt die Inhalte der FSI und Datenseiten an
Funktionen RM┌-------------------------------------------------------------------------------------------------------┐│┌-----------------------------globaler Pageheader------------------------------------------┐│││ Seitennummer: 3 -- Seitentyp: DataPage │││┌-----------------------------Slot Page Header----------------------------------------------┐│││Anzahl der Slots auf der Seite: 16 ││││gesamter freie Speicher der Seite: 3817 ││││größter freier Block auf der Seite: 3817 ││││offset des Records: 4076 -- laenge des records: 20 -- slotnummer: 0 ││││offset des Records: 4056 -- laenge des records: 20 -- slotnummer: 1 ││││offset des Records: 4036 -- laenge des records: 20 -- slotnummer: 2 ││││offset des Records: 4016 -- laenge des records: 20 -- slotnummer: 3 ││││offset des Records: 3996 -- laenge des records: 20 -- slotnummer: 4 ││││offset des Records: 3987 -- laenge des records: 9 -- slotnummer: 5 ││││offset des Records: 3978 -- laenge des records: 9 -- slotnummer: 6 ││││offset des Records: 3969 -- laenge des records: 9 -- slotnummer: 7 ││││offset des Records: 3960 -- laenge des records: 9 -- slotnummer: 8 ││││offset des Records: 3951 -- laenge des records: 9 -- slotnummer: 9 ││││offset des Records: 3942 -- laenge des records: 9 -- slotnummer: 10 ││││offset des Records: 3933 -- laenge des records: 9 -- slotnummer: 11 ││││offset des Records: 3924 -- laenge des records: 9 -- slotnummer: 12 ││││offset des Records: 3915 -- laenge des records: 9 -- slotnummer: 13 ││││offset des Records: 3906 -- laenge des records: 9 -- slotnummer: 14 ││││offset des Records: 3897 -- laenge des records: 9 -- slotnummer: 15 │││└---------------------------------------------------------------------------------------------------┘│└-------------------------------------------------------------------------------------------------------┘
Funktionen RM
┌--------------------------------------------------------------------------------------------------------------------------┐│┌-----------------------------globaler Pageheader-------------------------------------------------------------┐│││ Seitennummer: 0 -- Seitentyp: FSIPage │││└----------------------------------------------------------------------------------------------------------------------┘││┌-------------------------------FSI Pageheader-----------------------------------------------------------------┐│││ currentEntries: 0 -- zur Zeit nicht in Benutzung │││└----------------------------------------------------------------------------------------------------------------------┘││┌----------------------------------FSI-Tabelle--------------------------------------------------------------------┐│││ Seite│ GFS │ LFB │ │Seite │GFS │ LFB │ │Seite│ GFS │ LFB │ │Seite│ GFS │ LFB ││││ 1 │ 8 │ 0 │ │ 2 │ 0 │ 0 │ │ 3 │ 238 │ 238 │ │ 4 │ --- │ --- ││││ 5 │ --- │ --- │ │ 6 │ --- │ --- │ │ 7 │ --- │ --- │ │ 8 │ --- │ --- ││││ 9 │ --- │ --- │ │ 10 │ --- │ --- │ │ 11 │ --- │ --- │ │ 12 │ --- │ --- ││││ 13 │ --- │ --- │ │ 14 │ --- │ --- │ │ 15 │ --- │ --- │ │ 16 │ --- │ --- ││││ ........ ││││ 2033│ --- │ --- │ │ 2034│ --- │ --- │ │ 2035│ --- │ --- │ │ 2036│ --- │ --- ││││ 2037│ --- │ --- │ │ 2038│ --- │ --- │ │ 2039│ --- │ --- │ │ 2040│ --- │ --- ││││ 2041│ --- │ --- │ │ 2042│ --- │ --- │ │ 2043│ --- │ --- │ │----- │ --- │ --- │││└---------------------------------------------------------------------------------------------------------------------┘││*GFS = Ges. freier Speicher, LFB = Largest free Block, Angabe in 16-Byte-Blöcken │└-------------------------------------------------------------------------------------------------------------------------┘
RecordIterator
● Sperrung der Seiten erfolgt Zug um Zug● getRecordIterator (im RecordMgr)
– sucht nach erstem Record der Tabelle– Festlegung erster Record
tableId segmentId
firstPage currentPage
firstSlot currentSlot
bufferMgr recordMgr
firstRecordRead
RecordIterator
● findNextRecord (im RecordMgr)– Suche nach dem nächsten Record
● keine Ordnung ==> Slots auf Datenseiten werden nacheinander durchgegangen
– Unterscheidung, ob nach erstem Record gesucht wird
– jede neu aufgeschlagene Seite wird gesperrt– nutzt FSI, um leere Seiten zu überspringen– geringe Performance, da viele get/releasePage,
Spielraum für Optimierungen (direktes Operieren auf den FSI-Seiten)
RecordIterator
● getNext– Suche nach nächstem Record
● falls vorhanden, Ausgabe dessen, sonst DBJ_NOT_FOUND_WARN
● hasNext– true, falls nächster Record vorhanden, sonst
false
Record
● Record wird bei erstem Gebrauch neu angelegt
● später Wiederverwendung möglich– nur rawData wird zerstört und neu angelegt
TupleId
rawDataTupleIdSet
rawDataLength
allocDataLength
Record
● getTupleId, getRecordData, getLength, getBufferLength– öffentliche Funktionen
● setData, setTupleId– private Funktionen, RecordManager darf diese
nutzen● Veränderung der Recorddaten nur über
Konstruktor oder setData