Exemplo n.º 1
0
        public void SaveConfig(IReadTransactionContext tx = null)
        {
            if (_access != EFileAccess.ReadWrite)
            {
                throw new NFSdbIOException("Attempt to save partition {0} config in read-only state", DirectoryPath);
            }

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

            var config = _config;

            if (config == null)
            {
                config         = new PartitionConfig();
                config.Columns = _metadata.Settings.BuildColumns();
            }
            config.PartitionID = PartitionID;
            config.RecordHint  = tx != null?tx.GetPartitionTx(PartitionID).NextRowID : _metadata.Settings.RecordHint;

            using (var fs = File.Open(Path.Combine(DirectoryPath, PartitionSettingsFileName), FileMode.Create, FileAccess.ReadWrite))
            {
                ConfigurationSerializer.WritePartitionConfiguration(fs, config);
            }
            _config = config;
        }
Exemplo n.º 2
0
        public Partition(IJournalMetadata metadata,
                         ICompositeFileFactory memeorymMappedFileFactory,
                         EFileAccess access,
                         PartitionDate partitionDate, int partitionID,
                         string path,
                         IJournalServer journalServer,
                         PartitionConfig config = null)
        {
            _memeorymMappedFileFactory = memeorymMappedFileFactory;
            _access        = access;
            _journalServer = journalServer;
            _config        = config;
            _metadata      = metadata;

            _partitionDate = partitionDate;
            EndDate        = PartitionManagerUtils.GetPartitionEndDate(
                partitionDate.Date, partitionDate.PartitionType);
            PartitionID   = partitionID;
            DirectoryPath = path;
        }
Exemplo n.º 3
0
        public static PartitionConfig ReadPartitionConfig(string fullPath)
        {
            PartitionConfig config     = null;
            var             configPath = Path.Combine(fullPath, MetadataConstants.PartitionSettingsFileName);

            if (File.Exists(configPath))
            {
                try
                {
                    using (var fs = File.OpenRead(configPath))
                    {
                        config = ConfigurationSerializer.ReadPartitionConfiguration(fs);
                    }
                }
                catch (Exception ex)
                {
                    Trace.TraceWarning("Failed to read partiton config from {0}. Error {1}", fullPath, ex);
                }
            }
            return(config);
        }
Exemplo n.º 4
0
        private IPartition CreateNewParition(PartitionDate partitionDir, int partitionID, string fullPath, PartitionConfig config)
        {
            var newParition = new Partition(_metadata, _fileFactory, Access, partitionDir, partitionID, fullPath, _server, config);

            if (config == null && Access == EFileAccess.ReadWrite)
            {
                newParition.SaveConfig();
            }
            _allPartitions.Enqueue(newParition);
            return(newParition);
        }
Exemplo n.º 5
0
        private void ReconcilePartitionsWithTxRec(List <IPartition> partitions, TxRec txRec)
        {
            partitions.Clear();
            var defaultPath = _settings.DefaultPath;

            // Symbols are the partition 0.
            partitions.Add(null);
            var nextPartitionID = 1;

            var subDirs = LatestPartitionVersions(defaultPath);

            foreach (var subDir in subDirs)
            {
                var             fullPath     = Path.Combine(defaultPath, subDir.Name);
                var             startDate    = subDir.Date;
                var             partitionDir = subDir;
                PartitionConfig config       = PartitionManagerUtils.ReadPartitionConfig(fullPath);
                if (config != null)
                {
                    nextPartitionID = config.PartitionID;
                }

                if (txRec.IsCommited(startDate, nextPartitionID))
                {
                    var partitionID = nextPartitionID;
                    var partition   = _partitions.AddOrUpdate(startDate,
                                                              // Add.
                                                              sd =>
                    {
                        var p = new Lazy <IPartition>(() => CreateNewParition(partitionDir, partitionID, fullPath, config));
                        if (config == null && Access == EFileAccess.ReadWrite)
                        {
                            p.Value.SaveConfig();
                        }
                        return(p);
                    },
                                                              // Update.
                                                              (sd, existing) =>
                    {
                        if (existing.Value.Version == subDir.Version)
                        {
                            return(existing);
                        }
                        existing.Value.MarkOverwritten();
                        var p = new Lazy <IPartition>(() => CreateNewParition(partitionDir, partitionID, fullPath, config));
                        if (config == null && Access == EFileAccess.ReadWrite)
                        {
                            p.Value.SaveConfig();
                        }
                        return(p);
                    });


                    partitions.SetToIndex(partitionID, partition.Value);
                    nextPartitionID++;
                }
                else
                {
                    Trace.TraceInformation(
                        "Ignoring directory '{0}' for partition type '{1}' as fully rolled back partition.",
                        fullPath, _settings.PartitionType);

                    Lazy <IPartition> existingPartition;
                    if (_partitions.TryRemove(startDate, out existingPartition))
                    {
                        if (existingPartition.IsValueCreated)
                        {
                            existingPartition.Value.Dispose();
                        }
                    }
                }
            }
        }