private bool ProcessResponse(MailboxAssociationEwsBinding ewsBinding, UpdateMailboxAssociationResponseType response, MailboxAssociation association, IMailboxLocator mailboxLocator) { if (response != null && response.ResponseMessages != null && response.ResponseMessages.Items != null && response.ResponseMessages.Items.Length > 0) { foreach (ResponseMessageType responseMessageType in response.ResponseMessages.Items) { if (responseMessageType.ResponseClass == ResponseClassType.Success) { InProcessAssociationReplicator.Tracer.TraceDebug <MailboxAssociation>((long)this.GetHashCode(), "ReplicateAssociation succeeded. Association {0}", association); this.ProcessSuccess(association, InProcessAssociationReplicator.GetEwsVersionNumber(ewsBinding), mailboxLocator); return(true); } string failureDescription = string.Format(CultureInfo.InvariantCulture, "ReplicateAssociation Failed. Association {0}. ResponseClass={1}, ResponseCode={2}, MessageText={3}", new object[] { association, responseMessageType.ResponseClass, responseMessageType.ResponseCode, responseMessageType.MessageText }); this.ProcessFailure(association, failureDescription); } } else { string failureDescription2 = string.Format(CultureInfo.InvariantCulture, "ReplicateAssociation Failed with empty response. Association {0}.", new object[] { association }); this.ProcessFailure(association, failureDescription2); } return(false); }
private void ProcessFailure(MailboxAssociation association, string failureDescription) { association.LastSyncError = failureDescription; association.SyncAttempts++; if (InProcessAssociationReplicator.ShouldStopReplicatingAssociation(association)) { this.Logger.LogEvent(new SchemaBasedLogEvent <MailboxAssociationLogSchema.CommandExecution> { { MailboxAssociationLogSchema.CommandExecution.Command, "InProcessAssociationReplicator.Poison" }, { MailboxAssociationLogSchema.CommandExecution.GroupMailbox, association.Group }, { MailboxAssociationLogSchema.CommandExecution.UserMailboxes, association.User } }); association.SyncedVersion = int.MaxValue; } this.PerformanceTracker.IncrementFailedAssociationReplications(); this.LogError(failureDescription); }
internal static UpdateMailboxAssociationType CreateUpdateMailboxAssociationType(IMailboxLocator master, MailboxAssociation association) { ArgumentValidator.ThrowIfNull("association", association); return(new UpdateMailboxAssociationType { Master = InProcessAssociationReplicator.CreateMasterMailboxData(master), Association = EwsAssociationDataConverter.Convert(association) }); }
private void ReplicateOutOfSyncAssociation(Func <IAssociationStore, IAssociationAdaptor> associationAdaptorCreator, IMailboxLocator masterLocator, params IMailboxLocator[] slaveLocators) { ArgumentValidator.ThrowIfNull("masterLocator", masterLocator); ArgumentValidator.ThrowIfNull("slaveLocators", slaveLocators); ArgumentValidator.ThrowIfZeroOrNegative("slaveLocators.Length", slaveLocators.Length); GroupMailboxAccessLayer.Tracer.TraceDebug <IMailboxLocator, int>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Replicating data from mailbox: {0}. Number of out of sync mailboxes: {1}", masterLocator, slaveLocators.Length); using (IAssociationStore associationStore = this.storeProviderBuilder.Create(masterLocator, this.PerformanceTracker)) { IAssociationAdaptor associationAdaptor = associationAdaptorCreator(associationStore); InProcessAssociationReplicator replicator = new InProcessAssociationReplicator(this.Logger, this.PerformanceTracker, OpenAsAdminOrSystemServiceBudgetTypeType.RunAsBackgroundLoad); ICollection <MailboxAssociation> associations = slaveLocators.Select(new Func <IMailboxLocator, MailboxAssociation>(associationAdaptor.GetAssociation)); this.ReplicateAssociations(replicator, associationAdaptor, associations); } }
private bool ReplicateAssociations(InProcessAssociationReplicator replicator, IAssociationAdaptor associationAdaptor, IEnumerable <MailboxAssociation> associations) { ArgumentValidator.ThrowIfNull("replicator", replicator); ArgumentValidator.ThrowIfNull("associationAdaptor", associationAdaptor); ArgumentValidator.ThrowIfNull("associations", associations); bool flag = true; foreach (MailboxAssociation mailboxAssociation in associations) { GroupMailboxAccessLayer.Tracer.TraceDebug <MailboxAssociation>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateAssociations. Replicating association {0}", mailboxAssociation); flag &= replicator.ReplicateAssociation(associationAdaptor, new MailboxAssociation[] { mailboxAssociation }); } return(flag); }
private void ReplicateOutOfSyncAssociation(Func <IAssociationStore, IAssociationAdaptor> associationAdaptorCreator, IMailboxLocator masterLocator) { ArgumentValidator.ThrowIfNull("masterLocator", masterLocator); GroupMailboxAccessLayer.Tracer.TraceDebug <IMailboxLocator>((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Replicating data from mailbox: {0}.", masterLocator); using (IAssociationStore storeProvider = this.storeProviderBuilder.Create(masterLocator, this.PerformanceTracker)) { IAssociationAdaptor associationAdaptor = associationAdaptorCreator(storeProvider); InProcessAssociationReplicator replicator = new InProcessAssociationReplicator(this.Logger, this.PerformanceTracker, OpenAsAdminOrSystemServiceBudgetTypeType.RunAsBackgroundLoad); IEnumerable <MailboxAssociation> associations = from association in associationAdaptor.GetAllAssociations() where association.IsOutOfSync(storeProvider.MailboxLocator.IdentityHash) select association; if (this.ReplicateAssociations(replicator, associationAdaptor, associations)) { GroupMailboxAccessLayer.Tracer.TraceDebug((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. All replication succeeded. Clearing mailbox flags"); ExDateTime nextReplicationTime = ExDateTime.UtcNow.Add(GroupMailboxAccessLayer.TimeBetweenMailboxReplicationProcessing); storeProvider.SaveMailboxSyncStatus(nextReplicationTime); } else { GroupMailboxAccessLayer.Tracer.TraceError((long)this.GetHashCode(), "GroupMailboxAccessLayer::ReplicateOutOfSyncAssociation. Not all replication succeeded. Keeping out of sync flags."); } } }
private bool ExecuteReplicationToMailbox(IAssociationAdaptor masterAdaptor, MailboxAssociation association) { bool replicationSucceeded = false; Exception exception = null; try { GrayException.MapAndReportGrayExceptions(delegate() { try { MailboxAssociationEwsBinding.ExecuteEwsOperationWithRetry("ReplicateAssociation", delegate { using (MailboxAssociationEwsBinding mailboxAssociationEwsBinding = this.CreateMailboxAssociationEwsBinding(masterAdaptor.MasterLocator, association)) { UpdateMailboxAssociationType updateMailboxAssociation = InProcessAssociationReplicator.CreateUpdateMailboxAssociationType(masterAdaptor.MasterLocator, association); UpdateMailboxAssociationResponseType response = mailboxAssociationEwsBinding.UpdateMailboxAssociation(updateMailboxAssociation); replicationSucceeded = this.ProcessResponse(mailboxAssociationEwsBinding, response, association, masterAdaptor.AssociationStore.MailboxLocator); } }); } catch (MailboxNotFoundException exception4) { replicationSucceeded = this.DeleteMailboxNotFoundAssociation(association, masterAdaptor, exception4); if (!replicationSucceeded) { exception = exception4; } } catch (BackEndLocatorException exception5) { exception = exception5; } catch (WebException exception6) { exception = exception6; } catch (InvalidOperationException exception7) { exception = exception7; } catch (LogonAsNetworkServiceException exception8) { if (!ExEnvironment.IsTest) { throw; } exception = exception8; } }); } catch (GrayException exception) { GrayException exception9; exception = exception9; } catch (SoapException exception2) { exception = exception2; } catch (IOException exception3) { exception = exception3; } if (exception != null) { this.ProcessFailure(association, exception.ToString()); replicationSucceeded = false; } return(replicationSucceeded); }