Example #1
0
        // Create a client, loaded in a new app domain.
        public T NewClient <T>(string ClusterId, int ClientNumber, Action <ClientConfiguration> customizer = null) where T : ClientWrapperBase
        {
            var ci   = Clusters[ClusterId];
            var name = string.Format("Client-{0}-{1}", ClusterId, ClientNumber);

            // clients are assigned to silos round-robin
            var gatewayport = ci.Silos[ClientNumber % ci.Silos.Count].NodeConfiguration.ProxyGatewayEndpoint.Port;

            WriteLog("Starting {0} connected to {1}", name, gatewayport);

            var clientArgs   = new object[] { name, gatewayport, ClusterId, customizer };
            var setup        = AppDomainSiloHandle.GetAppDomainSetupInfo();
            var clientDomain = AppDomain.CreateDomain(name, null, setup);

            T client = (T)clientDomain.CreateInstanceFromAndUnwrap(
                Assembly.GetExecutingAssembly().Location, typeof(T).FullName, false,
                BindingFlags.Default, null, clientArgs, CultureInfo.CurrentCulture,
                new object[] { });

            lock (activeClients)
            {
                activeClients.Add(clientDomain);
            }

            WriteLog("Started {0} connected", name);

            return(client);
        }
Example #2
0
        private async Task <SiloHandle> StartSilo(DirectoryInfo rootDir)
        {
            string siloName;

            Silo.SiloType siloType;
            if (this.siloIdx == 0)
            {
                // First silo
                siloName = Silo.PrimarySiloName;
                siloType = Silo.SiloType.Primary;
                // Setup configuration
                this.options = new TestClusterOptions(SiloCount);
                options.ClusterConfiguration.Globals.AssumeHomogenousSilosForTesting = false;
                options.ClusterConfiguration.Globals.TypeMapRefreshInterval          = refreshInterval;
                options.ClusterConfiguration.Globals.DefaultVersionSelectorStrategy  = VersionSelectorStrategy;
                options.ClusterConfiguration.Globals.DefaultCompatibilityStrategy    = CompatibilityStrategy;
                options.ClientConfiguration.Gateways = options.ClientConfiguration.Gateways.Take(1).ToList(); // Only use primary gw
                options.ClusterConfiguration.AddMemoryStorageProvider("Default");
                waitDelay = TestCluster.GetLivenessStabilizationTime(options.ClusterConfiguration.Globals, false);
            }
            else
            {
                // Secondary Silo
                siloName = $"Secondary_{siloIdx}";
                siloType = Silo.SiloType.Secondary;
            }

            var silo = AppDomainSiloHandle.Create(
                siloName,
                siloType,
                typeof(TestVersionGrains.VersionGrainsSiloBuilderFactory),
                this.options.ClusterConfiguration,
                this.options.ClusterConfiguration.Overrides[siloName],
                applicationBase: rootDir.FullName);

            if (this.siloIdx == 0)
            {
                // If it was the first silo, setup the client
                Client = new ClientBuilder()
                         .ConfigureApplicationParts(parts => parts.AddFromAppDomain().AddFromApplicationBaseDirectory())
                         .UseConfiguration(options.ClientConfiguration)
                         .Build();
                await Client.Connect();

                ManagementGrain = Client.GetGrain <IManagementGrain>(0);
            }

            this.deployedSilos.Add(silo);
            this.siloIdx++;

            return(silo);
        }
Example #3
0
        private SiloHandle StartSilo(string name, DirectoryInfo rootDir)
        {
            var siloType = (name == Silo.PrimarySiloName) ? Silo.SiloType.Primary : Silo.SiloType.Secondary;
            var silo     = AppDomainSiloHandle.Create(
                name,
                siloType,
                options.ClusterConfiguration,
                options.ClusterConfiguration.Overrides[name],
                new Dictionary <string, GeneratedAssembly>(),
                rootDir.FullName);

            return(silo);
        }
Example #4
0
 protected override void ConfigureTestCluster(TestClusterBuilder builder)
 {
     // The ActivationCount tests rely on CounterStatistic, which is a shared static value, so isolation
     // between silos is obtained using AppDomains.
     builder.CreateSiloAsync = AppDomainSiloHandle.CreateWithAssemblies(new[] { typeof(TestGrain).Assembly, typeof(SimpleGrain).Assembly });
 }