示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
 private static void AssertAreEqualRepr(ValueCount v1, ValueCount v2)
 {
     Assert.AreEqual(v1.ToString(), v2.ToString());
 }