Esempio n. 1
0
        public void Restore()
        {
            var restoreEnumerator = persistentStorage.Restore().GetEnumerator();

            if (!restoreEnumerator.MoveNext())
            {
                persistedMessageId = lastMessageId = -1;
                data = new InfiniteArray <Message>(0, dataArrayOptions);
                RestoreSubscriptions();
                return;
            }

            data = new InfiniteArray <Message>(restoreEnumerator.Current.ID, dataArrayOptions);
            data.Add(restoreEnumerator.Current);

            while (restoreEnumerator.MoveNext())
            {
                data.Add(restoreEnumerator.Current);
            }

            currentData = new DataSnapshot()
            {
                StartMessageId = data.GetFirstItemIndex(),
                Data           = data.GetDataBlocks()
            };

            persistedMessageId = lastMessageId = currentData.Data[^ 1].Span[^ 1].ID;
Esempio n. 2
0
        private long FindSequenceNumberToAck(long persistedId)
        {
            lock (sync)
            {
                if (disposed)
                {
                    // do not throw exception here
                    return(-1);
                }

                var blocks = idMap.GetDataBlocks();
                var ind    = idMap.GetLastItemIndex();

                for (int i = blocks.Length - 1; i >= 0; i--)
                {
                    var m = blocks[i].Span;
                    for (int j = m.Length - 1; j >= 0; j--)
                    {
                        if (m[j].ID <= persistedId)
                        {
                            var idToAck = m[j].WriterID;
                            idMap.FreeTo(ind + 1);
                            return(idToAck);
                        }

                        ind--;
                    }
                }
            }

            return(-1);
        }