Ejemplo n.º 1
0
        private static LegacyReservationType ConvertReservationFlagsToLegacy(ReservationFlags flags, bool expiring)
        {
            LegacyReservationType result;

            if (flags.HasFlag(ReservationFlags.Read))
            {
                if (expiring)
                {
                    result = LegacyReservationType.ExpiredRead;
                }
                else
                {
                    result = LegacyReservationType.Read;
                }
            }
            else if (expiring)
            {
                result = LegacyReservationType.ExpiredWrite;
            }
            else
            {
                result = LegacyReservationType.Write;
            }
            return(result);
        }
Ejemplo n.º 2
0
 public IReservation GetReservation(Guid mdbGuid, ReservationFlags flags)
 {
     flags &= (ReservationFlags.Read | ReservationFlags.Write);
     foreach (IReservation reservation in this.Reservations)
     {
         if (reservation.ResourceId == mdbGuid && reservation.Flags.HasFlag(flags))
         {
             return(reservation);
         }
     }
     return(null);
 }
Ejemplo n.º 3
0
 public RemoteReservation(Guid reservationID, string serverFQDN, NetworkCredential credentials, Guid mailboxGuid, Guid mdbGuid, ReservationFlags flags)
 {
     this.reservationId = reservationID;
     this.serverFQDN    = serverFQDN;
     this.credentials   = credentials;
     this.mailboxGuid   = mailboxGuid;
     this.mdbGuid       = mdbGuid;
     this.flags         = flags;
 }
Ejemplo n.º 4
0
        public static RemoteReservation Create(string serverFQDN, NetworkCredential credentials, Guid mailboxGuid, TenantPartitionHint partitionHint, Guid mdbGuid, ReservationFlags flags)
        {
            RemoteReservation result;

            using (MailboxReplicationProxyClient mailboxReplicationProxyClient = MailboxReplicationProxyClient.CreateWithoutThrottling(serverFQDN, credentials, mailboxGuid, mdbGuid))
            {
                Guid reservationID;
                if (mailboxReplicationProxyClient.ServerVersion[37])
                {
                    byte[] partitionHintBytes = (partitionHint != null) ? partitionHint.GetPersistablePartitionHint() : null;
                    reservationID = ((IMailboxReplicationProxyService)mailboxReplicationProxyClient).IReservationManager_ReserveResources(mailboxGuid, partitionHintBytes, mdbGuid, (int)flags);
                }
                else if (mailboxReplicationProxyClient.ServerVersion[28])
                {
                    reservationID = Guid.NewGuid();
                    LegacyReservationStatus legacyReservationStatus = (LegacyReservationStatus)((IMailboxReplicationProxyService)mailboxReplicationProxyClient).IMailbox_ReserveResources(reservationID, mdbGuid, (int)RemoteReservation.ConvertReservationFlagsToLegacy(flags, true));
                    if (legacyReservationStatus != LegacyReservationStatus.Success)
                    {
                        throw new CapacityExceededReservationException(string.Format("{0}:{1}:{2}", serverFQDN, mdbGuid, flags), 1);
                    }
                }
                else
                {
                    reservationID = RemoteReservation.DownlevelReservationId;
                }
                result = new RemoteReservation(reservationID, serverFQDN, credentials, mailboxGuid, mdbGuid, flags);
            }
            return(result);
        }
Ejemplo n.º 5
0
        public static ReservationBase CreateReservation(Guid mailboxGuid, TenantPartitionHint partitionHint, Guid resourceId, ReservationFlags flags, string clientName)
        {
            ReservationBase result;

            lock (ReservationManager.Locker)
            {
                ReservationBase reservationBase = ReservationBase.CreateReservation(mailboxGuid, partitionHint, resourceId, flags, clientName);
                ReservationManager.reservations.TryInsertSliding(reservationBase.ReservationId, reservationBase, ConfigBase <MRSConfigSchema> .GetConfig <TimeSpan>("ReservationExpirationInterval"));
                reservationBase.AddReleaseAction(new Action <ReservationBase>(ReservationManager.ReleaseReservation));
                result = reservationBase;
            }
            return(result);
        }
Ejemplo n.º 6
0
        public void ReserveResource(Guid mailboxGuid, TenantPartitionHint partitionHint, ADObjectId resourceId, ReservationFlags flags)
        {
            string serverFQDN = null;

            if (!(resourceId.ObjectGuid == MRSResource.Id.ObjectGuid))
            {
                DatabaseInformation databaseInformation = MapiUtils.FindServerForMdb(resourceId, null, null, FindServerFlags.None);
                if (databaseInformation.ServerVersion < Server.E15MinVersion)
                {
                    return;
                }
                if (!databaseInformation.IsOnThisServer)
                {
                    serverFQDN = databaseInformation.ServerFqdn;
                }
            }
            this.AddReservation(ReservationWrapper.CreateReservation(serverFQDN, null, mailboxGuid, partitionHint, resourceId.ObjectGuid, flags));
        }
Ejemplo n.º 7
0
        public static ReservationBase CreateReservation(Guid mailboxGuid, TenantPartitionHint partitionHint, Guid resourceId, ReservationFlags flags, string clientName)
        {
            ReservationBase result;

            using (DisposeGuard disposeGuard = default(DisposeGuard))
            {
                SettingsContextBase settingsContextBase = new MailboxSettingsContext(mailboxGuid, null);
                if (partitionHint != null)
                {
                    settingsContextBase = new OrganizationSettingsContext(OrganizationId.FromExternalDirectoryOrganizationId(partitionHint.GetExternalDirectoryOrganizationId()), settingsContextBase);
                }
                ReservationBase reservationBase;
                if (resourceId == MRSResource.Id.ObjectGuid)
                {
                    reservationBase = new MRSReservation();
                }
                else
                {
                    if (flags.HasFlag(ReservationFlags.Read))
                    {
                        reservationBase = new ReadReservation();
                    }
                    else
                    {
                        reservationBase = new WriteReservation();
                    }
                    settingsContextBase = new DatabaseSettingsContext(resourceId, settingsContextBase);
                }
                disposeGuard.Add <ReservationBase>(reservationBase);
                settingsContextBase           = new GenericSettingsContext("WorkloadType", reservationBase.WorkloadType.ToString(), settingsContextBase);
                reservationBase.MailboxGuid   = mailboxGuid;
                reservationBase.PartitionHint = partitionHint;
                reservationBase.ResourceId    = resourceId;
                reservationBase.Flags         = flags;
                reservationBase.ClientName    = clientName;
                using (settingsContextBase.Activate())
                {
                    reservationBase.ReserveResources();
                }
                disposeGuard.Success();
                result = reservationBase;
            }
            return(result);
        }
Ejemplo n.º 8
0
        public static IReservation CreateReservation(string serverFQDN, NetworkCredential credentials, Guid mailboxGuid, TenantPartitionHint partitionHint, Guid resourceId, ReservationFlags flags)
        {
            if (serverFQDN == null)
            {
                TestIntegration testIntegration = new TestIntegration(false);
                if ((flags.HasFlag(ReservationFlags.Read) && testIntegration.UseRemoteForSource) || (flags.HasFlag(ReservationFlags.Write) && testIntegration.UseRemoteForDestination))
                {
                    serverFQDN = CommonUtils.LocalComputerName;
                }
            }
            IReservation result = null;

            ExecutionContext.Create(new DataContext[]
            {
                new OperationDataContext("IReservationManager.ReserveResources", OperationType.None),
                new SimpleValueDataContext("MailboxGuid", mailboxGuid),
                new SimpleValueDataContext("ResourceId", resourceId),
                new SimpleValueDataContext("Flags", flags)
            }).Execute(delegate
            {
                if (serverFQDN == null)
                {
                    result = ReservationManager.CreateReservation(mailboxGuid, partitionHint, resourceId, flags, CommonUtils.LocalComputerName);
                    return;
                }
                result = RemoteReservation.Create(serverFQDN, credentials, mailboxGuid, partitionHint, resourceId, flags);
            });
            return(new ReservationWrapper(result));
        }