public void SerializeSnapshot(ISnapshot snap, Stream stream)
        {
            snap.AcquireReference();
            try
            {
                _sentSnapshot.Add(snap.SnapshotSeq, snap);
            }
            catch (Exception e)
            {
                int i = 0;
                i++;
            }
            _snapshotQueue.Enqueue(snap.SnapshotSeq);
            ISnapshot baseSnap = GetBaseSnapshot(AckedSnapshotId);

            if (baseSnap == null)
            {
                _emptySnapshot.SnapshotSeq = -1;
                _snapSerializer.Serialize(_emptySnapshot, snap, stream);
                _lastAllSnapShotId   = snap.SnapshotSeq;
                _lastAllSnapShotTime = snap.ServerTime;
                _isSendAll           = true;
                _logger.Warn("send full snapshot!");
                FullCount++;
            }
            else
            {
                _snapSerializer.Serialize(baseSnap, snap, stream);
                _isSendAll = false;
                DiffCount++;
            }

            ClearOldSnapshot(AckedSnapshotId);
            ClearSnapshotWhenLimitExceeded();
        }
Exemple #2
0
        public void AddSnapshot(ISnapshot snapshot)
        {
            snapshot.AcquireReference();
            var snapshotList = _list;

            var insertIndex = snapshotList.Count;

            for (var i = 0; i < snapshotList.Count; i++)
            {
                var snap = snapshotList[i];

                if (snap.SnapshotSeq > snapshot.SnapshotSeq)
                {
                    insertIndex = i;
                    break;
                }
            }

            snapshotList.Insert(insertIndex, snapshot);

            //控制队列长度
            if (snapshotList.Count > MaxSnapshotSize)
            {
                RefCounterRecycler.Instance.ReleaseReference(snapshotList[0]);
                //  snapshotList[0].ReleaseReference();
                //snapshotList[0].DelRef();
                snapshotList.RemoveAt(0);
            }
        }