private void RebuildJournal() { journalWriter?.Close(); using (var writer = new StreamWriter(journalFileTmp.Open(FileMode.Create, FileAccess.Write, FileShare.ReadWrite))) { writer.WriteLine(Magic); writer.WriteLine(Version1); writer.WriteLine(appVersion.ToString()); writer.WriteLine(ValueCount.ToString()); writer.WriteLine(); foreach (var entry in lruEntries.Values) { writer.WriteLine(null != entry.UnsafeCurrentEditor ? $"{DirtyFlag} {entry.Key}" : $"{CleanFlag} {entry.Key}{entry.GetLengths()}"); } } if (journalFile.Exists) { RenameTo(journalFile, journalFileBackup, true); } RenameTo(journalFileTmp, journalFile, false); journalFileBackup.Delete(); journalWriter = new StreamWriter(journalFile.Open(FileMode.Append, FileAccess.Write, FileShare.ReadWrite)); }
private void ReadJournal() { using (var reader = new StreamReader(journalFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { var magic = reader.ReadLine(); var version = reader.ReadLine(); var appVersionString = reader.ReadLine(); var valueCountString = reader.ReadLine(); var blank = reader.ReadLine(); if (Magic != magic || Version1 != version || appVersion.ToString() != appVersionString || ValueCount.ToString() != valueCountString || string.Empty != blank) { throw new IOException($"unexpected journal header: [{magic}, {version}, {valueCountString}, {blank}"); } var lineCount = 0; while (true) { try { ReadJournalLine(reader.ReadLine()); lineCount++; } catch (EndOfStreamException) { break; } } redundantOpCount = lineCount - lruEntries.Count; } // XXX: Original, reader.hasUnterminatedLine() // If we ended on a truncated line, rebuild the journal before appending to it. journalWriter = new StreamWriter(journalFile.Open(FileMode.Append, FileAccess.Write, FileShare.ReadWrite)); }
private static void AssertAreEqualRepr(ValueCount v1, ValueCount v2) { Assert.AreEqual(v1.ToString(), v2.ToString()); }