private void HeartbeatVersion41200(TransactionOperationContext ctx, Dictionary <string, DatabaseStatusReport> nodeReport)
 {
     using (var writer = new BlittableJsonTextWriter(ctx, _tcp.Stream))
     {
         ctx.Write(writer, DynamicJsonValue.Convert(nodeReport));
     }
 }
예제 #2
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(NodeLicenseDetails)] = DynamicJsonValue.Convert(NodeLicenseDetails)
     });
 }
예제 #3
0
        public DynamicJsonValue ToJson()
        {
            return(new DynamicJsonValue
            {
                [nameof(Name)] = Name,
                [nameof(Disabled)] = Disabled,
                [nameof(TotalSize)] = new DynamicJsonValue
                {
                    [nameof(Size.HumaneSize)] = TotalSize.HumaneSize,
                    [nameof(Size.SizeInBytes)] = TotalSize.SizeInBytes
                },

                [nameof(IsAdmin)] = IsAdmin,
                [nameof(IsEncrypted)] = IsEncrypted,
                [nameof(UpTime)] = UpTime?.ToString(),
                [nameof(BackupInfo)] = BackupInfo?.ToJson(),

                [nameof(Alerts)] = Alerts,
                [nameof(RejectClients)] = false,
                [nameof(IndexingErrors)] = IndexingErrors,

                [nameof(DocumentsCount)] = DocumentsCount,
                [nameof(HasRevisionsConfiguration)] = HasRevisionsConfiguration,
                [nameof(HasExpirationConfiguration)] = HasExpirationConfiguration,
                [nameof(IndexesCount)] = IndexesCount,
                [nameof(IndexingStatus)] = IndexingStatus.ToString(),

                [nameof(NodesTopology)] = NodesTopology?.ToJson(),
                [nameof(ReplicationFactor)] = ReplicationFactor,
                [nameof(DynamicNodesDistribution)] = DynamicNodesDistribution,
                [nameof(DeletionInProgress)] = DynamicJsonValue.Convert(DeletionInProgress)
            });
        }
        public long EnvironmentsHash;  // this is local, so we don't serialize it

        public DynamicJsonValue ToJson()
        {
            var dynamicJsonValue = new DynamicJsonValue
            {
                [nameof(Name)]                            = Name,
                [nameof(NodeName)]                        = NodeName,
                [nameof(Status)]                          = Status,
                [nameof(LastEtag)]                        = LastEtag,
                [nameof(LastTombstoneEtag)]               = LastTombstoneEtag,
                [nameof(NumberOfConflicts)]               = NumberOfConflicts,
                [nameof(NumberOfDocuments)]               = NumberOfDocuments,
                [nameof(DatabaseChangeVector)]            = DatabaseChangeVector,
                [nameof(LastCompletedClusterTransaction)] = LastCompletedClusterTransaction,
                [nameof(LastSentEtag)]                    = DynamicJsonValue.Convert(LastSentEtag),
                [nameof(Error)]                           = Error,
                [nameof(UpTime)]                          = UpTime
            };
            var indexStats = new DynamicJsonValue();

            foreach (var stat in LastIndexStats)
            {
                indexStats[stat.Key] = new DynamicJsonValue
                {
                    [nameof(stat.Value.LastIndexedEtag)] = stat.Value.LastIndexedEtag,
                    [nameof(stat.Value.LastQueried)]     = stat.Value.LastQueried,
                    [nameof(stat.Value.IsSideBySide)]    = stat.Value.IsSideBySide,
                    [nameof(stat.Value.IsStale)]         = stat.Value.IsStale,
                    [nameof(stat.Value.State)]           = stat.Value.State
                };
            }
            dynamicJsonValue[nameof(LastIndexStats)] = indexStats;

            return(dynamicJsonValue);
        }
예제 #5
0
        public Task GetClusterTopology()
        {
            using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (context.OpenReadTransaction())
                {
                    var topology = ServerStore.GetClusterTopology(context);
                    var nodeTag  = ServerStore.NodeTag;

                    if (topology.Members.Count == 0)
                    {
                        var tag       = ServerStore.NodeTag ?? "A";
                        var serverUrl = ServerStore.NodeHttpServerUrl;

                        topology = new ClusterTopology(
                            "dummy",
                            new Dictionary <string, string>
                        {
                            [tag] = serverUrl
                        },
                            new Dictionary <string, string>(),
                            new Dictionary <string, string>(),
                            tag
                            );
                        nodeTag = tag;
                    }

                    HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;

                    using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                    {
                        var loadLicenseLimits  = ServerStore.LoadLicenseLimits();
                        var nodeLicenseDetails = loadLicenseLimits == null ?
                                                 null : DynamicJsonValue.Convert(loadLicenseLimits.NodeLicenseDetails);
                        var json = new DynamicJsonValue
                        {
                            ["Topology"]           = topology.ToSortedJson(),
                            ["Leader"]             = ServerStore.LeaderTag,
                            ["CurrentState"]       = ServerStore.CurrentRachisState,
                            ["NodeTag"]            = nodeTag,
                            ["CurrentTerm"]        = ServerStore.Engine.CurrentTerm,
                            ["NodeLicenseDetails"] = nodeLicenseDetails,
                            [nameof(ServerStore.Engine.LastStateChangeReason)] = ServerStore.LastStateChangeReason()
                        };
                        var clusterErrors = ServerStore.GetClusterErrors();
                        if (clusterErrors.Count > 0)
                        {
                            json["Errors"] = clusterErrors;
                        }

                        var nodesStatues = ServerStore.GetNodesStatuses();
                        json["Status"] = DynamicJsonValue.Convert(nodesStatues);

                        context.Write(writer, json);
                        writer.Flush();
                    }
                }

            return(Task.CompletedTask);
        }
예제 #6
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue(GetType())
     {
         [nameof(Message)] = Message,
         [nameof(MigrationResult.PerCollectionCount)] = DynamicJsonValue.Convert(_result.PerCollectionCount)
     });
 }
예제 #7
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Email)] = Email,
         [nameof(Domains)] = DynamicJsonValue.Convert(Domains)
     });
 }
예제 #8
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(ServerReport)] = ServerReport,
         [nameof(DatabasesReport)] = DynamicJsonValue.Convert(DatabasesReport)
     });
 }
예제 #9
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Unmergables)] = DynamicJsonValue.Convert(Unmergables),
         [nameof(Suggestions)] = new DynamicJsonArray(Suggestions.Select(x => x.ToJson()))
     });
 }
예제 #10
0
        public override DynamicJsonValue ToJson(JsonOperationContext context)
        {
            var djv = base.ToJson(context);

            djv[nameof(ClusterTransactionsCleanup)] = DynamicJsonValue.Convert(ClusterTransactionsCleanup);

            return(djv);
        }
예제 #11
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(ActiveDeployments)] = DynamicJsonValue.Convert(ActiveDeployments),
         [nameof(RaftCommandIndex)] = RaftCommandIndex
     });
 }
예제 #12
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Members)] = new DynamicJsonArray(Members.Select(x => x.ToJson())),
         [nameof(Promotables)] = new DynamicJsonArray(Promotables.Select(x => x.ToJson())),
         [nameof(Rehabs)] = new DynamicJsonArray(Rehabs.Select(x => x.ToJson())),
         [nameof(Status)] = DynamicJsonValue.Convert(Status)
     });
 }
예제 #13
0
 public virtual DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Message)] = Message,
         [nameof(ScannedRevisions)] = ScannedRevisions,
         [nameof(ScannedDocuments)] = ScannedDocuments,
         [nameof(Warnings)] = DynamicJsonValue.Convert(Warnings)
     });
 }
예제 #14
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(TopologyId)] = TopologyId,
         [nameof(Members)] = DynamicJsonValue.Convert(Members),
         [nameof(Promotables)] = DynamicJsonValue.Convert(Promotables),
         [nameof(Watchers)] = DynamicJsonValue.Convert(Watchers),
         [nameof(LastNodeId)] = LastNodeId
     });
 }
예제 #15
0
        public DynamicJsonValue ToJson()
        {
            _sw.Stop();

            return(new DynamicJsonValue(GetType())
            {
                [nameof(PerCollectionCount)] = DynamicJsonValue.Convert(PerCollectionCount),
                [nameof(Messages)] = Messages,
                [nameof(Elapsed)] = Elapsed
            });
        }
예제 #16
0
 public DynamicJsonValue ToSortedJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(TopologyId)] = TopologyId,
         [nameof(AllNodes)] = DynamicJsonValue.Convert(new SortedDictionary <string, string>(AllNodes)),
         [nameof(Members)] = DynamicJsonValue.Convert(new SortedDictionary <string, string>(Members)),
         [nameof(Promotables)] = DynamicJsonValue.Convert(new SortedDictionary <string, string>(Promotables)),
         [nameof(Watchers)] = DynamicJsonValue.Convert(new SortedDictionary <string, string>(Watchers)),
         [nameof(LastNodeId)] = LastNodeId
     });
 }
예제 #17
0
        public override DynamicJsonValue ToJson()
        {
            var json = base.ToJson();

            json[nameof(Topology)]    = Topology.ToJson();
            json[nameof(Leader)]      = Leader;
            json[nameof(NodeTag)]     = NodeTag;
            json[nameof(Status)]      = DynamicJsonValue.Convert(Status);
            json[nameof(CurrentTerm)] = CurrentTerm;

            return(json);
        }
예제 #18
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Report)] = DynamicJsonValue.Convert(Report),
         [nameof(LastGoodDatabaseStatus)] = DynamicJsonValue.Convert(LastGoodDatabaseStatus),
         [nameof(Status)] = Status,
         [nameof(Error)] = Error?.ToString(),
         [nameof(UpdateDateTime)] = UpdateDateTime,
         [nameof(LastSuccessfulUpdateDateTime)] = LastSuccessfulUpdateDateTime
     });
 }
예제 #19
0
 public override DynamicJsonValue ToJson(JsonOperationContext context)
 {
     return(new DynamicJsonValue
     {
         ["Type"] = nameof(AddDatabaseCommand),
         [nameof(Name)] = Name,
         [nameof(Record)] = EntityToBlittable.ConvertCommandToBlittable(Record, context),
         [nameof(RaftCommandIndex)] = RaftCommandIndex,
         [nameof(Encrypted)] = Encrypted,
         [nameof(DatabaseValues)] = DynamicJsonValue.Convert(DatabaseValues),
         [nameof(IsRestore)] = IsRestore
     });
 }
예제 #20
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Members)] = new DynamicJsonArray(Members),
         [nameof(Promotables)] = new DynamicJsonArray(Promotables),
         [nameof(Rehabs)] = new DynamicJsonArray(Rehabs),
         [nameof(Stamp)] = Stamp.ToJson(),
         [nameof(PromotablesStatus)] = DynamicJsonValue.Convert(PromotablesStatus),
         [nameof(DemotionReasons)] = DynamicJsonValue.Convert(DemotionReasons),
         [nameof(DynamicNodesDistribution)] = DynamicNodesDistribution,
         [nameof(ReplicationFactor)] = ReplicationFactor
     });
 }
예제 #21
0
 public override void FillJson(DynamicJsonValue json)
 {
     json[nameof(HardDelete)]              = HardDelete;
     json[nameof(RaftCommandIndex)]        = RaftCommandIndex;
     json[nameof(UpdateReplicationFactor)] = UpdateReplicationFactor;
     if (FromNodes != null)
     {
         json[nameof(FromNodes)] = new DynamicJsonArray(FromNodes);
     }
     if (MentorChangeVector != null)
     {
         json[nameof(MentorChangeVector)] = DynamicJsonValue.Convert(MentorChangeVector);
     }
 }
예제 #22
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(License)] = License.ToJson(),
         [nameof(Email)] = Email,
         [nameof(Domain)] = Domain,
         [nameof(ModifyLocalServer)] = ModifyLocalServer,
         [nameof(RegisterClientCert)] = RegisterClientCert,
         [nameof(Certificate)] = Certificate,
         [nameof(Password)] = Password,
         [nameof(NodeSetupInfos)] = DynamicJsonValue.Convert(NodeSetupInfos)
     });
 }
예제 #23
0
        public virtual DynamicJsonValue ToJson()
        {
            DynamicJsonValue certs = null;

            if (Certificates != null)
            {
                certs = DynamicJsonValue.Convert(Certificates);
            }
            return(new DynamicJsonValue
            {
                [nameof(Name)] = Name,
                [nameof(Certificates)] = certs,
                [nameof(TaskId)] = TaskId,
                [nameof(Disabled)] = Disabled
            });
        }
        public DynamicJsonValue ToJson()
        {
            return(new DynamicJsonValue
            {
                [nameof(Name)] = Name,
#pragma warning disable CS0618 // Type or member is obsolete
                [nameof(Certificates)] = DynamicJsonValue.Convert(Certificates),
#pragma warning restore CS0618 // Type or member is obsolete
                [nameof(TaskId)] = TaskId,
                [nameof(Disabled)] = Disabled,
                [nameof(MentorNode)] = MentorNode,
                [nameof(DelayReplicationFor)] = DelayReplicationFor,
                [nameof(Mode)] = Mode,
                [nameof(WithFiltering)] = WithFiltering
            });
        }
예제 #25
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(Members)] = new DynamicJsonArray(Members),
         [nameof(Promotables)] = new DynamicJsonArray(Promotables),
         [nameof(Rehabs)] = new DynamicJsonArray(Rehabs),
         [nameof(Stamp)] = Stamp?.ToJson(),
         [nameof(PromotablesStatus)] = DynamicJsonValue.Convert(PromotablesStatus),
         [nameof(DemotionReasons)] = DynamicJsonValue.Convert(DemotionReasons),
         [nameof(DynamicNodesDistribution)] = DynamicNodesDistribution,
         [nameof(ReplicationFactor)] = ReplicationFactor,
         [nameof(DatabaseTopologyIdBase64)] = DatabaseTopologyIdBase64,
         [nameof(PriorityOrder)] = PriorityOrder != null ? new DynamicJsonArray(PriorityOrder) : null
     });
 }
예제 #26
0
        public void CollectDatabasesStatusReport()
        {
            var lastNodeReport = new Dictionary <string, DatabaseStatusReport>();

            while (_token.IsCancellationRequested == false)
            {
                try
                {
                    using (_server.ContextPool.AllocateOperationContext(out TransactionOperationContext ctx))
                    {
                        Dictionary <string, DatabaseStatusReport> nodeReport;
                        using (ctx.OpenReadTransaction())
                        {
                            nodeReport = CollectDatabaseInformation(ctx, lastNodeReport);
                        }

                        using (var writer = new BlittableJsonTextWriter(ctx, _tcp.Stream))
                        {
                            ctx.Write(writer, DynamicJsonValue.Convert(nodeReport));
                        }

                        lastNodeReport = nodeReport;
                    }
                }
                catch (Exception e)
                {
                    if (_tcp.TcpClient?.Connected != true)
                    {
                        if (_logger.IsInfoEnabled)
                        {
                            _logger.Info("The tcp connection was closed, so we exit the maintenance work.");
                        }
                        return;
                    }
                    if (_logger.IsInfoEnabled)
                    {
                        _logger.Info($"Exception occurred while collecting info from {_server.NodeTag}", e);
                    }
                }
                finally
                {
                    _token.WaitHandle.WaitOne(WorkerSamplePeriod);
                }
            }
        }
예제 #27
0
 public DynamicJsonValue ToJson()
 {
     return(new DynamicJsonValue
     {
         [nameof(EnableExperimentalFeatures)] = EnableExperimentalFeatures,
         [nameof(Environment)] = Environment,
         [nameof(License)] = License.ToJson(),
         [nameof(Email)] = Email,
         [nameof(Domain)] = Domain,
         [nameof(RootDomain)] = RootDomain,
         [nameof(ModifyLocalServer)] = ModifyLocalServer,
         [nameof(RegisterClientCert)] = RegisterClientCert,
         [nameof(ClientCertNotAfter)] = ClientCertNotAfter,
         [nameof(Certificate)] = Certificate,
         [nameof(Password)] = Password,
         [nameof(NodeSetupInfos)] = DynamicJsonValue.Convert(NodeSetupInfos)
     });
 }
예제 #28
0
 public Task ClusterMaintenanceStats()
 {
     if (ServerStore.LeaderTag == null)
     {
         return(Task.CompletedTask);
     }
     using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
         using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
         {
             if (ServerStore.IsLeader())
             {
                 context.Write(writer, DynamicJsonValue.Convert(ServerStore.ClusterMaintenanceSupervisor?.GetStats()));
                 writer.Flush();
                 return(Task.CompletedTask);
             }
             RedirectToLeader();
         }
     return(Task.CompletedTask);
 }
예제 #29
0
        public DynamicJsonValue ToJson()
        {
            var json = new DynamicJsonValue
            {
                [nameof(Collections)]          = DynamicJsonValue.Convert(Collections),
                [nameof(PolicyCheckFrequency)] = PolicyCheckFrequency,
            };

            if (NamedValues != null)
            {
                var djv = new DynamicJsonValue();
                foreach (var collection in NamedValues)
                {
                    djv[collection.Key] = DynamicJsonValue.Convert(collection.Value);
                }

                json[nameof(NamedValues)] = djv;
            }

            return(json);
        }
예제 #30
0
        private void WriteDatabaseInfo(string databaseName, BlittableJsonReaderObject dbRecordBlittable,
                                       TransactionOperationContext context, AbstractBlittableJsonTextWriter writer)
        {
            try
            {
                var online = ServerStore.DatabasesLandlord.DatabasesCache.TryGetValue(databaseName, out Task <DocumentDatabase> dbTask) &&
                             dbTask != null &&
                             dbTask.IsCompleted;

                // Check for exceptions
                if (dbTask != null && dbTask.IsFaulted)
                {
                    var exception = dbTask.Exception.ExtractSingleInnerException();
                    WriteFaultedDatabaseInfo(databaseName, exception, context, writer);
                    return;
                }

                var dbRecord = JsonDeserializationCluster.DatabaseRecord(dbRecordBlittable);
                var db       = online ? dbTask.Result : null;

                var indexingStatus = db?.IndexStore?.Status ?? IndexRunningStatus.Running;
                // Looking for disabled indexing flag inside the database settings for offline database status
                if (dbRecord.Settings.TryGetValue(RavenConfiguration.GetKey(x => x.Indexing.Disabled), out var val) && bool.TryParse(val, out var indexingDisabled) && indexingDisabled)
                {
                    indexingStatus = IndexRunningStatus.Disabled;
                }

                var disabled        = dbRecord.Disabled;
                var topology        = dbRecord.Topology;
                var clusterTopology = ServerStore.GetClusterTopology(context);
                clusterTopology.ReplaceCurrentNodeUrlWithClientRequestedNodeUrlIfNecessary(ServerStore, HttpContext);

                var studioEnvironment = StudioConfiguration.StudioEnvironment.None;
                if (dbRecord.Studio != null && !dbRecord.Studio.Disabled)
                {
                    studioEnvironment = dbRecord.Studio.Environment;
                }

                var nodesTopology = new NodesTopology();

                var statuses = ServerStore.GetNodesStatuses();
                if (topology != null)
                {
                    foreach (var member in topology.Members)
                    {
                        var url  = clusterTopology.GetUrlFromTag(member);
                        var node = new InternalReplication
                        {
                            Database = databaseName,
                            NodeTag  = member,
                            Url      = url
                        };
                        nodesTopology.Members.Add(GetNodeId(node));
                        SetNodeStatus(topology, member, nodesTopology, statuses);
                    }

                    foreach (var promotable in topology.Promotables)
                    {
                        topology.PredefinedMentors.TryGetValue(promotable, out var mentorCandidate);
                        var node   = GetNode(databaseName, clusterTopology, promotable, mentorCandidate, out var promotableTask);
                        var mentor = topology.WhoseTaskIsIt(ServerStore.Engine.CurrentState, promotableTask, null);
                        nodesTopology.Promotables.Add(GetNodeId(node, mentor));
                        SetNodeStatus(topology, promotable, nodesTopology, statuses);
                    }

                    foreach (var rehab in topology.Rehabs)
                    {
                        var node   = GetNode(databaseName, clusterTopology, rehab, null, out var promotableTask);
                        var mentor = topology.WhoseTaskIsIt(ServerStore.Engine.CurrentState, promotableTask, null);
                        nodesTopology.Rehabs.Add(GetNodeId(node, mentor));
                        SetNodeStatus(topology, rehab, nodesTopology, statuses);
                    }
                }

                if (online == false)
                {
                    // if state of database is found in the cache we can continue
                    if (ServerStore.DatabaseInfoCache.TryGet(databaseName, databaseInfoJson =>
                    {
                        databaseInfoJson.Modifications = new DynamicJsonValue(databaseInfoJson)
                        {
                            [nameof(DatabaseInfo.Disabled)] = disabled,
                            [nameof(DatabaseInfo.IndexingStatus)] = indexingStatus.ToString(),
                            [nameof(DatabaseInfo.NodesTopology)] = nodesTopology.ToJson(),
                            [nameof(DatabaseInfo.DeletionInProgress)] = DynamicJsonValue.Convert(dbRecord.DeletionInProgress),
                            [nameof(DatabaseInfo.Environment)] = studioEnvironment
                        };

                        context.Write(writer, databaseInfoJson);
                    }))
                    {
                        return;
                    }

                    // we won't find it if it is a new database or after a dirty shutdown,
                    // so just report empty values then
                }

                var size = db?.GetSizeOnDisk() ?? (new Size(0), new Size(0));

                var databaseInfo = new DatabaseInfo
                {
                    Name            = databaseName,
                    Disabled        = disabled,
                    TotalSize       = size.Data,
                    TempBuffersSize = size.TempBuffers,

                    IsAdmin     = true,
                    IsEncrypted = dbRecord.Encrypted,
                    UpTime      = online ? (TimeSpan?)GetUptime(db) : null,
                    BackupInfo  = GetBackupInfo(db),

                    Alerts         = db?.NotificationCenter.GetAlertCount() ?? 0,
                    RejectClients  = false,
                    LoadError      = null,
                    IndexingErrors = db?.IndexStore?.GetIndexes()?.Sum(index => index.GetErrorCount()) ?? 0,

                    DocumentsCount             = db?.DocumentsStorage.GetNumberOfDocuments() ?? 0,
                    HasRevisionsConfiguration  = db?.DocumentsStorage.RevisionsStorage.Configuration != null,
                    HasExpirationConfiguration = db?.ExpiredDocumentsCleaner != null,
                    IndexesCount   = db?.IndexStore?.GetIndexes()?.Count() ?? 0,
                    IndexingStatus = indexingStatus,
                    Environment    = studioEnvironment,

                    NodesTopology            = nodesTopology,
                    ReplicationFactor        = topology?.ReplicationFactor ?? -1,
                    DynamicNodesDistribution = topology?.DynamicNodesDistribution ?? false,
                    DeletionInProgress       = dbRecord.DeletionInProgress
                };

                var doc = databaseInfo.ToJson();
                context.Write(writer, doc);
            }
            catch (Exception e)
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info($"Failed to get database info for: {databaseName}", e);
                }

                WriteFaultedDatabaseInfo(databaseName, e, context, writer);
            }
        }