// 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); }
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); }
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); }
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 }); }