2 * Sixth Data. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
7 package eu.svjatoslav.sixth.data.store.file;
9 public class VacuumContext {
10 private final FileDataStore vacuumContext;
11 private final int targetFragmentationPercent;
12 long analyzedBytesCount = 0;
13 long freeBytesCount = 0;
14 long lastRecordStartAddress;
15 long defragmentationStartAddress;
17 public VacuumContext(final FileDataStore fileDataStore,
18 final long currentFreeAddress, final int targetFragmentationPercent) {
20 vacuumContext = fileDataStore;
21 lastRecordStartAddress = currentFreeAddress;
22 defragmentationStartAddress = currentFreeAddress;
23 this.targetFragmentationPercent = targetFragmentationPercent;
26 public void analyzeEntry(final EntryRecord record) {
27 final long bytesSinceLastEntry = lastRecordStartAddress
30 final long freeSpace = bytesSinceLastEntry - record.length;
31 freeBytesCount += freeSpace;
32 analyzedBytesCount += freeSpace;
34 checkDefragmentationPointer(record.location + record.length);
36 analyzedBytesCount += record.length;
37 lastRecordStartAddress = record.location;
40 public void analyzeStartOfDataArea() {
41 freeBytesCount += lastRecordStartAddress
42 - vacuumContext.metaData.getEntriesStorageAreaStart();
44 checkDefragmentationPointer(vacuumContext.metaData
45 .getEntriesStorageAreaStart());
48 public void checkDefragmentationPointer(
49 final long defragmentationStartAddress) {
51 if (analyzedBytesCount == 0) {
52 this.defragmentationStartAddress = defragmentationStartAddress;
56 final int fragmentationPercentage = (int) ((100L * freeBytesCount) / analyzedBytesCount);
58 if (fragmentationPercentage >= targetFragmentationPercent)
59 this.defragmentationStartAddress = defragmentationStartAddress;