internal static string NotifyChangesByWorkload(Task task, IConfigurationSession configurationSession, Workload workload, IEnumerable <SyncChangeInfo> syncChangeInfos, bool fullSync, bool syncNow, ExecutionLog logger, Type client, out string notificationIdentifier)
        {
            Exception exception = null;

            notificationIdentifier = string.Empty;
            string text = string.Empty;

            try
            {
                CompliancePolicySyncNotificationClient compliancePolicySyncNotificationClient = AggregatedNotificationClients.workloadToNotificationClientsGetter[workload](configurationSession, new WriteVerboseDelegate(task.WriteVerbose));
                if (compliancePolicySyncNotificationClient != null)
                {
                    task.WriteVerbose(Strings.VerboseNotifyWorkloadWithChanges(workload.ToString(), string.Concat(from syncChangeInfo in syncChangeInfos
                                                                                                                  select syncChangeInfo.ToString())));
                    notificationIdentifier = compliancePolicySyncNotificationClient.NotifyPolicyConfigChanges(syncChangeInfos, fullSync, syncNow);
                    task.WriteVerbose(Strings.VerboseNotifyWorkloadWithChangesSuccess(workload.ToString(), notificationIdentifier));
                }
                else
                {
                    text = Strings.WarningNotificationClientIsMissing(workload.ToString());
                }
            }
            catch (CompliancePolicySyncNotificationClientException ex)
            {
                text      = Strings.ErrorMessageForNotificationFailure(workload.ToString(), ex.Message);
                exception = ex;
            }
            if (!string.IsNullOrEmpty(text))
            {
                logger.LogOneEntry(client.Name, string.Empty, ExecutionLog.EventType.Warning, string.Format("We failed to notify workload '{0}' with error message '{1}'", workload, text), exception);
                MonitoringItemErrorPublisher.Instance.PublishEvent("UnifiedPolicySync.SendNotificationError", UnifiedPolicyConfiguration.GetInstance().GetOrganizationIdKey(configurationSession), string.Format("Workload={0};Timestamp={1}", workload, DateTime.UtcNow), exception);
            }
            else
            {
                ExecutionLog.EventType eventType = ExecutionLog.EventType.Verbose;
                string   name          = client.Name;
                string   correlationId = notificationIdentifier;
                string   format        = "Notification '{0}' was sent to workload '{1}' with sync change info: '{2}'";
                object[] array         = new object[3];
                array[0] = notificationIdentifier;
                array[1] = workload;
                array[2] = string.Join(",", from x in syncChangeInfos
                                       select x.ToString());
                logger.LogOneEntry(eventType, name, correlationId, format, array);
            }
            return(text);
        }
 private void WriteSyncVerbose(List <ChangeNotificationData> syncData, Workload workload, bool isObjectLevelSync)
 {
     base.WriteVerbose(Strings.VerboseRetryDistributionNotifyingWorkload(workload.ToString(), isObjectLevelSync ? "object" : "delta"));
     foreach (ChangeNotificationData changeNotificationData in syncData)
     {
         base.WriteVerbose(Strings.VerboseRetryDistributionNotificationDetails(changeNotificationData.Id.ToString(), changeNotificationData.ChangeType.ToString(), changeNotificationData.ObjectType.ToString()));
     }
 }
Ejemplo n.º 3
0
        internal static BindingStorage CreateNewBindingStorage(ADObjectId tenantId, Workload workload, Guid policyId)
        {
            string         text           = workload.ToString() + policyId.ToString();
            BindingStorage bindingStorage = new BindingStorage
            {
                MasterIdentity = Guid.NewGuid(),
                Name           = text,
                PolicyId       = policyId,
                Workload       = workload
            };

            bindingStorage[ADObjectSchema.OrganizationalUnitRoot] = tenantId;
            bindingStorage.SetId(tenantId.GetDescendantId(PolicyStorage.PoliciesContainer).GetChildId(policyId.ToString()).GetChildId(text));
            return(bindingStorage);
        }
Ejemplo n.º 4
0
        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder().AddCommandLine(args).Build();

            var threads       = int.Parse(config["threads"] ?? _defaultThreads.ToString());
            var duration      = TimeSpan.FromSeconds(int.Parse(config["duration"] ?? _defaultDuration.TotalSeconds.ToString()));
            var syncPrimitive = (Sync)Enum.Parse(typeof(Sync),
                                                 config["sync"] ?? _defaultSync.ToString(), ignoreCase: true);
            var workload = (Workload)Enum.Parse(typeof(Workload),
                                                config["workload"] ?? _defaultWorkload.ToString(), ignoreCase: true);

            var workOutsideLock = int.Parse(config["workOutsideLock"] ?? _defaultWorkOutsideLock.ToString());
            var workInsideLock  = int.Parse(config["workInsideLock"] ?? _defaultWorkInsideLock.ToString());

            Console.WriteLine($"Duration: {duration}");
            Console.WriteLine($"Threads: {threads}");
            Console.WriteLine($"SyncPrimitive: {syncPrimitive}");
            Console.WriteLine($"Workload: {workload}");
            Console.WriteLine($"Work Outside Lock: {workOutsideLock}");
            Console.WriteLine($"Work Inside Lock: {workInsideLock}");
            Console.WriteLine();

            var sw = new Stopwatch();

            var threadObjects = new Thread[threads];

            for (var i = 0; i < threads; i++)
            {
                threadObjects[i] = new Thread(() =>
                {
                    if (syncPrimitive == Sync.NoLock)
                    {
                        while (sw.Elapsed < duration)
                        {
                            DoWork(workInsideLock);
                            DoWork(workOutsideLock);

                            Interlocked.Increment(ref _locksTaken);
                        }
                    }
                    else if (syncPrimitive == Sync.Lock)
                    {
                        while (sw.Elapsed < duration)
                        {
                            lock (_lock)
                            {
                                DoWork(workInsideLock);
                            }
                            DoWork(workOutsideLock);

                            Interlocked.Increment(ref _locksTaken);
                        }
                    }
                    else if (syncPrimitive == Sync.Rwls)
                    {
                        if (workload == Workload.Read)
                        {
                            while (sw.Elapsed < duration)
                            {
                                _readerWriterLockSlim.EnterReadLock();
                                try
                                {
                                    DoWork(workInsideLock);
                                }
                                finally
                                {
                                    _readerWriterLockSlim.ExitReadLock();
                                }
                                DoWork(workOutsideLock);

                                Interlocked.Increment(ref _locksTaken);
                            }
                        }
                    }
                });
            }

            sw.Start();
            for (var i = 0; i < threads; i++)
            {
                threadObjects[i].Start();
            }

            for (var i = 0; i < threads; i++)
            {
                threadObjects[i].Join();
            }
            sw.Stop();

            Console.WriteLine($"Actual Duration: {sw.Elapsed}");
            Console.WriteLine($"Total Locks Taken: {_locksTaken.ToString("N0")}");

            var locksTakenPerSecond = (int)Math.Round(_locksTaken / sw.Elapsed.TotalSeconds, 0);

            Console.WriteLine($"Locks Taken per Second: {locksTakenPerSecond.ToString("N0")}");
        }