public IDisposable Initialize(DatabaseSmugglerOptions options, SmugglerResult result, out long buildVersion) { _currentTypeIndex = 0; if (options.OperateOnTypes.HasFlag(DatabaseItemType.Documents) || options.OperateOnTypes.HasFlag(DatabaseItemType.RevisionDocuments) || options.OperateOnTypes.HasFlag(DatabaseItemType.Tombstones) || options.OperateOnTypes.HasFlag(DatabaseItemType.Conflicts) || options.OperateOnTypes.HasFlag(DatabaseItemType.Counters)) { _returnContext = _database.DocumentsStorage.ContextPool.AllocateOperationContext(out _context); _disposeTransaction = _context.OpenReadTransaction(); LastEtag = DocumentsStorage.ReadLastEtag(_disposeTransaction.InnerTransaction); } if (options.OperateOnTypes.HasFlag(DatabaseItemType.CompareExchange) || options.OperateOnTypes.HasFlag(DatabaseItemType.Identities)) { _returnServerContext = _database.ServerStore.ContextPool.AllocateOperationContext(out _serverContext); _disposeServerTransaction = _serverContext.OpenReadTransaction(); } buildVersion = ServerVersion.Build; return(new DisposableAction(() => { _disposeServerTransaction?.Dispose(); _returnServerContext?.Dispose(); _disposeTransaction?.Dispose(); _returnContext?.Dispose(); })); }
public void Dispose() { _documentsTx?.Dispose(); _documentsTx = null; _serverTx?.Dispose(); _serverTx = null; }
public static FacetQuery Create(DocumentsOperationContext context, IndexQueryServerSide query) { long?facetsEtag = null; DocumentsTransaction tx = null; try { var facets = new Dictionary <string, FacetSetup>(StringComparer.OrdinalIgnoreCase); foreach (var selectField in query.Metadata.SelectFields) { if (selectField.IsFacet == false) { continue; } var facetField = (FacetField)selectField; if (facetField.FacetSetupDocumentId == null || facets.ContainsKey(facetField.FacetSetupDocumentId)) { continue; } if (tx == null) { tx = context.OpenReadTransaction(); } var documentJson = context.DocumentDatabase.DocumentsStorage.Get(context, facetField.FacetSetupDocumentId); if (documentJson == null) { throw new DocumentDoesNotExistException(facetField.FacetSetupDocumentId); } if (facetsEtag.HasValue == false) { facetsEtag = documentJson.Etag; } else { facetsEtag = facetsEtag.Value ^ documentJson.Etag; } var document = FacetSetup.Create(facetField.FacetSetupDocumentId, documentJson.Data); facets[facetField.FacetSetupDocumentId] = document; } return(new FacetQuery(query, facets, facetsEtag ?? 0) { Legacy = string.IsNullOrEmpty(query.ClientVersion) == false && query.ClientVersion[0] == '4' }); } finally { tx?.Dispose(); } }
public static FacetQuery Create(DocumentsOperationContext context, IndexQueryServerSide query) { long?facetsEtag = null; DocumentsTransaction tx = null; try { var facets = new Dictionary <string, FacetSetup>(StringComparer.OrdinalIgnoreCase); foreach (var selectField in query.Metadata.SelectFields) { if (selectField.IsFacet == false) { continue; } var facetField = (FacetField)selectField; if (facetField.FacetSetupDocumentId == null || facets.ContainsKey(facetField.FacetSetupDocumentId)) { continue; } if (tx == null) { tx = context.OpenReadTransaction(); } var documentJson = context.DocumentDatabase.DocumentsStorage.Get(context, facetField.FacetSetupDocumentId); if (documentJson == null) { throw new DocumentDoesNotExistException(facetField.FacetSetupDocumentId); } if (facetsEtag.HasValue == false) { facetsEtag = documentJson.Etag; } else { facetsEtag = facetsEtag.Value ^ documentJson.Etag; } var document = (FacetSetup)EntityToBlittable.ConvertToEntity(typeof(FacetSetup), facetField.FacetSetupDocumentId, documentJson.Data, DocumentConventions.DefaultForServer); facets[facetField.FacetSetupDocumentId] = document; } return(new FacetQuery(query, facets, facetsEtag ?? 0)); } finally { tx?.Dispose(); } }
public Task <SmugglerInitializeResult> InitializeAsync(DatabaseSmugglerOptionsServerSide options, SmugglerResult result) { _currentTypeIndex = 0; if (options.OperateOnTypes.HasFlag(DatabaseItemType.Documents) || options.OperateOnTypes.HasFlag(DatabaseItemType.RevisionDocuments) || options.OperateOnTypes.HasFlag(DatabaseItemType.Tombstones) || options.OperateOnTypes.HasFlag(DatabaseItemType.Conflicts) || options.OperateOnTypes.HasFlag(DatabaseItemType.CounterGroups) || options.OperateOnTypes.HasFlag(DatabaseItemType.TimeSeries)) { _returnContext = _database.DocumentsStorage.ContextPool.AllocateOperationContext(out _context); _disposeTransaction = _context.OpenReadTransaction(); LastEtag = DocumentsStorage.ReadLastEtag(_disposeTransaction.InnerTransaction); LastDatabaseChangeVector = DocumentsStorage.GetDatabaseChangeVector(_disposeTransaction.InnerTransaction); } if (options.OperateOnTypes.HasFlag(DatabaseItemType.CompareExchange) || options.OperateOnTypes.HasFlag(DatabaseItemType.Identities) || options.OperateOnTypes.HasFlag(DatabaseItemType.CompareExchangeTombstones) || options.OperateOnTypes.HasFlag(DatabaseItemType.Subscriptions) || options.OperateOnTypes.HasFlag(DatabaseItemType.ReplicationHubCertificates)) { _returnServerContext = _database.ServerStore.ContextPool.AllocateOperationContext(out _serverContext); _disposeServerTransaction = _serverContext.OpenReadTransaction(); using (var rawRecord = _database.ServerStore.Cluster.ReadRawDatabaseRecord(_serverContext, _database.Name)) { LastRaftIndex = rawRecord.EtagForBackup; } } var disposable = new DisposableAction(() => { _disposeServerTransaction?.Dispose(); _returnServerContext?.Dispose(); _disposeTransaction?.Dispose(); _returnContext?.Dispose(); }); return(Task.FromResult(new SmugglerInitializeResult(disposable, ServerVersion.Build))); }
public IDisposable Initialize(DatabaseSmugglerOptions options, SmugglerResult result, out long buildVersion) { _currentTypeIndex = 0; if (options.OperateOnTypes.HasFlag(DatabaseItemType.Documents) || options.OperateOnTypes.HasFlag(DatabaseItemType.RevisionDocuments) || options.OperateOnTypes.HasFlag(DatabaseItemType.Tombstones) || options.OperateOnTypes.HasFlag(DatabaseItemType.Conflicts) || options.OperateOnTypes.HasFlag(DatabaseItemType.CounterGroups)) { _returnContext = _database.DocumentsStorage.ContextPool.AllocateOperationContext(out _context); _disposeTransaction = _context.OpenReadTransaction(); LastEtag = DocumentsStorage.ReadLastEtag(_disposeTransaction.InnerTransaction); LastDatabaseChangeVector = DocumentsStorage.GetDatabaseChangeVector(_disposeTransaction.InnerTransaction); } if (options.OperateOnTypes.HasFlag(DatabaseItemType.CompareExchange) || options.OperateOnTypes.HasFlag(DatabaseItemType.Identities) || options.OperateOnTypes.HasFlag(DatabaseItemType.CompareExchangeTombstones)) { _returnServerContext = _database.ServerStore.ContextPool.AllocateOperationContext(out _serverContext); _disposeServerTransaction = _serverContext.OpenReadTransaction(); using (var rawRecord = _database.ServerStore.Cluster.ReadRawDatabaseRecord(_serverContext, _database.Name)) { LastRaftIndex = rawRecord.GetEtagForBackup(); } } buildVersion = ServerVersion.Build; return(new DisposableAction(() => { _disposeServerTransaction?.Dispose(); _returnServerContext?.Dispose(); _disposeTransaction?.Dispose(); _returnContext?.Dispose(); })); }
private long CreateLocalBackupOrSnapshot( PeriodicBackupStatus status, string backupFilePath, long?startDocumentEtag, DocumentsOperationContext context, DocumentsTransaction tx, Action <IOperationProgress> onProgress) { long lastEtag; using (status.LocalBackup.UpdateStats(_isFullBackup)) { try { // will rename the file after the backup is finished var tempBackupFilePath = backupFilePath + InProgressExtension; if (_configuration.BackupType == BackupType.Backup || _configuration.BackupType == BackupType.Snapshot && _isFullBackup == false) { var backupType = _configuration.BackupType == BackupType.Snapshot ? "snapshot " : string.Empty; AddInfo($"Started an incremental {backupType}backup", onProgress); // smuggler backup var options = new DatabaseSmugglerOptionsServerSide { AuthorizationStatus = AuthorizationStatus.DatabaseAdmin, }; if (_isFullBackup == false) { options.OperateOnTypes |= DatabaseItemType.Tombstones; } CreateBackup(options, tempBackupFilePath, startDocumentEtag, context, onProgress); lastEtag = _isFullBackup ? DocumentsStorage.ReadLastEtag(tx.InnerTransaction) : _backupResult.GetLastEtag(); } else { // snapshot backup AddInfo("Started a snapshot backup", onProgress); lastEtag = DocumentsStorage.ReadLastEtag(tx.InnerTransaction); var indexesCount = _database.IndexStore.Count; var totalSw = Stopwatch.StartNew(); var sw = Stopwatch.StartNew(); var smugglerResult = _database.FullBackupTo(tempBackupFilePath, info => { AddInfo(info.Message, onProgress); _backupResult.SnapshotBackup.ReadCount += info.FilesCount; if (sw.ElapsedMilliseconds > 0 && info.FilesCount > 0) { AddInfo($"Backed up {_backupResult.SnapshotBackup.ReadCount} " + $"file{(_backupResult.SnapshotBackup.ReadCount > 1 ? "s" : string.Empty)}", onProgress); sw.Restart(); } }, TaskCancelToken.Token); EnsureSnapshotProcessed(context, smugglerResult, indexesCount); AddInfo($"Backed up {_backupResult.SnapshotBackup.ReadCount} files, " + $"took: {totalSw.ElapsedMilliseconds:#,#;;0}ms", onProgress); } IOExtensions.RenameFile(tempBackupFilePath, backupFilePath); } catch (Exception e) { status.LocalBackup.Exception = e.ToString(); throw; } } return(lastEtag); }
private long CreateLocalBackupOrSnapshot(PeriodicBackupConfiguration configuration, bool isFullBackup, PeriodicBackupStatus status, string backupFilePath, long?startDocumentEtag, DocumentsOperationContext context, DocumentsTransaction tx) { long lastEtag; using (status.LocalBackup.UpdateStats(isFullBackup)) { try { if (configuration.BackupType == BackupType.Backup || configuration.BackupType == BackupType.Snapshot && isFullBackup == false) { // smuggler backup var options = new DatabaseSmugglerOptionsServerSide(); if (isFullBackup == false) { options.OperateOnTypes |= DatabaseItemType.Tombstones; } var result = CreateBackup(options, backupFilePath, startDocumentEtag, context); lastEtag = result.GetLastEtag(); } else { // snapshot backup lastEtag = DocumentsStorage.ReadLastEtag(tx.InnerTransaction); _database.FullBackupTo(backupFilePath); } } catch (Exception e) { status.LocalBackup.Exception = e; throw; } } return(lastEtag); }
public DisposeTransactions(DocumentsTransaction documentsTx, RavenTransaction serverTx) { _documentsTx = documentsTx; _serverTx = serverTx; }