示例#1
0
文件: OpcIoDevice.cs 项目: phmi/phmi
 public void Open()
 {
     _server.Connect(_url, new ConnectData(new System.Net.NetworkCredential()));
     var groupState = new SubscriptionState
     {
         Name = "Groups",
         UpdateRate = 50,
         Active = true
     };
     _group = (Subscription)_server.CreateSubscription(groupState);
     _group.DataChanged += _group_DataChanged;
 }
        /// <summary>
        /// Initializes the object with default values.
        /// </summary>
        public Subscription(Cache cache, Server server, SubscriptionState state)
        {
            if (server == null) throw new ArgumentNullException("server");
            if (state == null)  throw new ArgumentNullException("state");

            m_cache  = cache;
            m_server = server;
            m_state  = new SubscriptionState();
            m_state.Active = false;

            // set the initial state.
            ModifyState((int)StateMask.All, state);
        }
示例#3
0
		/// <summary>
		/// Initializes a new instance of the RosterItem class.
		/// </summary>
		/// <param name="jid">The JID of the user this item will be associated
		/// with.</param>
		/// <param name="name">The nickname with which to associate the JID.</param>
		/// <param name="state">One of the values from the SubscriptionState
		/// enumeration.</param>
		/// <param name="pending">True if the user has requested subscription but
		/// has not received the contact's response.</param>
		/// <param name="groups">An enumerable collection of groups to categorize
		/// this item in.</param>
		/// <exception cref="ArgumentNullException">The jid parameter is null.</exception>
		internal RosterItem(Jid jid, string name, SubscriptionState state,
			bool pending, IEnumerable<string> groups) {
			jid.ThrowIfNull("jid");
			Jid = jid;
			Name = name;
			if (groups != null) {
				foreach (string s in groups) {
					if (String.IsNullOrEmpty(s))
						continue;
					this.groups.Add(s);
				}
			}
			SubscriptionState = state;
			Pending = pending;
		}
示例#4
0
        public OpcClient (OpcSection opcSection, string tagGroup, EventLoggerAccess logger)
        {
            _logger = logger;
            _OpcSection = opcSection;
            _TagGroup = tagGroup;

            _GroupReadState = new SubscriptionState();
            _GroupReadState.Name = _OpcSection.Server.TagGroup.GetElement(_TagGroup).Name + " Read";
            _GroupReadState.UpdateRate = _OpcSection.Server.TagGroup.GetElement(_TagGroup).UpdateRate;
            _GroupReadState.Active = true;

            _GroupWriteState = new SubscriptionState();
            _GroupWriteState.Name = _OpcSection.Server.TagGroup.GetElement(_TagGroup).Name + " Write";
            _GroupWriteState.Active = false;

            _Items = new Item[_OpcSection.Server.TagGroup.GetElement(_TagGroup).Tags.Count];
        }
        public async Task Try()
        {
            using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
            {
                BlittableJsonReaderObject json = await context.ReadForMemoryAsync(RequestBodyStream(), null);

                SubscriptionTryout tryout = JsonDeserializationServer.SubscriptionTryout(json);

                SubscriptionConnection.ParsedSubscription sub = SubscriptionConnection.ParseSubscriptionQuery(tryout.Query);
                SubscriptionPatchDocument patch = null;
                if (string.IsNullOrEmpty(sub.Script) == false)
                {
                    patch = new SubscriptionPatchDocument(sub.Script, sub.Functions);
                }

                if (sub.Collection == null)
                {
                    throw new ArgumentException("Collection must be specified");
                }

                const int maxPageSize = 1024;
                var       pageSize    = GetIntValueQueryString("pageSize") ?? 1;
                if (pageSize > maxPageSize)
                {
                    throw new ArgumentException($"Cannot gather more than {maxPageSize} results during tryouts, but requested number was {pageSize}.");
                }

                var state = new SubscriptionState
                {
                    ChangeVectorForNextBatchStartingPoint = tryout.ChangeVector,
                    Query = tryout.Query
                };

                var fetcher = new SubscriptionDocumentsFetcher(Database, int.MaxValue, -0x42,
                                                               new IPEndPoint(HttpContext.Connection.RemoteIpAddress, HttpContext.Connection.RemotePort), sub.Collection, sub.Revisions, state, patch);

                var includeCmd = new IncludeDocumentsCommand(Database.DocumentsStorage, context, sub.Includes, isProjection: patch != null);

                if (Enum.TryParse(
                        tryout.ChangeVector,
                        out Constants.Documents.SubscriptionChangeVectorSpecialStates changeVectorSpecialValue))
                {
                    switch (changeVectorSpecialValue)
                    {
                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.BeginningOfTime:
                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.DoNotChange:
                        state.ChangeVectorForNextBatchStartingPoint = null;
                        break;

                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.LastDocument:
                        using (context.OpenReadTransaction())
                        {
                            state.ChangeVectorForNextBatchStartingPoint = Database.DocumentsStorage.GetLastDocumentChangeVector(context.Transaction.InnerTransaction, context, sub.Collection);
                        }
                        break;
                    }
                }
                else
                {
                    state.ChangeVectorForNextBatchStartingPoint = tryout.ChangeVector;
                }

                var changeVector = state.ChangeVectorForNextBatchStartingPoint.ToChangeVector();
                var cv           = changeVector.FirstOrDefault(x => x.DbId == Database.DbBase64Id);

                var sp        = Stopwatch.StartNew();
                var timeLimit = TimeSpan.FromSeconds(GetIntValueQueryString("timeLimit", false) ?? 15);
                var startEtag = cv.Etag;

                using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                    using (context.OpenReadTransaction())
                    {
                        writer.WriteStartObject();
                        writer.WritePropertyName("Results");
                        writer.WriteStartArray();
                        var numberOfDocs = 0;
                        while (numberOfDocs == 0 && sp.Elapsed < timeLimit)
                        {
                            var first    = true;
                            var lastEtag = startEtag;
                            foreach (var itemDetails in fetcher.GetDataToSend(context, includeCmd, startEtag))
                            {
                                if (itemDetails.Doc.Data != null)
                                {
                                    using (itemDetails.Doc.Data)
                                    {
                                        includeCmd.Gather(itemDetails.Doc);

                                        if (first == false)
                                        {
                                            writer.WriteComma();
                                        }

                                        if (itemDetails.Exception == null)
                                        {
                                            writer.WriteDocument(context, itemDetails.Doc, metadataOnly: false);
                                        }
                                        else
                                        {
                                            var documentWithException = new DocumentWithException
                                            {
                                                Exception    = itemDetails.Exception.ToString(),
                                                ChangeVector = itemDetails.Doc.ChangeVector,
                                                Id           = itemDetails.Doc.Id,
                                                DocumentData = itemDetails.Doc.Data
                                            };
                                            writer.WriteObject(context.ReadObject(documentWithException.ToJson(), ""));
                                        }

                                        first = false;

                                        if (++numberOfDocs >= pageSize)
                                        {
                                            break;
                                        }
                                    }
                                }

                                if (sp.Elapsed >= timeLimit)
                                {
                                    break;
                                }

                                lastEtag = itemDetails.Doc.Etag;
                            }

                            if (startEtag == lastEtag)
                            {
                                break;
                            }

                            startEtag = lastEtag;
                        }

                        writer.WriteEndArray();
                        writer.WriteComma();
                        writer.WritePropertyName("Includes");
                        var includes = new List <Document>();
                        includeCmd.Fill(includes);
                        writer.WriteIncludes(context, includes);
                        writer.WriteEndObject();
                    }
            }
        }
 protected abstract ClientMessage CreateUnsubscribeRequest(Guid subscriptionId, SubscriptionState <CollectionItemEventHandlers <T> > state);
示例#7
0
    public async Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken)
    {
        iprot.IncrementRecursionDepth();
        try
        {
            TField field;
            await iprot.ReadStructBeginAsync(cancellationToken);

            while (true)
            {
                field = await iprot.ReadFieldBeginAsync(cancellationToken);

                if (field.Type == TType.Stop)
                {
                    break;
                }

                switch (field.ID)
                {
                case 1:
                    if (field.Type == TType.Struct)
                    {
                        Subscription = new SubscriptionState();
                        await Subscription.ReadAsync(iprot, cancellationToken);
                    }
                    else
                    {
                        await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
                    }
                    break;

                case 2:
                    if (field.Type == TType.List)
                    {
                        {
                            Events = new List <SquareEvent>();
                            TList _list345 = await iprot.ReadListBeginAsync(cancellationToken);

                            for (int _i346 = 0; _i346 < _list345.Count; ++_i346)
                            {
                                SquareEvent _elem347;
                                _elem347 = new SquareEvent();
                                await _elem347.ReadAsync(iprot, cancellationToken);

                                Events.Add(_elem347);
                            }
                            await iprot.ReadListEndAsync(cancellationToken);
                        }
                    }
                    else
                    {
                        await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
                    }
                    break;

                case 3:
                    if (field.Type == TType.String)
                    {
                        SyncToken = await iprot.ReadStringAsync(cancellationToken);
                    }
                    else
                    {
                        await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
                    }
                    break;

                case 4:
                    if (field.Type == TType.String)
                    {
                        ContinuationToken = await iprot.ReadStringAsync(cancellationToken);
                    }
                    else
                    {
                        await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
                    }
                    break;

                default:
                    await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);

                    break;
                }

                await iprot.ReadFieldEndAsync(cancellationToken);
            }

            await iprot.ReadStructEndAsync(cancellationToken);
        }
        finally
        {
            iprot.DecrementRecursionDepth();
        }
    }
示例#8
0
 public Subscription(Jid jid, string node, SubscriptionState subType)
     : this(jid, node)
 {
     this.SubscriptionState = subType;
 }
示例#9
0
 public Subscription(Jid jid, string node, string subId, SubscriptionState subType) : this(jid, node, subId)
 {
     SubscriptionState = subType;
 }
 public override string GetItemId() => SubscriptionState.GenerateSubscriptionItemKeyName(DatabaseName, SubscriptionName);
示例#11
0
        /*
         *  Upon receiving the subscribers list, the node owner MAY modify subscription states.
         *  The owner MUST send only modified subscription states (i.e., a "delta"), not the complete list.
         *  (Note: If the 'subscription' attribute is not specified in a modification request, then the value
         *  MUST NOT be changed.)
         *
         *  Example 163. Owner modifies subscriptions
         *
         *  <iq type='set'
         *      from='[email protected]/elsinore'
         *      to='pubsub.shakespeare.lit'
         *      id='subman3'>
         *    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
         *      <subscribers node='blogs/princely_musings'>
         *        <subscriber jid='*****@*****.**' subscription='none'/>
         *      </subscribers>
         *    </pubsub>
         *  </iq>
         *
         */

        public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state)
        {
            OwnerModifySubscriptionState(to, null, node, subscriber, state, null, null);
        }
示例#12
0
 public Subscription(Jid jid, string node, SubscriptionState subType) : this(jid, node)
 {
     SubscriptionState = subType;
 }
示例#13
0
        public IEnumerable <SubscriptionGeneralDataAndStats> GetAllSubscriptions(TransactionOperationContext serverStoreContext, bool history, int start, int take)
        {
            foreach (var keyValue in ClusterStateMachine.ReadValuesStartingWith(serverStoreContext, SubscriptionState.SubscriptionPrefix(_db.Name)))
            {
                if (start > 0)
                {
                    start--;
                    continue;
                }

                if (take-- <= 0)
                {
                    yield break;
                }

                var subscriptionState       = JsonDeserializationClient.SubscriptionState(keyValue.Value);
                var subscriptionGeneralData = new SubscriptionGeneralDataAndStats(subscriptionState);
                GetSubscriptionInternal(subscriptionGeneralData, history);
                yield return(subscriptionGeneralData);
            }
        }
示例#14
0
        public void HandleDatabaseRecordChange(DatabaseRecord databaseRecord)
        {
            using (_serverStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (context.OpenReadTransaction())
                {
                    foreach (var subscriptionStateKvp in _subscriptionConnectionStates)
                    {
                        var subscriptionName = subscriptionStateKvp.Value.Connection?.Options?.SubscriptionName;
                        if (subscriptionName == null)
                        {
                            continue;
                        }

                        var subscriptionBlittable = _serverStore.Cluster.Read(context, SubscriptionState.GenerateSubscriptionItemKeyName(databaseRecord.DatabaseName, subscriptionName));
                        if (subscriptionBlittable == null)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionDoesNotExistException($"The subscription {subscriptionName} had been deleted"));
                            continue;
                        }

                        var subscriptionState = JsonDeserializationClient.SubscriptionState(subscriptionBlittable);
                        if (subscriptionState.Disabled)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionClosedException($"The subscription {subscriptionName} is disabled and cannot be used until enabled"));
                            continue;
                        }

                        SubscriptionConnection connection = subscriptionStateKvp.Value.Connection;
                        if (connection != null && subscriptionState.Query != connection.SubscriptionState.Query)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionClosedException($"The subscription {subscriptionName} query has been modified, connection must be restarted", canReconnect: true));
                            continue;
                        }

                        var whoseTaskIsIt = _db.WhoseTaskIsIt(databaseRecord.Topology, subscriptionState, subscriptionState);
                        if (whoseTaskIsIt != _serverStore.NodeTag)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key,
                                                       new SubscriptionDoesNotBelongToNodeException("Subscription operation was stopped, because it's now under different server's responsibility"));
                        }
                    }
                }
        }
示例#15
0
        /*
            Upon receiving the subscribers list, the node owner MAY modify subscription states. 
            The owner MUST send only modified subscription states (i.e., a "delta"), not the complete list.
            (Note: If the 'subscription' attribute is not specified in a modification request, then the value
            MUST NOT be changed.)

            Example 163. Owner modifies subscriptions

            <iq type='set'
                from='[email protected]/elsinore'
                to='pubsub.shakespeare.lit'
                id='subman3'>
              <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
                <subscribers node='blogs/princely_musings'>
                  <subscriber jid='*****@*****.**' subscription='none'/>                  
                </subscribers>
              </pubsub>
            </iq>
    
        */

        public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state)
        {
            OwnerModifySubscriptionState(to, null, node, subscriber, state, null, null);
        }
示例#16
0
 public Subscriber(Jid jid, SubscriptionState sub)
     : this()
 {
     this.Jid                = jid;
     this.SubscriptionState   = sub;
 }
示例#17
0
        public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqCB cb, object cbArgs)
        {
            owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);

            if (from != null)
                pubsubIq.From = from;

            owner.Subscribers subs = new owner.Subscribers(node);
            subs.AddSubscriber(new owner.Subscriber(subscriber, state));
            
            pubsubIq.PubSub.Subscribers = subs;

            if (cb == null)
                m_connection.Send(pubsubIq);
            else
                m_connection.IqGrabber.SendIq(pubsubIq, cb, cbArgs);
        }
示例#18
0
 public Subscription(Jid jid, string node, string subId, SubscriptionState subType) : this(jid, node, subId)
 {
     this.SubscriptionState = subType;
 }
示例#19
0
 public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state, IqCB cb, object cbArgs)
 {
     OwnerModifySubscriptionState(to, null, node, subscriber, state, cb, cbArgs);
 }
示例#20
0
        public void HandleDatabaseValueChange(DatabaseRecord databaseRecord)
        {
            using (_serverStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (context.OpenReadTransaction())
                {
                    foreach (var subscriptionStateKvp in _subscriptionConnectionStates)
                    {
                        var subscriptionName = subscriptionStateKvp.Value.Connection?.Options?.SubscriptionName;
                        if (subscriptionName == null)
                        {
                            continue;
                        }
                        var subscriptionBlittable = _serverStore.Cluster.Read(context, SubscriptionState.GenerateSubscriptionItemKeyName(databaseRecord.DatabaseName, subscriptionName));
                        if (subscriptionBlittable == null)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionDoesNotExistException($"The subscription {subscriptionName} had been deleted"));
                            continue;
                        }
                        var subscriptionState = JsonDeserializationClient.SubscriptionState(subscriptionBlittable);

                        if (subscriptionState.Disabled)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionClosedException($"The subscription {subscriptionName} is disabled and cannot be used until enabled"));
                            continue;
                        }

                        if (subscriptionState.Query != subscriptionStateKvp.Value.Connection.SubscriptionState.Query)
                        {
                            DropSubscriptionConnection(subscriptionStateKvp.Key, new SubscriptionClosedException($"The subscription {subscriptionName} query has been modified, connection must be restarted"));
                        }

                        if (databaseRecord.Topology.WhoseTaskIsIt(subscriptionState, _serverStore.IsPassive()) != _serverStore.NodeTag)
                        {
                            if (_logger.IsInfoEnabled)
                            {
                                _logger.Info($"Disconnected subscription with id {subscriptionStateKvp.Key}, because it was is no longer managed by this node ({_serverStore.NodeTag})");
                            }
                            RedirectSubscriptionConnection(subscriptionStateKvp.Key, "Subscription operation was stopped, because it's now under different server's responsibility");
                        }
                    }
                }
        }
示例#21
0
 public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqCB cb)
 {
     OwnerModifySubscriptionState(to, from, node, subscriber, state, cb, null);
 }
示例#22
0
        public virtual IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state)
        {
            if (subscriber == null)
            {
                throw new ArgumentNullException("subscriber");
            }

            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            Subscription subscription = CreateSubscription(subscriber, cursor, callback, maxMessages, state);

            // Set the subscription for this subscriber
            subscriber.Subscription = subscription;

            var topics = new HashSet<Topic>();

            foreach (var key in subscriber.EventKeys)
            {
                // Create or retrieve topic and set it as HasSubscriptions
                Topic topic = SubscribeTopic(key);

                // Set the subscription for this topic
                subscription.SetEventTopic(key, topic);

                topics.Add(topic);
            }

            subscriber.EventKeyAdded += _addEvent;
            subscriber.EventKeyRemoved += _removeEvent;
            subscriber.WriteCursor = subscription.WriteCursor;

            var subscriptionState = new SubscriptionState(subscriber);
            var disposable = new DisposableAction(_disposeSubscription, subscriptionState);

            // When the subscription itself is disposed then dispose it
            subscription.Disposable = disposable;

            // Add the subscription when it's all set and can be scheduled
            // for work. It's important to do this after everything is wired up for the
            // subscription so that publishes can schedule work at the right time.
            foreach (var topic in topics)
            {
                topic.AddSubscription(subscription);
            }

            subscriptionState.Initialized.Set();

            // If there's a cursor then schedule work for this subscription
            if (!String.IsNullOrEmpty(cursor))
            {
                _broker.Schedule(subscription);
            }

            return disposable;
        }
示例#23
0
        public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqCB cb, object cbArgs)
        {
            owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);

            if (from != null)
            {
                pubsubIq.From = from;
            }

            owner.Subscribers subs = new owner.Subscribers(node);
            subs.AddSubscriber(new owner.Subscriber(subscriber, state));

            pubsubIq.PubSub.Subscribers = subs;

            if (cb == null)
            {
                m_connection.Send(pubsubIq);
            }
            else
            {
                m_connection.IqGrabber.SendIq(pubsubIq, cb, cbArgs);
            }
        }
示例#24
0
 public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqCB cb)
 {
     OwnerModifySubscriptionState(to, from, node, subscriber, state, cb, null);
 }
示例#25
0
        public Task GetOngoingTaskInfo()
        {
            if (ResourceNameValidator.IsValidResourceName(Database.Name, ServerStore.Configuration.Core.DataDirectory.FullPath, out string errorMessage) == false)
            {
                throw new BadRequestException(errorMessage);
            }

            var key     = GetLongQueryString("key");
            var typeStr = GetQueryStringValueAndAssertIfSingleAndNotEmpty("type");

            using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
            {
                using (context.OpenReadTransaction())
                {
                    var clusterTopology = ServerStore.GetClusterTopology(context);
                    var record          = ServerStore.Cluster.ReadDatabase(context, Database.Name);
                    var dbTopology      = record?.Topology;

                    if (Enum.TryParse <OngoingTaskType>(typeStr, true, out var type) == false)
                    {
                        throw new ArgumentException($"Unknown task type: {type}", "type");
                    }

                    string tag;

                    switch (type)
                    {
                    case OngoingTaskType.Replication:

                        var watcher = record?.ExternalReplication.Find(x => x.TaskId == key);
                        if (watcher == null)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                            break;
                        }

                        tag = dbTopology?.WhoseTaskIsIt(watcher, ServerStore.IsPassive());

                        var replicationTaskInfo = new OngoingTaskReplication
                        {
                            TaskId          = watcher.TaskId,
                            TaskName        = watcher.Name,
                            ResponsibleNode = new NodeId
                            {
                                NodeTag = tag,
                                NodeUrl = clusterTopology.GetUrlFromTag(tag)
                            },
                            DestinationDatabase = watcher.Database,
                            TaskState           = watcher.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled,
                            DestinationUrl      = watcher.Url
                        };

                        WriteResult(context, replicationTaskInfo);

                        break;

                    case OngoingTaskType.Backup:

                        var backupConfiguration = record?.PeriodicBackups?.Find(x => x.TaskId == key);
                        if (backupConfiguration == null)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                            break;
                        }

                        tag = dbTopology?.WhoseTaskIsIt(backupConfiguration, ServerStore.IsPassive());
                        var backupDestinations = GetBackupDestinations(backupConfiguration);
                        var backupStatus       = Database.PeriodicBackupRunner.GetBackupStatus(key);
                        var nextBackup         = Database.PeriodicBackupRunner.GetNextBackupDetails(record, backupConfiguration, backupStatus);

                        var backupTaskInfo = new OngoingTaskBackup
                        {
                            TaskId          = backupConfiguration.TaskId,
                            BackupType      = backupConfiguration.BackupType,
                            TaskName        = backupConfiguration.Name,
                            TaskState       = backupConfiguration.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled,
                            ResponsibleNode = new NodeId
                            {
                                NodeTag = tag,
                                NodeUrl = clusterTopology.GetUrlFromTag(tag)
                            },
                            BackupDestinations    = backupDestinations,
                            LastFullBackup        = backupStatus.LastFullBackup,
                            LastIncrementalBackup = backupStatus.LastIncrementalBackup,
                            NextBackup            = nextBackup
                        };

                        WriteResult(context, backupTaskInfo);
                        break;

                    case OngoingTaskType.SqlEtl:

                        var sqlEtl = record?.SqlEtls?.Find(x => x.TaskId == key);
                        if (sqlEtl == null)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                            break;
                        }

                        WriteResult(context, new OngoingTaskSqlEtl
                        {
                            TaskId        = sqlEtl.TaskId,
                            TaskName      = sqlEtl.Name,
                            Configuration = sqlEtl
                        });
                        break;

                    case OngoingTaskType.RavenEtl:

                        var ravenEtl = record?.RavenEtls?.Find(x => x.TaskId == key);
                        if (ravenEtl == null)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                            break;
                        }

                        WriteResult(context, new OngoingTaskRavenEtl
                        {
                            TaskId        = ravenEtl.TaskId,
                            TaskName      = ravenEtl.Name,
                            Configuration = ravenEtl
                        });
                        break;

                    case OngoingTaskType.Subscription:

                        var nameKey = GetQueryStringValueAndAssertIfSingleAndNotEmpty("taskName");
                        var itemKey = SubscriptionState.GenerateSubscriptionItemKeyName(record.DatabaseName, nameKey);
                        var doc     = ServerStore.Cluster.Read(context, itemKey);
                        if (doc == null)
                        {
                            HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                            break;
                        }

                        var subscriptionState = JsonDeserializationClient.SubscriptionState(doc);
                        tag = dbTopology?.WhoseTaskIsIt(subscriptionState, ServerStore.IsPassive());

                        var subscriptionStateInfo = new SubscriptionStateWithNodeDetails
                        {
                            Query = subscriptionState.Query,
                            ChangeVectorForNextBatchStartingPoint = subscriptionState.ChangeVectorForNextBatchStartingPoint,
                            SubscriptionId   = subscriptionState.SubscriptionId,
                            SubscriptionName = subscriptionState.SubscriptionName,
                            LastTimeServerMadeProgressWithDocuments = subscriptionState.LastTimeServerMadeProgressWithDocuments,
                            Disabled = subscriptionState.Disabled,
                            LastClientConnectionTime = subscriptionState.LastClientConnectionTime,
                            ResponsibleNode          = new NodeId
                            {
                                NodeTag = tag,
                                NodeUrl = clusterTopology.GetUrlFromTag(tag)
                            }
                        };

                        // Todo: here we'll need to talk with the running node? TaskConnectionStatus = subscriptionState.Disabled ? OngoingTaskConnectionStatus.NotActive : OngoingTaskConnectionStatus.Active,

                        WriteResult(context, subscriptionStateInfo.ToJson());
                        break;

                    default:
                        HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                        break;
                    }
                }
            }

            return(Task.CompletedTask);
        }
示例#26
0
        public async Task SubscripitonDeletionFromCluster()
        {
            const int nodesAmount = 5;
            var       leader      = await this.CreateRaftClusterAndGetLeader(nodesAmount);

            var defaultDatabase = "ContinueFromThePointIStopped";

            await CreateDatabaseInCluster(defaultDatabase, nodesAmount, leader.WebUrl).ConfigureAwait(false);

            using (var store = new DocumentStore
            {
                Urls = new[] { leader.WebUrl },
                Database = defaultDatabase
            }.Initialize())
            {
                var usersCount            = new List <User>();
                var reachedMaxDocCountMre = new AsyncManualResetEvent();

                var subscriptionId = await store.Subscriptions.CreateAsync <User>();

                using (var session = store.OpenAsyncSession())
                {
                    await session.StoreAsync(new User
                    {
                        Name = "Peter"
                    });

                    await session.SaveChangesAsync();
                }

                var subscription = store.Subscriptions.GetSubscriptionWorker <User>(new SubscriptionWorkerOptions(subscriptionId)
                {
                    TimeToWaitBeforeConnectionRetry = TimeSpan.FromSeconds(5)
                });

                subscription.AfterAcknowledgment += b => { reachedMaxDocCountMre.Set(); return(Task.CompletedTask); };

                GC.KeepAlive(subscription.Run(x => { }));

                await reachedMaxDocCountMre.WaitAsync();


                foreach (var ravenServer in Servers)
                {
                    using (ravenServer.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                        using (context.OpenReadTransaction())
                        {
                            Assert.NotNull(ravenServer.ServerStore.Cluster.Read(context, SubscriptionState.GenerateSubscriptionItemKeyName(defaultDatabase, subscriptionId.ToString())));
                        }
                }

                await subscription.DisposeAsync();

                var deleteResult = store.Maintenance.Server.Send(new DeleteDatabasesOperation(defaultDatabase, hardDelete: true));

                foreach (var ravenServer in Servers)
                {
                    await ravenServer.ServerStore.WaitForCommitIndexChange(RachisConsensus.CommitIndexModification.GreaterOrEqual, deleteResult.RaftCommandIndex + nodesAmount).WaitWithTimeout(TimeSpan.FromSeconds(60));
                }
                Thread.Sleep(2000);

                foreach (var ravenServer in Servers)
                {
                    using (ravenServer.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                        using (context.OpenReadTransaction())
                        {
                            Assert.Null(ravenServer.ServerStore.Cluster.Read(context, SubscriptionState.GenerateSubscriptionItemKeyName(defaultDatabase, subscriptionId.ToString())));
                        }
                }
            }
        }
示例#27
0
        private static IEnumerable <OngoingTask> CollectSubscriptionTasks(TransactionOperationContext context, DatabaseRecord databaseRecord, ClusterTopology clusterTopology, ServerStore store)
        {
            foreach (var keyValue in ClusterStateMachine.ReadValuesStartingWith(context, SubscriptionState.SubscriptionPrefix(databaseRecord.DatabaseName)))
            {
                var subscriptionState = JsonDeserializationClient.SubscriptionState(keyValue.Value);
                var tag = databaseRecord.Topology.WhoseTaskIsIt(subscriptionState, store.IsPassive());

                yield return(new OngoingTaskSubscription
                {
                    // Supply only needed fields for List View
                    ResponsibleNode = new NodeId
                    {
                        NodeTag = tag,
                        NodeUrl = clusterTopology.GetUrlFromTag(tag)
                    },
                    TaskName = subscriptionState.SubscriptionName,
                    TaskState = subscriptionState.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled,
                    TaskId = subscriptionState.SubscriptionId,
                    Query = subscriptionState.Query
                });
            }
        }
    public void Read(TProtocol iprot)
    {
        iprot.IncrementRecursionDepth();
        try
        {
            TField field;
            iprot.ReadStructBegin();
            while (true)
            {
                field = iprot.ReadFieldBegin();
                if (field.Type == TType.Stop)
                {
                    break;
                }
                switch (field.ID)
                {
                case 1:
                    if (field.Type == TType.Struct)
                    {
                        Subscription = new SubscriptionState();
                        Subscription.Read(iprot);
                    }
                    else
                    {
                        TProtocolUtil.Skip(iprot, field.Type);
                    }
                    break;

                case 2:
                    if (field.Type == TType.List)
                    {
                        {
                            Events = new List <SquareEvent>();
                            TList _list349 = iprot.ReadListBegin();
                            for (int _i350 = 0; _i350 < _list349.Count; ++_i350)
                            {
                                SquareEvent _elem351;
                                _elem351 = new SquareEvent();
                                _elem351.Read(iprot);
                                Events.Add(_elem351);
                            }
                            iprot.ReadListEnd();
                        }
                    }
                    else
                    {
                        TProtocolUtil.Skip(iprot, field.Type);
                    }
                    break;

                case 3:
                    if (field.Type == TType.String)
                    {
                        SyncToken = iprot.ReadString();
                    }
                    else
                    {
                        TProtocolUtil.Skip(iprot, field.Type);
                    }
                    break;

                case 4:
                    if (field.Type == TType.String)
                    {
                        ContinuationToken = iprot.ReadString();
                    }
                    else
                    {
                        TProtocolUtil.Skip(iprot, field.Type);
                    }
                    break;

                default:
                    TProtocolUtil.Skip(iprot, field.Type);
                    break;
                }
                iprot.ReadFieldEnd();
            }
            iprot.ReadStructEnd();
        }
        finally
        {
            iprot.DecrementRecursionDepth();
        }
    }
示例#29
0
        public void RavenDB_13724()
        {
            var folder = NewDataPath(forceCreateDir: true, prefix: Guid.NewGuid().ToString());

            DoNotReuseServer();

            var zipPath = new PathSetting("SchemaUpgrade/Issues/SystemVersion/RavenDB_13724.zip");

            Assert.True(File.Exists(zipPath.FullPath));

            ZipFile.ExtractToDirectory(zipPath.FullPath, folder);

            using (var server = GetNewServer(new ServerCreationOptions {
                DeletePrevious = false, RunInMemory = false, DataDirectory = folder, RegisterForDisposal = false
            }))
                using (server.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        var db  = server.ServerStore.Cluster.GetDatabaseNames(context).Single();
                        var ids = new HashSet <long>();
                        foreach (var keyValue in ClusterStateMachine.ReadValuesStartingWith(context, SubscriptionState.SubscriptionPrefix(db)))
                        {
                            var state = JsonDeserializationClient.SubscriptionState(keyValue.Value);
                            Assert.True(ids.Add(state.SubscriptionId));
                        }
                    }
        }
示例#30
0
        public async Task Try()
        {
            using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
            {
                var json = await context.ReadForMemoryAsync(RequestBodyStream(), null);

                var tryout = JsonDeserializationServer.SubscriptionTryout(json);

                var(collection, (script, functions), revisions) = SubscriptionConnection.ParseSubscriptionQuery(tryout.Query);
                SubscriptionPatchDocument patch = null;
                if (string.IsNullOrEmpty(script) == false)
                {
                    patch = new SubscriptionPatchDocument(script, functions);
                }

                if (collection == null)
                {
                    throw new ArgumentException("Collection must be specified");
                }

                var pageSize = GetIntValueQueryString("pageSize") ?? 1;

                var fetcher = new SubscriptionDocumentsFetcher(Database, pageSize, -0x42,
                                                               new IPEndPoint(HttpContext.Connection.RemoteIpAddress, HttpContext.Connection.RemotePort));

                var state = new SubscriptionState
                {
                    ChangeVectorForNextBatchStartingPoint = tryout.ChangeVector,
                    Query = tryout.Query
                };

                if (Enum.TryParse(
                        tryout.ChangeVector,
                        out Constants.Documents.SubscriptionChangeVectorSpecialStates changeVectorSpecialValue))
                {
                    switch (changeVectorSpecialValue)
                    {
                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.BeginningOfTime:
                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.DoNotChange:
                        state.ChangeVectorForNextBatchStartingPoint = null;
                        break;

                    case Constants.Documents.SubscriptionChangeVectorSpecialStates.LastDocument:
                        state.ChangeVectorForNextBatchStartingPoint = Database.DocumentsStorage.GetLastDocumentChangeVector(context, collection);
                        break;
                    }
                }

                using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream()))
                {
                    writer.WriteStartObject();
                    writer.WritePropertyName("Results");
                    writer.WriteStartArray();

                    using (context.OpenReadTransaction())
                    {
                        var first = true;

                        foreach (var itemDetails in fetcher.GetDataToSend(context, collection, revisions, state, patch, 0))
                        {
                            if (itemDetails.Doc.Data == null)
                            {
                                continue;
                            }

                            if (first == false)
                            {
                                writer.WriteComma();
                            }

                            if (itemDetails.Exception == null)
                            {
                                writer.WriteDocument(context, itemDetails.Doc, metadataOnly: false);
                            }
                            else
                            {
                                var docWithExcepton = new DocumentWithException
                                {
                                    Exception    = itemDetails.Exception.ToString(),
                                    ChangeVector = itemDetails.Doc.ChangeVector,
                                    Id           = itemDetails.Doc.Id,
                                    DocumentData = itemDetails.Doc.Data
                                };
                                writer.WriteObject(context.ReadObject(docWithExcepton.ToJson(), ""));
                            }

                            first = false;
                        }
                    }

                    writer.WriteEndArray();
                    writer.WriteEndObject();
                }
            }
        }
示例#31
0
        public override void AddContexMenuItems(ref string CurrentGroup, ContextMenu Menu)
        {
            base.AddContexMenuItems(ref CurrentGroup, Menu);

            XmppAccountNode XmppAccountNode = this.XmppAccountNode;

            if (XmppAccountNode != null && XmppAccountNode.IsOnline)
            {
                SubscriptionState SubscriptionState = this.SubscriptionState;
                MenuItem          MenuItem;
                string            s;

                if (SubscriptionState == SubscriptionState.None || SubscriptionState == SubscriptionState.From)
                {
                    CurrentGroup = "Subscriptions";

                    if (SubscriptionState == SubscriptionState.None)
                    {
                        s = "../Graphics/To.png";
                    }
                    else
                    {
                        s = "../Graphics/Both.png";
                    }

                    Menu.Items.Add(MenuItem = new MenuItem()
                    {
                        Header    = "_Subscribe to",
                        IsEnabled = true,
                        Icon      = new Image()
                        {
                            Source = new BitmapImage(new Uri(s, UriKind.Relative)),
                            Width  = 16,
                            Height = 16
                        }
                    });

                    MenuItem.Click += Subscribe_Click;
                }

                if (SubscriptionState == SubscriptionState.To || SubscriptionState == SubscriptionState.Both)
                {
                    CurrentGroup = "Subscriptions";

                    if (SubscriptionState == SubscriptionState.To)
                    {
                        s = "../Graphics/None.png";
                    }
                    else
                    {
                        s = "../Graphics/From.png";
                    }

                    Menu.Items.Add(MenuItem = new MenuItem()
                    {
                        Header    = "_Unsubscribe from",
                        IsEnabled = true,
                        Icon      = new Image()
                        {
                            Source = new BitmapImage(new Uri(s, UriKind.Relative)),
                            Width  = 16,
                            Height = 16
                        }
                    });

                    MenuItem.Click += Unsubscribe_Click;
                }
            }
        }
 protected abstract bool ReadUnsubscribeResponse(ClientMessage unsubscribeResponseMessage, SubscriptionState <CollectionItemEventHandlers <T> > state);
示例#33
0
        public async Task InitAsync()
        {
            await ParseSubscriptionOptionsAsync();

            if (_logger.IsInfoEnabled)
            {
                _logger.Info(
                    $"Subscription connection for subscription ID: {SubscriptionId} received from {TcpConnection.TcpClient.Client.RemoteEndPoint}");
            }

            // first, validate details and make sure subscription exists
            SubscriptionState = await TcpConnection.DocumentDatabase.SubscriptionStorage.AssertSubscriptionConnectionDetails(SubscriptionId, _options.SubscriptionName);

            _connectionState = TcpConnection.DocumentDatabase.SubscriptionStorage.OpenSubscription(this);
            var timeout = TimeSpan.FromMilliseconds(16);

            bool shouldRetry = false;

            do
            {
                try
                {
                    DisposeOnDisconnect = await _connectionState.RegisterSubscriptionConnection(this, timeout);

                    shouldRetry = false;
                }
                catch (TimeoutException)
                {
                    if (timeout == TimeSpan.Zero && _logger.IsInfoEnabled)
                    {
                        _logger.Info(
                            $"Subscription Id {SubscriptionId} from IP {TcpConnection.TcpClient.Client.RemoteEndPoint} starts to wait until previous connection from {_connectionState.Connection?.TcpConnection.TcpClient.Client.RemoteEndPoint} is released");
                    }
                    timeout = TimeSpan.FromMilliseconds(Math.Max(250, (long)_options.TimeToWaitBeforeConnectionRetry.TotalMilliseconds / 2));
                    await SendHeartBeat();

                    shouldRetry = true;
                }
            } while (shouldRetry);



            // refresh subscription data (change vector may have been updated, because in the meanwhile, another subscription could have just completed a batch)
            SubscriptionState = await TcpConnection.DocumentDatabase.SubscriptionStorage.AssertSubscriptionConnectionDetails(SubscriptionId, _options.SubscriptionName);

            (Collection, (Script, Functions), Revisions) = ParseSubscriptionQuery(SubscriptionState.Query);

            try
            {
                await SendNoopAck();
                await WriteJsonAsync(new DynamicJsonValue
                {
                    [nameof(SubscriptionConnectionServerMessage.Type)]   = nameof(SubscriptionConnectionServerMessage.MessageType.ConnectionStatus),
                    [nameof(SubscriptionConnectionServerMessage.Status)] = nameof(SubscriptionConnectionServerMessage.ConnectionStatus.Accepted)
                });

                Stats.ConnectedAt = DateTime.UtcNow;
                await TcpConnection.DocumentDatabase.SubscriptionStorage.UpdateClientConnectionTime(SubscriptionState.SubscriptionId,
                                                                                                    SubscriptionState.SubscriptionName, SubscriptionState.MentorNode);
            }
            catch
            {
                DisposeOnDisconnect.Dispose();
            }
        }
 protected abstract Guid ReadSubscribeResponse(ClientMessage responseMessage, SubscriptionState <CollectionItemEventHandlers <T> > state);
示例#35
0
 protected override ClientMessage CreateUnsubscribeRequest(Guid subscriptionId, SubscriptionState <CollectionItemEventHandlers <T> > state)
 => ListRemoveListenerCodec.EncodeRequest(Name, subscriptionId);
示例#36
0
 public Subscriber(Jid jid, SubscriptionState sub) : this()
 {
     this.Jid = jid;
     this.SubscriptionState = sub;
 }
示例#37
0
 protected override Guid ReadSubscribeResponse(ClientMessage responseMessage, SubscriptionState <CollectionItemEventHandlers <T> > state)
 => ListAddListenerCodec.DecodeResponse(responseMessage).Response;
示例#38
0
 public Subscription(Jid jid, SubscriptionState subType) : this(jid)
 {
     SubscriptionState = subType;
 }
示例#39
0
 private void releaseLastMessage(SubscriptionState subState)
 {
     if (subState.lastSentMessage != null)
     {
         subState.lastSentMessage.Close();
         subState.lastSentMessage = null;
     }
 }
 /// <summary>
 /// Initializes a new instance of the PrivacyRule class.
 /// </summary>
 /// <param name="state">The subscription state the privacy rule applies
 /// to.</param>
 /// <param name="allow">True to block entities affected by this rule; Otherwise
 /// false.</param>
 /// <param name="order">The order of the privacy rule.</param>
 /// <param name="granularity">Specifies which kinds of stanzas are to be
 /// blocked.</param>
 public SubscriptionPrivacyRule(SubscriptionState state, bool allow, uint order,
     PrivacyGranularity granularity = 0)
     : base(allow, order, granularity)
 {
     SubscriptionState = state;
 }
        protected Task SubscribeAsync(RpcRequest rpcRequest)
        {
            if (SubscriptionState != SubscriptionState.Idle)
            {
                throw new Exception("Invalid state to start subscription, current state: " + SubscriptionState.ToString());
            }

            SubscribeRequestId = rpcRequest.Id;

            this.SubscriptionState = SubscriptionState.Subscribing;

            return(StreamingClient.SendRequestAsync(rpcRequest, this));
        }
示例#42
0
 public Subscription(Jid jid, SubscriptionState subType) : this(jid)
 {
     SubscriptionState = subType;
 }
        public Task UnsubscribeAsync()
        {
            if (SubscriptionState != SubscriptionState.Subscribed && SubscriptionState != SubscriptionState.Unsubscribed) //allow retrying? what happens when it returns false the unsubscription
            {
                throw new Exception("Invalid state to unsubscribe, current state: " + SubscriptionState.ToString());
            }

            UnsubscribeRequestId = Guid.NewGuid().ToString();
            var request = UnsubscribeSubscriptionRpcRequestBuilder.BuildRequest(SubscriptionId, UnsubscribeRequestId);

            this.SubscriptionState = SubscriptionState.Unsubscribing;

            return(StreamingClient.SendRequestAsync(request, this));
        }
示例#44
0
 protected override bool ReadUnsubscribeResponse(ClientMessage unsubscribeResponseMessage, SubscriptionState <CollectionItemEventHandlers <T> > state)
 => ListRemoveListenerCodec.DecodeResponse(unsubscribeResponseMessage).Response;
示例#45
0
 public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state, IqCB cb, object cbArgs)
 {
     OwnerModifySubscriptionState(to, null, node, subscriber, state, cb, cbArgs);
 }