Esempio n. 1
0
        internal IntPtr ToNative(PinCollection pinCollection)
        {
            var nativeContextMap = new NativeTypes.FABRIC_EVENT_CONTEXT_MAP();

            if (this.Context != null && this.Context.Any())
            {
                int count = this.Context.ContainsKey(ChaosConstants.KeyForDummyContextEntry) ? this.Context.Count - 1 : this.Context.Count;
                var nativeContextArray = new NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM[count];

                for (int i = 0, j = 0; i < this.Context.Count; ++i)
                {
                    if (!this.Context.ElementAt(i).Key.Equals(ChaosConstants.KeyForDummyContextEntry, StringComparison.OrdinalIgnoreCase))
                    {
                        nativeContextArray[j].Key   = pinCollection.AddObject(this.Context.ElementAt(i).Key);
                        nativeContextArray[j].Value = pinCollection.AddObject(this.Context.ElementAt(i).Value);

                        ++j;
                    }
                }

                nativeContextMap.Count = (uint)nativeContextArray.Length;
                nativeContextMap.Items = pinCollection.AddBlittable(nativeContextArray);
            }

            var ex1 = new NativeTypes.FABRIC_CHAOS_PARAMETERS_EX1
            {
                ClusterHealthPolicy = this.ClusterHealthPolicy.ToNative(pinCollection)
            };

            var ex2 = new NativeTypes.FABRIC_CHAOS_PARAMETERS_EX2
            {
                ChaosTargetFilter = this.ChaosTargetFilter == null ? IntPtr.Zero : this.ChaosTargetFilter.ToNative(pinCollection)
            };

            ex1.Reserved = pinCollection.AddBlittable(ex2);

            var nativeChaosParameters = new NativeTypes.FABRIC_CHAOS_PARAMETERS
            {
                MaxClusterStabilizationTimeoutInSeconds = Convert.ToUInt32(this.MaxClusterStabilizationTimeout.TotalSeconds),
                MaxConcurrentFaults                = Convert.ToUInt32(this.MaxConcurrentFaults),
                EnableMoveReplicaFaults            = NativeTypes.ToBOOLEAN(this.EnableMoveReplicaFaults),
                WaitTimeBetweenIterationsInSeconds = Convert.ToUInt32(this.WaitTimeBetweenIterations.TotalSeconds),
                WaitTimeBetweenFaultsInSeconds     = Convert.ToUInt32(this.WaitTimeBetweenFaults.TotalSeconds),
                TimeToRunInSeconds = Convert.ToUInt32(this.TimeToRun.TotalSeconds),
                Context            = nativeContextMap.Count > 0 ? pinCollection.AddBlittable(nativeContextMap) : IntPtr.Zero,
                Reserved           = pinCollection.AddBlittable(ex1)
            };

            return(pinCollection.AddBlittable(nativeChaosParameters));
        }
Esempio n. 2
0
        internal static unsafe ChaosParameters CreateFromNative(IntPtr nativeRaw)
        {
            NativeTypes.FABRIC_CHAOS_PARAMETERS native = *(NativeTypes.FABRIC_CHAOS_PARAMETERS *)nativeRaw;

            TimeSpan maxClusterStabilizationTimeout =
                TimeSpan.FromSeconds(native.MaxClusterStabilizationTimeoutInSeconds);

            var maxConcurrentFaults = native.MaxConcurrentFaults;

            TimeSpan waitTimeBetweenIterations = TimeSpan.FromSeconds(native.WaitTimeBetweenIterationsInSeconds);

            TimeSpan waitTimeBetweenFaults = TimeSpan.FromSeconds(native.WaitTimeBetweenFaultsInSeconds);

            TimeSpan timeToRun = TimeSpan.FromSeconds(native.TimeToRunInSeconds);

            var enabledMoveReplicaFaults = NativeTypes.FromBOOLEAN(native.EnableMoveReplicaFaults);

            var contextMap = new Dictionary <string, string>();

            if (native.Context != IntPtr.Zero)
            {
                var nativeMapPtr = (NativeTypes.FABRIC_EVENT_CONTEXT_MAP *)native.Context;
                var bytesPerItem = Marshal.SizeOf(typeof(NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM));
                for (int i = 0; i < nativeMapPtr->Count; ++i)
                {
                    var nativeItemPtr    = nativeMapPtr->Items + (i * bytesPerItem);
                    var nativeMapItemPtr = (NativeTypes.FABRIC_EVENT_CONTEXT_MAP_ITEM *)nativeItemPtr;

                    contextMap.Add(
                        NativeTypes.FromNativeString(nativeMapItemPtr->Key),
                        NativeTypes.FromNativeString(nativeMapItemPtr->Value));
                }
            }

            var parameters = new ChaosParameters(
                maxClusterStabilizationTimeout,
                maxConcurrentFaults,
                enabledMoveReplicaFaults,
                timeToRun,
                contextMap,
                waitTimeBetweenIterations,
                waitTimeBetweenFaults);

            if (native.Reserved != IntPtr.Zero)
            {
                var ex1 = *((NativeTypes.FABRIC_CHAOS_PARAMETERS_EX1 *)native.Reserved);

                if (ex1.ClusterHealthPolicy != IntPtr.Zero)
                {
                    parameters.ClusterHealthPolicy = ClusterHealthPolicy.FromNative(ex1.ClusterHealthPolicy);
                }

                if (ex1.Reserved != IntPtr.Zero)
                {
                    var ex2 = *(NativeTypes.FABRIC_CHAOS_PARAMETERS_EX2 *)ex1.Reserved;
                    parameters.ChaosTargetFilter = ChaosTargetFilter.FromNative(ex2.ChaosTargetFilter);
                }
            }

            return(parameters);
        }