Ejemplo n.º 1
0
        public const int CacheCheckpointSize = 3;         // cached in remote offset, cached in local, remote max

        public CacheFetcher(string sas, string stream, DirectoryInfo folder, IMemoryStreamManager streamManager)
        {
            StreamName     = stream;
            _streamManager = streamManager;
            var raw = CloudSetup.GetReaderRaw(sas);

            _remote    = raw.Item2;
            _remotePos = raw.Item1;

            var streamDir = Path.Combine(folder.FullName, stream);
            var di        = new DirectoryInfo(streamDir);

            if (!di.Exists)
            {
                di.Create();
            }
            _outputFile       = new FileInfo(Path.Combine(di.FullName, CacheStreamName));
            _outputCheckpoint = new FileInfo(Path.Combine(di.FullName, CachePositionName));

            _outputFile.Refresh();
            _cacheWriter = _outputFile.Open(_outputFile.Exists ? FileMode.Open : FileMode.Create, FileAccess.ReadWrite, FileShare.Read);

            _writer   = new BinaryWriter(_cacheWriter, CacheFormat);
            _cacheChk = new FileCheckpointArrayWriter(_outputCheckpoint, CacheCheckpointSize);
        }
Ejemplo n.º 2
0
        static void Backup(string cachePath, string target)
        {
            var streamFile = new FileInfo(Path.Combine(cachePath, CacheFetcher.CacheStreamName));
            var checkFile  = new FileInfo(Path.Combine(cachePath, CacheFetcher.CachePositionName));

            var posReader = new FileCheckpointArrayReader(checkFile, 2);
            var pos       = posReader.Read();

            Console.WriteLine("Pos {0}/{1}", pos[0], pos[1]);

            var dataBackup  = Path.Combine(target, CacheFetcher.CacheStreamName + ".gzip");
            var checkBackup = Path.Combine(target, CacheFetcher.CachePositionName + ".bak");

            Console.WriteLine(new DateTime(2016, 4, 6, 12, 0, 0).ToUniversalTime().ToString("O"));
            Console.WriteLine("Will backup to {0}/{1}", dataBackup, checkBackup);
            Console.WriteLine("Press enter to continue");
            Console.ReadLine();


            using (var source = streamFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
                using (var output = File.Create(dataBackup)) {
                    using (var gzip = new GZipStream(output, CompressionMode.Compress)) {
                        CopyStream(source, gzip, pos[0]);
                    }
                }
            }
            var checkWrite = new FileCheckpointArrayWriter(new FileInfo(checkBackup), 2);

            checkWrite.GetOrInitPosition();
            checkWrite.Update(pos);

            Console.WriteLine("Backed up to {0}", target);
        }
Ejemplo n.º 3
0
        static void Repair(string cachePath)
        {
            var streamFile   = new FileInfo(Path.Combine(cachePath, CacheFetcher.CacheStreamName));
            var checkFile    = new FileInfo(Path.Combine(cachePath, CacheFetcher.CachePositionName));
            var replace      = new FileInfo(Path.Combine(cachePath, CacheFetcher.CachePositionName + ".fix"));
            var posReader    = new FileCheckpointArrayReader(checkFile, 2);
            var vector       = posReader.Read();
            var sourceStream = streamFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            var reader       = new CacheReader(new FixedCheckpointArrayReader(vector), sourceStream, posReader);


            var prev = 0L;
            var pos  = 0L;
            var i    = 0L;

            while (true)
            {
                try {
                    var result = reader.ReadAll(pos, 1000, (id, position, maxPosition) => { });
                    if (result.ReadRecords > 0)
                    {
                        prev = pos;
                        pos  = result.CurrentCachePosition;
                        i   += 1;
                        if ((i % 100) == 0)
                        {
                            Console.WriteLine("{0}:{1:F1}GB", i, 1F * pos / 1024 / 1024 / 1024);
                        }
                        continue;
                    }
                    Console.WriteLine("We are good");
                    return;
                }
                catch (InvalidStorageFormatException ex) {
                    Console.WriteLine("Last known position {0}", pos);
                    Console.WriteLine("Previous position {0} (-{1} bytes)", prev, pos - prev);
                    var previousBlock = reader.ReadAll(prev, 1);
                    var msg           = previousBlock.Messages.Single();
                    var offset        = msg.Message.Id.GetOffset();
                    Console.WriteLine("Previous offset {0}", offset);


                    var replaceCheck = new FileCheckpointArrayWriter(replace, 2);
                    replaceCheck.GetOrInitPosition();
                    replaceCheck.Update(new long[] { prev, offset });
                    Console.WriteLine("Backup written");
                }


                break;
            }


            Console.ReadLine();
        }
Ejemplo n.º 4
0
        public static CacheReader ReaderInstance(FileInfo dataFile, FileInfo checkpointFile, FileCheckpointArrayWriter fileCheckpointArrayWriter)
        {
            var cacheReader      = dataFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            var checkpointReader = new FileCheckpointArrayReader(checkpointFile, CacheCheckpointSize);

            return(new CacheReader(fileCheckpointArrayWriter, cacheReader, checkpointReader));
        }