예제 #1
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);
        }
예제 #2
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);
        }