Exemple #1
0
        private void WriteScavengeIndexInitializedEvent()
        {
            var metadataEventId = Guid.NewGuid();
            var metaStreamId    = SystemStreams.MetastreamOf(SystemStreams.ScavengesStream);
            var metadata        = new StreamMetadata(maxAge: TimeSpan.FromDays(_scavengeHistoryMaxAge));
            var metaStreamEvent = new Event(metadataEventId, SystemEventTypes.StreamMetadata, isJson: true,
                                            data: metadata.ToJsonBytes(), metadata: null);

            _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent, SystemAccount.Principal, m => {
                if (m.Result != OperationResult.Success)
                {
                    Log.Error("Failed to write the $maxAge of {0} days metadata for the {1} stream. Reason: {2}", _scavengeHistoryMaxAge, SystemStreams.ScavengesStream, m.Result);
                }
            });

            var indexInitializedEvent = new Event(Guid.NewGuid(), SystemEventTypes.ScavengeIndexInitialized,
                                                  true, new Dictionary <string, object> {
            }.ToJsonBytes(), null);

            _ioDispatcher.WriteEvent(SystemStreams.ScavengesStream, ExpectedVersion.NoStream, indexInitializedEvent, SystemAccount.Principal, m => {
                if (m.Result != OperationResult.Success)
                {
                    Log.Error("Failed to write the {0} event to the {1} stream. Reason: {2}", SystemEventTypes.ScavengeIndexInitialized, SystemStreams.ScavengesStream, m.Result);
                }
            });
        }
Exemple #2
0
        public void ScavengeStarted()
        {
            var metadataEventId = Guid.NewGuid();
            var metaStreamId    = SystemStreams.MetastreamOf(_streamName);
            var metadata        = new StreamMetadata(maxAge: _scavengeHistoryMaxAge);
            var metaStreamEvent = new Event(metadataEventId, SystemEventTypes.StreamMetadata, isJson: true,
                                            data: metadata.ToJsonBytes(), metadata: null);

            _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent, SystemAccount.Principal, m => {
                if (m.Result != OperationResult.Success)
                {
                    Log.Error(
                        "Failed to write the $maxAge of {days} days metadata for the {stream} stream. Reason: {reason}",
                        _scavengeHistoryMaxAge.TotalDays, _streamName, m.Result);
                }
            });

            var scavengeStartedEvent = new Event(Guid.NewGuid(), SystemEventTypes.ScavengeStarted, true,
                                                 new Dictionary <string, object> {
                { "scavengeId", _scavengeId },
                { "nodeEndpoint", _nodeId },
            }.ToJsonBytes(), null);

            WriteScavengeDetailEvent(_streamName, scavengeStartedEvent, _retryAttempts);
        }
Exemple #3
0
 private static void UpdateStreamAclWithRetry(
     this IODispatcher ioDispatcher,
     CancellationScope cancellationScope,
     string streamId,
     long expectedVersion,
     ClaimsPrincipal principal,
     StreamMetadata metadata,
     Action <ClientMessage.WriteEventsCompleted> handler,
     IEnumerator <Step> steps)
 {
     PerformWithRetry(
         ioDispatcher,
         handler,
         steps,
         expectedVersion == ExpectedVersion.Any,
         TimeSpan.FromMilliseconds(100),
         action =>
         cancellationScope.Register(
             ioDispatcher.WriteEvents(
                 SystemStreams.MetastreamOf(streamId),
                 expectedVersion,
                 new[] {
         new Event(Guid.NewGuid(), SystemEventTypes.StreamMetadata, true, metadata.ToJsonBytes(),
                   null)
     },
                 principal,
                 response => {
         if (cancellationScope.Cancelled(response.CorrelationId))
         {
             return;
         }
         action(response, response.Result);
     })));
 }
        private Event CreateStreamMetadataEvent()
        {
            var eventId = Guid.NewGuid();
            var acl     = new StreamAcl(
                readRole: SystemRoles.Admins, writeRole: SystemRoles.Admins,
                deleteRole: SystemRoles.Admins, metaReadRole: SystemRoles.All,
                metaWriteRole: SystemRoles.Admins);
            var metadata  = new StreamMetadata(maxCount: 2, maxAge: null, cacheControl: null, acl: acl);
            var dataBytes = metadata.ToJsonBytes();

            return(new Event(eventId, SystemEventTypes.StreamMetadata, isJson: true, data: dataBytes, metadata: null));
        }
        private Event CreateStreamMetadataEvent(long?tb)
        {
            var eventId = Guid.NewGuid();
            var acl     = new StreamAcl(
                readRole: SystemRoles.Admins, writeRole: SystemRoles.Admins,
                deleteRole: SystemRoles.Admins, metaReadRole: SystemRoles.Admins,
                metaWriteRole: SystemRoles.Admins);
            var metadata = new StreamMetadata(cacheControl: null,
                                              truncateBefore: tb,
                                              acl: acl);
            var dataBytes = metadata.ToJsonBytes();

            return(new Event(eventId, SystemEventTypes.StreamMetadata, isJson: true, data: dataBytes, metadata: null));
        }
Exemple #6
0
        private void SetScavengeStreamMetadata()
        {
            var metaStreamId = SystemStreams.MetastreamOf(SystemStreams.ScavengesStream);

            _ioDispatcher.ReadBackward(metaStreamId, -1, 1, false, SystemAccount.Principal, readResult => {
                if (readResult.Result == ReadStreamResult.Success || readResult.Result == ReadStreamResult.NoStream)
                {
                    if (readResult.Events.Length == 1)
                    {
                        var currentMetadata = StreamMetadata.FromJsonBytes(readResult.Events[0].Event.Data);
                        var hasProperACL    = currentMetadata.Acl != null &&
                                              currentMetadata.Acl.ReadRoles != null &&
                                              currentMetadata.Acl.ReadRoles.Contains(x => x.Equals("$ops"));

                        if (currentMetadata.MaxAge == _scavengeHistoryMaxAge && hasProperACL)
                        {
                            Log.Debug("Max age and $ops read permission already set for the {stream} stream.", SystemStreams.ScavengesStream);
                            return;
                        }
                    }

                    Log.Debug("Setting max age for the {stream} stream to {maxAge}.", SystemStreams.ScavengesStream,
                              _scavengeHistoryMaxAge);

                    Log.Debug("Setting $ops read permission for the {stream} stream", SystemStreams.ScavengesStream);

                    var acl = new StreamAcl(
                        new string[] { "$ops" },
                        new string[] {},
                        new string[] {},
                        new string[] {},
                        new string[] {}
                        );

                    var metadata        = new StreamMetadata(maxAge: _scavengeHistoryMaxAge, acl: acl);
                    var metaStreamEvent = new Event(Guid.NewGuid(), SystemEventTypes.StreamMetadata, isJson: true,
                                                    data: metadata.ToJsonBytes(), metadata: null);
                    _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent,
                                             SystemAccount.Principal, m => {
                        if (m.Result != OperationResult.Success)
                        {
                            Log.Error(
                                "Failed to write the $maxAge of {days} days and set $ops permission for the {stream} stream. Reason: {reason}",
                                _scavengeHistoryMaxAge.TotalDays, SystemStreams.ScavengesStream, m.Result);
                        }
                    });
                }
            });
        }
Exemple #7
0
        private void SetOpsPermissions(IList <string> recentScavengeIds)
        {
            //sets $ops permissions on last 30 $scavenges-<scavenge id> stream
            //added for backward compatibility to make UI scavenge history work properly with $ops users

            var last30ScavengeIds = new HashSet <string>();

            foreach (var scavengeId in recentScavengeIds)
            {
                if (last30ScavengeIds.Count >= 30)
                {
                    break;
                }
                last30ScavengeIds.Add(scavengeId);
            }

            if (last30ScavengeIds.Count > 0)
            {
                Log.Debug("Setting $ops read permission on last {count} $scavenges-<scavenge id> streams.", last30ScavengeIds.Count);
            }

            foreach (var scavengeId in last30ScavengeIds)
            {
                var acl = new StreamAcl(
                    new string[] { "$ops" },
                    new string[] {},
                    new string[] {},
                    new string[] {},
                    new string[] {}
                    );

                var scavengeIdStream = SystemStreams.ScavengesStream + "-" + scavengeId;
                var metaStreamId     = SystemStreams.MetastreamOf(scavengeIdStream);
                var metadata         = new StreamMetadata(maxAge: _scavengeHistoryMaxAge, acl: acl);
                var metaStreamEvent  = new Event(Guid.NewGuid(), SystemEventTypes.StreamMetadata, isJson: true,
                                                 data: metadata.ToJsonBytes(), metadata: null);
                _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent,
                                         SystemAccount.Principal, m => {
                    if (m.Result != OperationResult.Success)
                    {
                        Log.Error(
                            "Failed to set $ops read permission for the {stream} stream. Reason: {reason}",
                            _scavengeHistoryMaxAge.TotalDays, scavengeIdStream, m.Result);
                    }
                });
            }
        }
Exemple #8
0
        private void WriteScavengeStartedEvent(string streamName, Guid scavengeId)
        {
            var metadataEventId = Guid.NewGuid();
            var metaStreamId    = SystemStreams.MetastreamOf(streamName);
            var metadata        = new StreamMetadata(maxAge: TimeSpan.FromDays(_scavengeHistoryMaxAge));
            var metaStreamEvent = new Event(metadataEventId, SystemEventTypes.StreamMetadata, isJson: true,
                                            data: metadata.ToJsonBytes(), metadata: null);

            _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent, SystemAccount.Principal, m => { });

            var scavengeStartedEvent = new Event(Guid.NewGuid(), SystemEventTypes.ScavengeStarted, true, new Dictionary <string, object> {
                { "scavengeId", scavengeId },
                { "nodeEndpoint", _nodeEndpoint },
            }.ToJsonBytes(), null);

            _ioDispatcher.WriteEvent(streamName, ExpectedVersion.Any, scavengeStartedEvent, SystemAccount.Principal, x => WriteScavengeEventCompleted(x, streamName));
        }
        private void SubmitWriteMetadata()
        {
            if (_awaitingWriteCompleted || _awaitingMetadataWriteCompleted || _awaitingListEventsCompleted)
            {
                throw new Exception();
            }
            var streamAcl = _streamId.StartsWith("$")
                ? new StreamAcl(SystemRoles.All, null, null, SystemRoles.All, null)
                : new StreamAcl((string)null, null, null, null, null);

            var streamMetadata = new StreamMetadata(
                _writerConfiguration.MaxCount, _writerConfiguration.MaxAge, acl: streamAcl,
                truncateBefore: _retrievedNextEventNumber == 0 ? (int?)null : _retrievedNextEventNumber);

            _submittedWriteMetaStreamEvent = new Event(
                Guid.NewGuid(), SystemEventTypes.StreamMetadata, true, streamMetadata.ToJsonBytes(), null);

            _awaitingMetadataWriteCompleted = true;

            PublishWriteMetaStream();
        }
Exemple #10
0
        private void WriteScavengeStartedEvent(string streamName, Guid scavengeId)
        {
            var metadataEventId = Guid.NewGuid();
            var metaStreamId    = SystemStreams.MetastreamOf(streamName);
            var metadata        = new StreamMetadata(maxAge: TimeSpan.FromDays(_scavengeHistoryMaxAge));
            var metaStreamEvent = new Event(metadataEventId, SystemEventTypes.StreamMetadata, isJson: true,
                                            data: metadata.ToJsonBytes(), metadata: null);

            _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent, SystemAccount.Principal, m => {
                if (m.Result != OperationResult.Success)
                {
                    Log.Error("Failed to write the $maxAge of {0} days metadata for the {1} stream. Reason: {2}", _scavengeHistoryMaxAge, streamName, m.Result);
                }
            });

            var scavengeStartedEvent = new Event(Guid.NewGuid(), SystemEventTypes.ScavengeStarted, true, new Dictionary <string, object> {
                { "scavengeId", scavengeId },
                { "nodeEndpoint", _nodeEndpoint },
            }.ToJsonBytes(), null);

            WriteScavengeDetailEvent(streamName, scavengeStartedEvent, MaxRetryCount);
        }
        private void SetMaxAge()
        {
            var metaStreamId = SystemStreams.MetastreamOf(SystemStreams.ScavengesStream);

            _ioDispatcher.ReadBackward(metaStreamId, -1, 1, false, SystemAccount.Principal, readResult => {
                if (readResult.Result == ReadStreamResult.Success || readResult.Result == ReadStreamResult.NoStream)
                {
                    if (readResult.Events.Length == 1)
                    {
                        var currentMetadata = StreamMetadata.FromJsonBytes(readResult.Events[0].Event.Data);

                        if (currentMetadata.MaxAge == _scavengeHistoryMaxAge)
                        {
                            Log.Debug("Max age already set for the {stream} stream.", SystemStreams.ScavengesStream);
                            return;
                        }
                    }

                    Log.Debug("Setting max age for the {stream} stream to {maxAge}.", SystemStreams.ScavengesStream,
                              _scavengeHistoryMaxAge);

                    var metadata        = new StreamMetadata(maxAge: _scavengeHistoryMaxAge);
                    var metaStreamEvent = new Event(Guid.NewGuid(), SystemEventTypes.StreamMetadata, isJson: true,
                                                    data: metadata.ToJsonBytes(), metadata: null);
                    _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent,
                                             SystemAccount.Principal, m => {
                        if (m.Result != OperationResult.Success)
                        {
                            Log.Error(
                                "Failed to write the $maxAge of {days} days metadata for the {stream} stream. Reason: {reason}",
                                _scavengeHistoryMaxAge.TotalDays, SystemStreams.ScavengesStream, m.Result);
                        }
                    });
                }
            });
        }
Exemple #12
0
        public void ScavengeStarted(bool alwaysKeepScavenged, bool mergeChunks, int startFromChunk, int threads)
        {
            var metadataEventId = Guid.NewGuid();
            var metaStreamId    = SystemStreams.MetastreamOf(_streamName);
            var acl             = new StreamAcl(
                new string[] { "$ops" },
                new string[] { },
                new string[] { },
                new string[] { },
                new string[] { }
                );
            var metadata        = new StreamMetadata(maxAge: _scavengeHistoryMaxAge, acl: acl);
            var metaStreamEvent = new Event(metadataEventId, SystemEventTypes.StreamMetadata, isJson: true,
                                            data: metadata.ToJsonBytes(), metadata: null);

            _ioDispatcher.WriteEvent(metaStreamId, ExpectedVersion.Any, metaStreamEvent, SystemAccounts.System, m => {
                if (m.Result != OperationResult.Success)
                {
                    Log.Error(
                        "Failed to write the $maxAge of {days} days metadata for the {stream} stream. Reason: {reason}",
                        _scavengeHistoryMaxAge.TotalDays, _streamName, m.Result);
                }
            });

            var scavengeStartedEvent = new Event(Guid.NewGuid(), SystemEventTypes.ScavengeStarted, true,
                                                 new Dictionary <string, object> {
                { "scavengeId", _scavengeId },
                { "nodeEndpoint", _nodeId },
                { "alwaysKeepScavenged", alwaysKeepScavenged },
                { "mergeChunks", mergeChunks },
                { "startFromChunk", startFromChunk },
                { "threads", threads },
            }.ToJsonBytes(), null);

            WriteScavengeDetailEvent(_streamName, scavengeStartedEvent, _retryAttempts);
        }
Exemple #13
0
 public void UpdateStreamAcl(
     string streamId,
     long expectedVersion,
     IPrincipal principal,
     StreamMetadata metadata,
     Action <ClientMessage.WriteEventsCompleted> completed)
 {
     WriteEvents(
         SystemStreams.MetastreamOf(streamId),
         expectedVersion,
         new[] { new Event(Guid.NewGuid(), SystemEventTypes.StreamMetadata, true, metadata.ToJsonBytes(), null) },
         principal,
         completed);
 }