public JournaledMemTable(string baseFileName, int version) { _baseFileName = baseFileName; _version = version; _memTable = new MemTable(); // If the journal exists from a previous run, then load its data into the memtable. string journalFile = Config.JournalFile(baseFileName, version); if (File.Exists(journalFile)) { var journalReader = new JournalReader(baseFileName, version); try { foreach (var pair in journalReader.Enumerate()) { _memTable.Add(pair.Key, pair.Value); } } finally { journalReader.Close(); } _journal = new JournalWriter(baseFileName, version, true); } else { _journal = new JournalWriter(baseFileName, version, false); } }
public void ReadAndWriteJournalFileWithAppend() { string path = Path.GetFullPath ("TestData\\RWJournalAppend"); if (!Directory.Exists (path)) Directory.CreateDirectory (path); JournalWriter jw = new JournalWriter (path, 324, false); List<KeyValuePair<Key, Value>> items = new List<KeyValuePair<Key, Value>> (); for (int i = 0; i < 5000; i++) { Key randKey = Key.Random (20); Value randValue = Value.Random (100); jw.Add (randKey, randValue); items.Add (new KeyValuePair<Key, Value> (randKey, randValue)); } jw.Close (); // reopen the same log for append jw = new JournalWriter (path, 324, true); for (int i = 0; i < 5000; i++) { Key randKey = Key.Random (20); Value randValue = Value.Random (100); jw.Add (randKey, randValue); items.Add (new KeyValuePair<Key, Value> (randKey, randValue)); } jw.Close (); JournalReader jr = new JournalReader (path, 324); int j = 0; foreach (var pair in jr.Enumerate()) { Assert.AreEqual (items [j].Key, pair.Key); Assert.AreEqual (items [j].Value, pair.Value); j++; } jr.Close (); }
public void AddAndLookupItemsPersisted() { string path = Path.GetFullPath ("TestData\\AddAndLookupItemsPersisted"); if (!Directory.Exists (path)) Directory.CreateDirectory (path); JournalWriter jw = new JournalWriter ("TestData\\AddAndLookupItemsPersisted", 523, false); List<KeyValuePair<Key, Value>> values = new List<KeyValuePair<Key, Value>> (); for (int i = 0; i < 10000; i++) { var randomKey = Key.Random (40); var randomValue = Value.Random (256); values.Add (new KeyValuePair<Key, Value> (randomKey, randomValue)); jw.Add (randomKey, randomValue); } jw.Close (); MemTable mtl = new MemTable (); mtl.ReadFromJournal ("TestData\\AddAndLookupItemsPersisted", 523); Value value; foreach (var pair in values) { Assert.IsTrue (mtl.Lookup (pair.Key, out value)); Assert.AreEqual (pair.Value, value); } Assert.IsFalse (mtl.Lookup (Key.Random (40), out value)); Assert.AreEqual (10000 * (40 + 256), mtl.Size); Assert.IsTrue (mtl.Full); }
// Closes a valid journal. public void Close() { if (_journal != null) { _journal.Close(); } _journal = null; _memTable = null; }
public JournaledMemTable(string baseFileName, int version) { _baseFileName = baseFileName; _version = version; _memTable = new MemTable (); // If the journal exists from a previous run, then load its data into the memtable. string journalFile = Config.JournalFile (baseFileName, version); if (File.Exists (journalFile)) { var journalReader = new JournalReader (baseFileName, version); try { foreach (var pair in journalReader.Enumerate()) { _memTable.Add (pair.Key, pair.Value); } } finally { journalReader.Close (); } _journal = new JournalWriter (baseFileName, version, true); } else _journal = new JournalWriter (baseFileName, version, false); }
// Closes a valid journal. public void Close() { if (_journal != null) _journal.Close (); _journal = null; _memTable = null; }
public void ReadCorruptedJournalFile() { string path = Path.GetFullPath ("TestData\\ReadCorruptedJournal"); if (!Directory.Exists (path)) Directory.CreateDirectory (path); JournalWriter jw = new JournalWriter (path, 324, false); List<KeyValuePair<Key, Value>> items = new List<KeyValuePair<Key, Value>> (); for (int i = 0; i < 10; i++) { Key randKey = Key.Random (20); Value randValue = Value.Random (100); jw.Add (randKey, randValue); items.Add (new KeyValuePair<Key, Value> (randKey, randValue)); } jw.Close (); // Reopen the file and add a partial record var fileName = Config.JournalFile (path, 324); var writer = new BinaryWriter (new FileStream (fileName, FileMode.Append, FileAccess.Write, FileShare.None, 1024, false)); Key key = Key.Random (20); writer.Write7BitEncodedInt (key.Length); writer.Write (key.InternalBytes); writer.Write7BitEncodedInt (0); writer.Flush (); writer.Close (); JournalReader jr = new JournalReader (path, 324); int j = 0; foreach (var pair in jr.Enumerate()) { Assert.AreEqual (items [j].Key, pair.Key); Assert.AreEqual (items [j].Value, pair.Value); j++; } jr.Close (); }