Exemple #1
0
        public override void Load(Stream stream)
        {
            TestForEditable();
            byte version = stream.ReadNextByte();

            switch (version)
            {
            case 1:
                m_directoryMethod       = (ArchiveDirectoryMethod)stream.ReadInt32();
                m_prefix                = stream.ReadString();
                m_pendingExtension      = stream.ReadString();
                m_finalExtension        = stream.ReadString();
                m_desiredRemainingSpace = stream.ReadInt64();
                m_encodingMethod        = new EncodingDefinition(stream);
                int cnt = stream.ReadInt32();
                m_writePath.Clear();
                while (cnt > 0)
                {
                    cnt--;
                    m_writePath.Add(stream.ReadString());
                }
                cnt = stream.ReadInt32();
                m_flags.Clear();
                while (cnt > 0)
                {
                    cnt--;
                    m_flags.Add(stream.ReadGuid());
                }
                break;

            default:
                throw new VersionNotFoundException("Unknown Version Code: " + version);
            }
        }
Exemple #2
0
 /// <summary>
 /// Creates a <see cref="ArchiveInitializer{TKey,TValue}"/> that will reside on the disk.
 /// </summary>
 /// <param name="paths">the paths to place the files.</param>
 /// <param name="desiredRemainingSpace">The desired free space to leave on the disk before moving to another disk.</param>
 /// <param name="directoryMethod">the method for storing files in a directory.</param>
 /// <param name="encodingMethod">the encoding method to use for the archive file.</param>
 /// <param name="prefix">the prefix to affix to the files created.</param>
 /// <param name="pendingExtension">the extension file name</param>
 /// <param name="finalExtension">the final extension to specify</param>
 /// <param name="flags">flags to include in the archive that is created.</param>
 /// <returns></returns>
 public void ConfigureOnDisk(IEnumerable <string> paths, long desiredRemainingSpace, ArchiveDirectoryMethod directoryMethod, EncodingDefinition encodingMethod, string prefix, string pendingExtension, string finalExtension, params Guid[] flags)
 {
     TestForEditable();
     Initialize();
     DirectoryMethod  = directoryMethod;
     PendingExtension = pendingExtension;
     FinalExtension   = finalExtension;
     Flags.AddRange(flags);
     Prefix = prefix;
     WritePath.AddRange(paths);
     DesiredRemainingSpace = desiredRemainingSpace;
     EncodingMethod        = encodingMethod;
 }
 private void Initialize()
 {
     m_directoryMethod       = ArchiveDirectoryMethod.TopDirectoryOnly;
     m_isMemoryArchive       = false;
     m_prefix                = string.Empty;
     m_fileExtension         = ".d2i";
     m_desiredRemainingSpace = 5 * 1024 * 1024 * 1024L; //5GB
     m_encodingMethod        = EncodingDefinition.FixedSizeCombinedEncoding;
     m_writePath             = new ImmutableList <string>((x) =>
     {
         PathHelpers.ValidatePathName(x);
         return(x);
     });
     m_flags = new ImmutableList <Guid>();
 }
 /// <summary>
 /// Gets a database config.
 /// </summary>
 public AdvancedServerDatabaseConfig(string databaseName, string mainPath, bool supportsWriting)
 {
     m_supportsWriting           = supportsWriting;
     m_databaseName              = databaseName;
     m_mainPath                  = mainPath;
     m_intermediateFileExtension = ".d2i";
     m_finalFileExtension        = ".d2";
     m_importPaths               = new List <string>();
     m_finalWritePaths           = new List <string>();
     m_archiveEncodingMethod     = EncodingDefinition.FixedSizeCombinedEncoding;
     m_streamingEncodingMethods  = new List <EncodingDefinition>();
     m_targetFileSize            = 2 * 1024 * 1024 * 1024L;
     m_stagingCount              = 3;
     m_directoryMethod           = ArchiveDirectoryMethod.TopDirectoryOnly;
     m_diskFlushInterval         = 10000;
     m_cacheFlushInterval        = 100;
 }
Exemple #5
0
        private void FastMigration(object state)
        {
            try
            {
                long operationStartTime = DateTime.UtcNow.Ticks;
                Dictionary <string, string> parameters = state as Dictionary <string, string>;

                if ((object)parameters == null)
                {
                    throw new ArgumentNullException("state", "Could not interpret thread state as parameters dictionary");
                }

                ClearUpdateMessages();

                ShowUpdateMessage("Scanning source files...");

                if (!Directory.Exists(parameters["sourceFilesLocation"]))
                {
                    throw new DirectoryNotFoundException(string.Format("Source directory \"{0}\" not found.", parameters["sourceFilesLocation"]));
                }

                IEnumerable <string> sourceFiles = Directory.EnumerateFiles(parameters["sourceFilesLocation"], "*.d", SearchOption.TopDirectoryOnly);

                if (Directory.Exists(parameters["sourceFilesOffloadLocation"]))
                {
                    sourceFiles = sourceFiles.Concat(Directory.EnumerateFiles(parameters["sourceFilesOffloadLocation"], "*.d", SearchOption.TopDirectoryOnly));
                }

                int maxThreads, methodIndex;

                if (!int.TryParse(parameters["maxThreads"], out maxThreads))
                {
                    maxThreads = m_defaultMaxThreads;
                }

                if (!int.TryParse(parameters["directoryNamingMethod"], out methodIndex) || !Enum.IsDefined(typeof(ArchiveDirectoryMethod), methodIndex))
                {
                    methodIndex = (int)ArchiveDirectoryMethod.YearThenMonth;
                }

                ArchiveDirectoryMethod method  = (ArchiveDirectoryMethod)methodIndex;
                HistorianFileEncoding  encoder = new HistorianFileEncoding();
                string[] sourceFileNames       = sourceFiles.ToArray();
                string   destinationPath       = parameters["destinationFilesLocation"];
                string   instanceName          = parameters["instanceName"];
                bool     ignoreDuplicates      = parameters["ignoreDuplicates"].ParseBoolean();
                long     totalProcessedPoints  = 0;
                int      processedFiles        = 0;

                SetProgressMaximum(sourceFileNames.Length);

                using (StreamWriter duplicateDataOutput = File.CreateText(FilePath.GetAbsolutePath("DuplicateData.txt")))
                {
                    Parallel.ForEach(sourceFileNames, new ParallelOptions
                    {
                        MaxDegreeOfParallelism = maxThreads
                    },
                                     (sourceFileName, loopState) =>
                    {
                        ShowUpdateMessage("Migrating \"{0}\"...", FilePath.GetFileName(sourceFileName));

                        long fileConversionStartTime = DateTime.UtcNow.Ticks;
                        long migratedPoints;

                        if (ignoreDuplicates)
                        {
                            // Migrate using SortedTreeFileSimpleWriter.CreateNonSequential() with raw unsorted historian file read
                            migratedPoints = ConvertArchiveFile.ConvertVersion1FileIgnoreDuplicates(
                                sourceFileName,
                                GetDestinationFileName(sourceFileName, instanceName, destinationPath, method),
                                encoder.EncodingMethod);
                        }
                        else
                        {
                            // Migrate using SortedTreeFileSimpleWriter.Create() with API sorted historian file read with duplicate handling
                            using (GSFHistorianStream stream = new GSFHistorianStream(this, sourceFileName, instanceName, duplicateDataOutput))
                            {
                                string completeFileName = GetDestinationFileName(stream.ArchiveFile, sourceFileName, instanceName, destinationPath, method);
                                string pendingFileName  = Path.Combine(FilePath.GetDirectoryName(completeFileName), FilePath.GetFileNameWithoutExtension(completeFileName) + ".~d2i");

                                SortedTreeFileSimpleWriter <HistorianKey, HistorianValue> .Create(pendingFileName, completeFileName, 4096, null, encoder.EncodingMethod, stream);

                                migratedPoints = stream.PointCount;
                            }
                        }

                        Ticks totalTime = DateTime.UtcNow.Ticks - fileConversionStartTime;

                        ShowUpdateMessage(
                            "{0}Migrated {1:#,##0} points for last file in {2} at {3:#,##0} points per second.{0}",
                            Environment.NewLine,
                            migratedPoints,
                            totalTime.ToElapsedTimeString(3),
                            migratedPoints / totalTime.ToSeconds());

                        Interlocked.Increment(ref processedFiles);
                        Interlocked.Add(ref totalProcessedPoints, migratedPoints);

                        UpdateProgressBar(processedFiles);

                        if (m_formClosing)
                        {
                            loopState.Break();
                        }
                    });
                }

                if (m_formClosing)
                {
                    ShowUpdateMessage("Migration canceled.");
                    UpdateProgressBar(0);
                }
                else
                {
                    Ticks totalTime = DateTime.UtcNow.Ticks - operationStartTime;
                    ShowUpdateMessage("*** Migration Complete ***");
                    ShowUpdateMessage("Total migration time {0} at {1:#,##0} points per second.", totalTime.ToElapsedTimeString(3), totalProcessedPoints / totalTime.ToSeconds());
                    UpdateProgressBar(sourceFileNames.Length);
                }
            }
            catch (Exception ex)
            {
                ShowUpdateMessage("Failure during migration: {0}", ex.Message);
            }
            finally
            {
                m_operationStarted = false;
            }
        }
        private string GetDestinationFileName(ArchiveFile file, string sourceFileName, string instanceName, string destinationPath, ArchiveDirectoryMethod method)
        {
            string   destinationFileName = FilePath.GetFileNameWithoutExtension(sourceFileName) + ".d2";
            string   archiveFileName = FilePath.GetFileName(sourceFileName);
            string   archiveInstanceName = archiveFileName.Substring(0, archiveFileName.LastIndexOf("_archive", StringComparison.OrdinalIgnoreCase));
            DateTime startTime, endTime;

            // Use source archive instance name for destination database instance name if not specified
            if (string.IsNullOrEmpty(instanceName))
            {
                instanceName = archiveInstanceName;
            }

            startTime           = file.Fat.FileStartTime.ToDateTime();
            endTime             = file.Fat.FileEndTime.ToDateTime();
            destinationFileName = instanceName.ToLower() + "-" + startTime.ToString("yyyy-MM-dd HH.mm.ss.fff") + "_to_" + endTime.ToString("yyyy-MM-dd HH.mm.ss.fff") + "-" + DateTime.UtcNow.Ticks + ".d2";

            switch (method)
            {
            case ArchiveDirectoryMethod.Year:
                destinationPath = Path.Combine(destinationPath, string.Format("{0}\\", startTime.Year));
                break;

            case ArchiveDirectoryMethod.YearMonth:
                destinationPath = Path.Combine(destinationPath, string.Format("{0}{1:00}\\", startTime.Year, startTime.Month));
                break;

            case ArchiveDirectoryMethod.YearThenMonth:
                destinationPath = Path.Combine(destinationPath, string.Format("{0}\\{1:00}\\", startTime.Year, startTime.Month));
                break;
            }

            if (!Directory.Exists(destinationPath))
            {
                Directory.CreateDirectory(destinationPath);
            }

            return(Path.Combine(destinationPath, destinationFileName));
        }
 private string GetDestinationFileName(string sourceFileName, string instanceName, string destinationPath, ArchiveDirectoryMethod method)
 {
     using (ArchiveFile file = OpenArchiveFile(sourceFileName, ref instanceName))
     {
         return(GetDestinationFileName(file, sourceFileName, instanceName, destinationPath, method));
     }
 }