public SequenceNumber ReserveAndAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            params long[] reservations)
        {
            if (reservationCollection == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservationCollection"));
            }

            if (reservations == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservations"));
            }

            FileReservationCollection fileResCollection = null;

            fileResCollection = reservationCollection as FileReservationCollection;
            if (fileResCollection == null || !fileResCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            foreach (long reservationSize in reservations)
            {
                if (reservationSize < 0)
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("reservations"));
                }
            }

            foreach (long reservationSize in reservations)
            {
                fileResCollection.Add(reservationSize);
            }

            bool throwing = true;

            try
            {
                SequenceNumber returnValue = Append(data, nextUndoRecord, previousRecord, recordAppendOptions);
                throwing = false;
                return(returnValue);
            }
            finally
            {
                if (throwing && fileResCollection != null)
                {
                    foreach (long reservationSize in reservations)
                    {
                        fileResCollection.Remove(reservationSize);
                    }
                }
            }
        }
        public SequenceNumber Append(
            IList <ArraySegment <byte> > data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservations)
        {
            int size = 0;

            if (reservations == null)
            {
                return(Append(data, nextUndoRecord, previousRecord, recordAppendOptions));
            }

            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            FileReservationCollection reservationCollection = reservations as FileReservationCollection;

            if (reservationCollection == null || !reservationCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            for (int i = 0; i < data.Count; i++)
            {
                size += data[i].Count;
            }

            long reservation = reservationCollection.GetBestMatchingReservation(size);

            if (reservation < 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ReservationNotFound());
            }

            bool throwing = true;

            try
            {
                SequenceNumber returnValue = this.Append(data, nextUndoRecord, previousRecord, recordAppendOptions);
                throwing = false;
                return(returnValue);
            }
            finally
            {
                if (throwing)
                {
                    reservationCollection.Add(reservation);
                }
            }
        }
        public SequenceNumber WriteRestartArea(
            IList <ArraySegment <byte> > data,
            SequenceNumber newBaseSeqNum,
            ReservationCollection reservations)
        {
            long size = 0;

            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            if (reservations == null)
            {
                return(WriteRestartArea(data, newBaseSeqNum));
            }

            FileReservationCollection reservationCollection = reservations as FileReservationCollection;

            if (reservationCollection == null || !reservationCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            for (int i = 0; i < data.Count; i++)
            {
                size = checked (size + data[i].Count);
            }
            long reservation = reservationCollection.GetBestMatchingReservation(size);

            if (reservation < 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ReservationNotFound());
            }

            bool throwing = true;

            try
            {
                SequenceNumber returnValue = WriteRestartArea(data, newBaseSeqNum);
                throwing = false;
                return(returnValue);
            }
            finally
            {
                if (throwing)
                {
                    reservationCollection.Add(reservation);
                }
            }
        }
        public ReservationCollection CreateReservationCollection()
        {
            FileReservationCollection collection = new FileReservationCollection(this);

            return(collection);
        }
Exemple #5
0
 public ReservationCollection CreateReservationCollection()
 {
     FileReservationCollection collection = new FileReservationCollection(this);
     return collection;
 }