/// <summary> /// Creates marker for package. /// </summary> /// <param name="session">The session.</param> /// <param name="package">The package.</param> /// <returns>Package marker</returns> public static PackageMarker CreateForPackage(Session session, Package package) { var result = new PackageMarker(session) { ApplicationName = package.ApplicationName, SenderNodeId = package.SenderNodeId, RecipientNodeId = package.RecipientNodeId, PackageId = package.PackageId, PackageType = package.PackageType, PackageDateTime = package.PackageDateTime.ToUniversalTime(), UserName = package.UserName }; if (package.PackageType == PackageType.Snapshot) { var recipient = ReplicationNode.FindNode(package.Session, result.RecipientNodeId); var sender = ReplicationNode.GetCurrentNode(package.Session); var num = XafDeltaModule.Instance.RoutingType == RoutingType.BroadcastRouting ? sender.LastSavedPackageNumber : recipient.LastSavedPackageNumber; if (recipient != null) { result.LastSavedPackageNumber = num; } } return(result); }
/// <summary> /// Restore the last loaded number from marker. /// </summary> /// <param name="context">The context.</param> /// <param name="snapshotObjectSpace">The snapshot object space.</param> private static void restoreLastLoadedNum(LoadPackageContext context, IObjectSpace snapshotObjectSpace) { var marker = PackageMarker.GetInstance(snapshotObjectSpace); if (marker == null) { return; } var sender = ReplicationNode.FindNode(context.ObjectSpace, marker.SenderNodeId); if (sender != null) { sender.LastLoadedPackageNumber = marker.LastSavedPackageNumber; } }
/// <summary> /// Loads the package. /// </summary> /// <param name="context">The load package params.</param> public bool LoadPackage(LoadPackageContext context) { // prevent loading self packages if (context.Package.SenderNodeId == context.CurrentNodeId) { return(false); } // don't load packages builded before last loaded snapshot var lastLoadedSnapshotDateTime = (from c in context.ObjectSpace.GetObjects <ReplicationNode>() select c.InitDateTime).Max(); if (context.Package.PackageDateTime < lastLoadedSnapshotDateTime) { return(true); } var senderNode = ReplicationNode.FindNode(context.ObjectSpace, context.Package.SenderNodeId); context.Worker.ReportProgress(string.Format(Localizer.LoadingPackage, context.Package)); var loadResult = false; if (packageIsValid(context, senderNode)) { Owner.DoBeforeLoadPackage(new LoadPackageEventArgs(context.Package)); context.Package.CreateLogRecord(PackageEventType.Loading, ""); var errorString = ""; switch (context.Package.PackageType) { case PackageType.Protocol: errorString = Owner.ProtocolReplicationService.LoadProtocolPackage(context); break; case PackageType.Snapshot: errorString = Owner.SnapshotService.LoadSnapshotPackage(context); break; } loadResult = string.IsNullOrEmpty(errorString); // rollback changes on error or abort if (!loadResult) { Owner.DoPackageLoadingError(new PackageLoadingErrorArgs(context, errorString)); context.ObjectSpace.Rollback(); // add and save log record context.Package.CreateLogRecord(PackageEventType.Failed, errorString); context.ObjectSpace.CommitChanges(); context.Worker.ReportError(Localizer.PackageLoadingIsFailed, context.Package); } else { // update last loaded package id for sender node senderNode = senderNode ?? ReplicationNode.FindNode(context.ObjectSpace, context.Package.SenderNodeId); if (senderNode != null) { switch (context.Package.PackageType) { case PackageType.Protocol: senderNode.LastLoadedPackageNumber = context.Package.PackageId; break; case PackageType.Snapshot: senderNode.LastLoadedSnapshotNumber = context.Package.PackageId; senderNode.InitDateTime = context.Package.PackageDateTime; break; } } context.Package.CreateLogRecord(PackageEventType.Loaded, ""); // save changes context.ObjectSpace.CommitChanges(); Owner.DoAfterLoadPackage(new LoadPackageEventArgs(context.Package)); context.Worker.ReportProgress(Color.Blue, Localizer.PackageLoadingCompleted, context.Package); } } else { Owner.DoInvalidPackage(new InvalidPackageArgs(context)); context.Worker.ReportError(Localizer.PackageRejected, context.Package); } return(loadResult); }