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; }
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; }
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); }
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); }
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(); } } } } }