Esempio n. 1
0
        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);
                    }
                }
            }
        }
Esempio n. 2
0
 public Task <SequenceNumber> Append(
     IList <ArraySegment <byte> > record,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions options)
 {
     this.EnsureAvailableSpace();
     return(this.log.AppendAsync(record, nextUndoRecord, previousRecord, options));
 }
Esempio n. 3
0
 public SequenceNumber Append(
     ArraySegment <byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions)
 {
     return(Append(new ArraySegment <byte>[] { data },
                   nextUndoRecord,
                   previousRecord,
                   recordAppendOptions));
 }
Esempio n. 4
0
        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);
                }
            }
        }
Esempio n. 5
0
        public IAsyncResult BeginAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            AsyncCallback callback,
            object state)
        {
            SequenceNumber result = Append(data, nextUndoRecord, previousRecord, recordAppendOptions);

            return(new FileRecordSequenceCompletedAsyncResult(result, callback, state, Work.Append));
        }
Esempio n. 6
0
        public IAsyncResult BeginReserveAndAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber userRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            long[] reservations,
            AsyncCallback callback,
            object state)
        {
            long totalRecordSize;
            LogReservationCollection lrc;

            this.store.ValidateSequenceNumber(
                ref userRecord,
                SequenceNumberConstraint.Arbitrary,
                "userRecord");
            this.store.ValidateSequenceNumber(
                ref previousRecord,
                SequenceNumberConstraint.Arbitrary,
                "previousRecord");

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

            totalRecordSize = ValidateData(data);
            lrc             = ValidateReservationCollection(reservationCollection);

            EnsureMarshalContext();

            LogAppendAsyncResult result = new LogAppendAsyncResult(this,
                                                                   callback,
                                                                   state);

            result.Data                  = data;
            result.TotalRecordSize       = totalRecordSize;
            result.UserLsn               = userRecord.High;
            result.PreviousLsn           = previousRecord.High;
            result.RecordAppendOptions   = recordAppendOptions;
            result.ReservationCollection = lrc;
            result.Reservations          = reservations;

            result.Start();

            return(result);
        }
Esempio n. 7
0
        public IAsyncResult BeginAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber userRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservations,
            AsyncCallback callback,
            object state)
        {
            long totalRecordSize;
            LogReservationCollection lrc;

            if ((this.store.Access & FileAccess.Write) == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported(SR.NotSupported_ReadOnly));
            }

            if (recordAppendOptions > (RecordAppendOptions.ForceAppend | RecordAppendOptions.ForceFlush) ||
                recordAppendOptions < RecordAppendOptions.None)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("recordAppendOptions"));
            }

            this.store.ValidateSequenceNumber(
                ref userRecord,
                SequenceNumberConstraint.Arbitrary,
                "userRecord");
            this.store.ValidateSequenceNumber(
                ref previousRecord,
                SequenceNumberConstraint.Arbitrary,
                "previousRecord");

            totalRecordSize = ValidateData(data);
            lrc             = ValidateReservationCollection(reservations);

            EnsureMarshalContext();

            LogAppendAsyncResult result = new LogAppendAsyncResult(this,
                                                                   callback,
                                                                   state);

            result.Data                  = data;
            result.TotalRecordSize       = totalRecordSize;
            result.UserLsn               = userRecord.High;
            result.PreviousLsn           = previousRecord.High;
            result.RecordAppendOptions   = recordAppendOptions;
            result.ReservationCollection = lrc;

            result.Start();

            return(result);
        }
Esempio n. 8
0
 public SequenceNumber Append(
     IList <ArraySegment <byte> > data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions)
 {
     return(Append(
                data,
                userRecord,
                previousRecord,
                recordAppendOptions,
                null));
 }
Esempio n. 9
0
        public SequenceNumber ReserveAndAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber userRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            params long[] reservations)
        {
            long totalRecordSize;
            LogReservationCollection lrc;

            this.store.ValidateSequenceNumber(
                ref userRecord,
                SequenceNumberConstraint.Arbitrary,
                "userRecord");
            this.store.ValidateSequenceNumber(
                ref previousRecord,
                SequenceNumberConstraint.Arbitrary,
                "previousRecord");

            totalRecordSize = ValidateData(data);
            lrc             = ValidateReservationCollection(reservationCollection);
            if (lrc == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservationCollection"));
            }
            if (reservations == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservations"));
            }
            ValidateReservations(reservations);

            EnsureMarshalContext();

            LogReserveAndAppendState state = new LogReserveAndAppendState();

            state.RecordSequence        = this;
            state.Data                  = data;
            state.TotalRecordSize       = totalRecordSize;
            state.UserLsn               = userRecord.High;
            state.PreviousLsn           = previousRecord.High;
            state.RecordAppendOptions   = recordAppendOptions;
            state.ReservationCollection = lrc;
            state.Reservations          = reservations;

            state.Start();

            return(new SequenceNumber(state.ResultLsn));
        }
Esempio n. 10
0
 public IAsyncResult BeginAppend(
     ArraySegment <byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     AsyncCallback callback,
     object state)
 {
     return(BeginAppend(new ArraySegment <byte>[] { data },
                        nextUndoRecord,
                        previousRecord,
                        recordAppendOptions,
                        callback,
                        state));
 }
Esempio n. 11
0
 public SequenceNumber ReserveAndAppend(
     ArraySegment <byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection,
     params long[] reservations)
 {
     return(ReserveAndAppend(new ArraySegment <byte>[] { data },
                             nextUndoRecord,
                             previousRecord,
                             recordAppendOptions,
                             reservationCollection,
                             reservations));
 }
Esempio n. 12
0
 public IAsyncResult BeginAppend(
     IList <ArraySegment <byte> > data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     AsyncCallback callback,
     object state)
 {
     return(BeginAppend(
                data,
                userRecord,
                previousRecord,
                recordAppendOptions,
                null,
                callback,
                state));
 }
Esempio n. 13
0
        public SequenceNumber Append(
            IList <ArraySegment <byte> > data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions)
        {
            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            if ((this.access & FileAccess.Write) == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported(SR.NotSupported_ReadOnly));
            }

            if (recordAppendOptions > (RecordAppendOptions.ForceAppend | RecordAppendOptions.ForceFlush) ||
                recordAppendOptions < RecordAppendOptions.None)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("recordAppendOptions"));
            }

            SequenceNumber sn;
            bool           forceFlush = (recordAppendOptions & RecordAppendOptions.ForceFlush) != 0;

            try
            {
                sn = frsHelper.Append(data, nextUndoRecord, previousRecord, forceFlush);
            }
            catch (SequenceFullException)
            {
                RaiseTailPinnedEvent();

                if (this.RetryAppend)
                {
                    sn = frsHelper.Append(data, nextUndoRecord, previousRecord, forceFlush);
                }
                else
                {
                    throw;
                }
            }

            return(sn);
        }
 public static Task<SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions)
 {
     return
         Task.Factory.FromAsync(
             (callback, state) =>
             ((LogRecordSequence)state).BeginAppend(
                 data,
                 nextUndoRecord,
                 previousRecord,
                 recordAppendOptions,
                 callback,
                 state),
             sequence.EndAppend,
             sequence);
 }
Esempio n. 15
0
 public static Task <SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     ArraySegment <byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions)
 {
     return
         (Task.Factory.FromAsync(
              (callback, state) =>
              ((LogRecordSequence)state).BeginAppend(
                  data,
                  nextUndoRecord,
                  previousRecord,
                  recordAppendOptions,
                  callback,
                  state),
              sequence.EndAppend,
              sequence));
 }
 public static Task<SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     IList<ArraySegment<byte>> data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection)
 {
     return
         Task.Factory.FromAsync(
             (callback, state) =>
             ((LogRecordSequence)state).BeginAppend(
                 data,
                 userRecord,
                 previousRecord,
                 recordAppendOptions,
                 reservationCollection,
                 callback,
                 state),
             sequence.EndAppend,
             sequence);
 }
Esempio n. 17
0
 public static Task <SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     IList <ArraySegment <byte> > data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection)
 {
     return
         (Task.Factory.FromAsync(
              (callback, state) =>
              ((LogRecordSequence)state).BeginAppend(
                  data,
                  userRecord,
                  previousRecord,
                  recordAppendOptions,
                  reservationCollection,
                  callback,
                  state),
              sequence.EndAppend,
              sequence));
 }
Esempio n. 18
0
 public Task<SequenceNumber> Append(
     IList<ArraySegment<byte>> record,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions options)
 {
     this.EnsureAvailableSpace();
     return this.log.AppendAsync(record, nextUndoRecord, previousRecord, options);
 }
Esempio n. 19
0
        public SequenceNumber Append(
            IList<ArraySegment<byte>> data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions)
        {
            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            if ((this.access & FileAccess.Write) == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported(SR.NotSupported_ReadOnly));
            }

            if (recordAppendOptions > (RecordAppendOptions.ForceAppend | RecordAppendOptions.ForceFlush) ||
               recordAppendOptions < RecordAppendOptions.None)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("recordAppendOptions"));
            }

            SequenceNumber sn;
            bool forceFlush = (recordAppendOptions & RecordAppendOptions.ForceFlush) != 0;
            try
            {
                sn = frsHelper.Append(data, nextUndoRecord, previousRecord, forceFlush);
            }
            catch (SequenceFullException)
            {
                RaiseTailPinnedEvent();

                if (this.RetryAppend)
                {
                    sn = frsHelper.Append(data, nextUndoRecord, previousRecord, forceFlush);
                }
                else
                {
                    throw;
                }
            }

            return sn;
        }
Esempio n. 20
0
 public SequenceNumber Append(
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions)
 {
     return Append(new ArraySegment<byte>[] { data },
                   nextUndoRecord,
                   previousRecord,
                   recordAppendOptions);
 }
Esempio n. 21
0
        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);
                }
            }
        }
Esempio n. 22
0
 public IAsyncResult BeginReserveAndAppend(
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection,
     long[] reservations,
     AsyncCallback callback,
     object state)
 {
     return BeginReserveAndAppend(new ArraySegment<byte>[] { data },
                                  nextUndoRecord,
                                  previousRecord,
                                  recordAppendOptions,
                                  reservationCollection,
                                  reservations,
                                  callback,
                                  state);
 }
Esempio n. 23
0
        public IAsyncResult BeginReserveAndAppend(
            IList<ArraySegment<byte>> data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            long[] reservations,
            AsyncCallback callback,
            object state)
        {
            SequenceNumber result = ReserveAndAppend(data,
                                                      nextUndoRecord,
                                                      previousRecord,
                                                      recordAppendOptions,
                                                      reservationCollection,
                                                      reservations);

            return new FileRecordSequenceCompletedAsyncResult(result, callback, state, Work.ReserveAndAppend);
        }
Esempio n. 24
0
 public SequenceNumber ReserveAndAppend(
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection,
     params long[] reservations)
 {
     return ReserveAndAppend(new ArraySegment<byte>[] { data },
                             nextUndoRecord,
                             previousRecord,
                             recordAppendOptions,
                             reservationCollection,
                             reservations);
 }
Esempio n. 25
0
        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);
                    }
                }
            }
        }