/// <summary> /// Initializes a new instance of the <see cref="Sharding" /> class. /// <para>Bootstrap Elastic Scale by creating a new shard map manager and a shard map on the shard map manager database if necessary.</para> /// </summary> /// <param name="catalogDatabase">The catalog database.</param> /// <param name="connectionString">The connection string.</param> /// <param name="catalogRepository">The catalog repository.</param> /// <param name="tenantRepository">The tenant repository.</param> /// <param name="utilities">The utilities class.</param> /// <exception cref="System.ApplicationException">Error in sharding initialisation.</exception> public Sharding(string catalogDatabase, string connectionString, ICatalogRepository catalogRepository, ITenantRepository tenantRepository, IUtilities utilities) { try { _catalogRepository = catalogRepository; _tenantRepository = tenantRepository; _utilities = utilities; // Deploy shard map manager // if shard map manager exists, refresh content, else create it, then add content ShardMapManager smm; ShardMapManager = !ShardMapManagerFactory.TryGetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy, out smm) ? ShardMapManagerFactory.CreateSqlShardMapManager(connectionString) : smm; // check if shard map exists and if not, create it ListShardMap <int> sm; ShardMap = !ShardMapManager.TryGetListShardMap(catalogDatabase, out sm) ? ShardMapManager.CreateListShardMap <int>(catalogDatabase) : sm; } catch (Exception exception) { Trace.TraceError(exception.Message, "Error in sharding initialisation."); } }
// Bootstrap Elastic Scale by creating a new shard map manager and a shard map on // the shard map manager database if necessary. public ShardingClient(string shardMapManagerServer, string shardMapManagerDb, string shardMapManagerConnString, string shardMapName = "ONETUG_DEMO") { // Connection string with administrative credentials for the root database var connStrBldr = new SqlConnectionStringBuilder(shardMapManagerConnString); connStrBldr.DataSource = shardMapManagerServer; connStrBldr.InitialCatalog = shardMapManagerDb; // Deploy shard map manager. if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connStrBldr.ConnectionString, ShardMapManagerLoadPolicy.Lazy, out var existingShardMapManager)) { ShardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(connStrBldr.ConnectionString); } else { ShardMapManager = existingShardMapManager; } if (!ShardMapManager.TryGetListShardMap <int>(shardMapName, out var existingListShardMap)) { ShardMap = ShardMapManager.CreateListShardMap <int>(shardMapName); } else { ShardMap = existingListShardMap; } }
// Bootstrap Elastic Scale by creating a new shard map manager and a shard map on // the shard map manager database if necessary. public Sharding(string smmserver, string smmdatabase, string smmconnstr) { // Connection string with administrative credentials for the root database SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder(smmconnstr); connStrBldr.DataSource = smmserver; connStrBldr.InitialCatalog = smmdatabase; // Deploy shard map manager. ShardMapManager smm; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connStrBldr.ConnectionString, ShardMapManagerLoadPolicy.Lazy, out smm)) { this.ShardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(connStrBldr.ConnectionString); } else { this.ShardMapManager = smm; } ListShardMap <int> sm; if (!ShardMapManager.TryGetListShardMap <int>("ElasticScaleWithEF", out sm)) { this.ShardMap = ShardMapManager.CreateListShardMap <int>("ElasticScaleWithEF"); } else { this.ShardMap = sm; } }
/// <summary> /// Initializes a new instance of the <see cref="Sharding" /> class. /// <para>Bootstrap Elastic Scale by creating a new shard map manager and a shard map on the shard map manager database if necessary.</para> /// </summary> /// <param name="catalogConfig">The catalog configuration.</param> /// <param name="databaseConfig">The database configuration.</param> /// <param name="tenantsRepository">The tenants repository.</param> /// <param name="helper">The helper.</param> public Sharding(CatalogConfig catalogConfig, DatabaseConfig databaseConfig, ITenantsRepository tenantsRepository, IHelper helper) { try { _tenantsRepository = tenantsRepository; _helper = helper; var smmconnstr = _helper.GetSqlConnectionString(databaseConfig, catalogConfig); // Deploy shard map manager // if shard map manager exists, refresh content, else create it, then add content ShardMapManager smm; ShardMapManager = !ShardMapManagerFactory.TryGetSqlShardMapManager(smmconnstr, ShardMapManagerLoadPolicy.Lazy, out smm) ? ShardMapManagerFactory.CreateSqlShardMapManager(smmconnstr) : smm; // check if shard map exists and if not, create it ListShardMap <int> sm; ShardMap = !ShardMapManager.TryGetListShardMap(catalogConfig.CatalogDatabase, out sm) ? ShardMapManager.CreateListShardMap <int>(catalogConfig.CatalogDatabase) : sm; } catch (Exception ex) { // _logger.LogError(0, ex, "Error in sharding initialisation."); throw new ApplicationException("Error in sharding initialisation."); } }
public void RegisterNewTenantIfNotExists(long tenantId) { SqlConnectionStringBuilder smConnectionString = new SqlConnectionStringBuilder(_shardingManagerOptions.ShardMap); ShardMapManager smm; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(_shardingManagerOptions.ShardMapManager, ShardMapManagerLoadPolicy.Lazy, out smm)) { throw new InvalidOperationException("Error accessing shard map manager database"); } ListShardMap <long> sm; if (!smm.TryGetListShardMap <long>(ElasticScaleConstants.ListMapName, out sm)) { throw new InvalidOperationException("Error accessing list shard map of the sharding map manager database"); } ShardLocation shardLocation = new ShardLocation(smConnectionString.DataSource, smConnectionString.InitialCatalog); Shard shard; if (!sm.TryGetShard(shardLocation, out shard)) { shard = sm.CreateShard(shardLocation); } if (!sm.TryGetMappingForKey(tenantId, out _)) { sm.CreatePointMapping(tenantId, shard); } }
/// <summary> /// Tries to get the ShardMapManager that is stored in the specified database. /// </summary> public static ShardMapManager TryGetShardMapManager(string shardMapManagerServerName, string shardMapManagerDatabaseName) { string shardMapManagerConnectionString = ShardManagmentConfig.GetConnectionString( ShardManagmentConfig.ShardMapManagerServerName, ShardManagmentConfig.ShardMapDatabase); if (!SqlDatabaseUtils.DatabaseExists(shardMapManagerServerName, shardMapManagerDatabaseName)) { // Shard Map Manager database has not yet been created return(null); } ShardMapManager shardMapManager; bool smmExists = ShardMapManagerFactory.TryGetSqlShardMapManager( shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager); if (!smmExists) { // Shard Map Manager database exists, but Shard Map Manager has not been created return(null); } return(shardMapManager); }
private static void TryAddShardMapManagement <TTenantIdentity>(IServiceCollection services, string connectionString) { services.TryAddSingleton(s => { var shardingConfig = s.GetService <IOptions <ShardingConfiguration> >().Value; EnsureDbExists(connectionString, shardingConfig.ElasticPool); if (!ShardMapManagerFactory.TryGetSqlShardMapManager( connectionString, ShardMapManagerLoadPolicy.Lazy, out ShardMapManager shardMapManager)) { ShardMapManagerFactory.CreateSqlShardMapManager(connectionString); shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager( connectionString, ShardMapManagerLoadPolicy.Lazy); } return(shardMapManager); }); services.TryAddSingleton(s => { var smm = s.GetService <ShardMapManager>(); var options = s.GetService <IOptions <ShardingConfiguration> >().Value; string mapName = options.ShardMap; // check if shardmap exists and if not, create it if (!smm.TryGetListShardMap(mapName, out ListShardMap <TTenantIdentity> shardMap)) { return(smm.CreateListShardMap <TTenantIdentity>(mapName)); } return(shardMap); }); }
public static void ShardMapManagerFactoryTestsInitialize(TestContext testContext) { // Clear all connection pools. SqlConnection.ClearAllPools(); using (SqlConnection conn = new SqlConnection(Globals.ShardMapManagerTestConnectionString)) { conn.Open(); // Create ShardMapManager database using (SqlCommand cmd = new SqlCommand( string.Format(Globals.CreateDatabaseQuery, Globals.ShardMapManagerDatabaseName), conn)) { cmd.ExecuteNonQuery(); } // Testing TryGetSqlShardMapManager failure case here instead of in TryGetShardMapManager_Fail() // There is no method to cleanup GSM objects, so if some other test runs in lab before // TryGetShardMapManager_Fail, then this call will actually suceed as it will find earlier SMM structures. // Calling it just after creating database makes sure that GSM does not exist. // Other options were to recreate SMM database in tests (this will increase test duration) or // delete storage structures (t-sql delete) in the test which is not very clean solution. ShardMapManager smm = null; bool lookupSmm = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Eager, RetryBehavior.DefaultRetryBehavior, out smm); Assert.IsFalse(lookupSmm); } }
public void TryGetShardMapManager_Success() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); foreach (ShardMapManagerLoadPolicy loadPolicy in Enum.GetValues(typeof(ShardMapManagerLoadPolicy))) { ShardMapManager smm; bool success; success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, loadPolicy, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, loadPolicy, RetryBehavior.DefaultRetryBehavior, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); } }
private ShardMapManager GetShardMapManager() { var catalogDbConnectionString = GetConnectionStingWithCredentials(); return(!ShardMapManagerFactory.TryGetSqlShardMapManager(catalogDbConnectionString, ShardMapManagerLoadPolicy.Lazy, out ShardMapManager shardMapManager) ? ShardMapManagerFactory.CreateSqlShardMapManager(catalogDbConnectionString) : shardMapManager); }
public void TryGetShardMapManager_Success() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); foreach (ShardMapManagerLoadPolicy loadPolicy in Enum.GetValues(typeof(ShardMapManagerLoadPolicy))) { ShardMapManager smm; bool success; success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, loadPolicy, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, loadPolicy, RetryBehavior.DefaultRetryBehavior, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); // Cover all the overloads var sqlAuthLogin = new SqlAuthenticationLogin(Globals.ShardMapManagerConnectionString, Globals.SqlLoginTestUser, Globals.SqlLoginTestPassword); if (sqlAuthLogin.Create()) { success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionStringForSqlAuth, Globals.ShardUserCredentialForSqlAuth(sqlAuthLogin.UniquifiedUserName), loadPolicy, RetryBehavior.DefaultRetryBehavior, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionStringForSqlAuth, Globals.ShardUserCredentialForSqlAuth(sqlAuthLogin.UniquifiedUserName), loadPolicy, RetryBehavior.DefaultRetryBehavior, null, out smm); Assert.IsTrue(success); Assert.IsNotNull(smm); } else { Assert.Inconclusive("Failed to create sql login, test skipped"); } } }
public ShardMapManager CreateOrGet(string connectionString) { var shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( connectionString, ShardMapManagerLoadPolicy.Lazy, out var shardMapManager); return(shardMapManagerExists ? shardMapManager : ShardMapManagerFactory.CreateSqlShardMapManager(connectionString)); }
public HorizontalShard(string _mapManagerServer, string _userID, string _password, string _mapManagerName, string _secondaryDR) { connectionString = string.Format("Data Source={0};Initial Catalog={3};Integrated Security=False;User ID={1};Password={2};Encrypt=True", _mapManagerServer, _userID, _password, _mapManagerName); shardConnectionString = string.Format("Integrated Security=False;User ID={0};Password={1};Encrypt=True", _userID, _password); mapManagerName = _mapManagerName; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy, out ShardMapManager)) { ShardMapManager = null; } }
private static ShardMapManager CreateOrGetShardMapManager(IConfiguration configuration) { var shardMapManagerConnection = configuration.GetConnectionString("ShardMapManagerConnection"); var shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(shardMapManagerConnection, ShardMapManagerLoadPolicy.Lazy, out ShardMapManager shardMapManager); if (!shardMapManagerExists) { shardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(shardMapManagerConnection); } return(shardMapManager); }
public void EnsureCreated(string connectionString) { var shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( connectionString, ShardMapManagerLoadPolicy.Lazy, out var shardMapManager); if (!shardMapManagerExists) { ShardMapManagerFactory.CreateSqlShardMapManager(connectionString); } }
private static ShardMapManager GetOrCreateCreateSqlShardMapManager(string connectionString) { ShardMapManager manager; if (ShardMapManagerFactory.TryGetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Eager, RetryBehavior.DefaultRetryBehavior, out manager)) { Console.WriteLine("Shard map manager already exists"); return(manager); } Console.WriteLine("Creating shard map manager"); return(ShardMapManagerFactory.CreateSqlShardMapManager(connectionString, ShardMapManagerCreateMode.KeepExisting, RetryBehavior.DefaultRetryBehavior)); }
public ShardMapManager GetShardMapManagerIfExists() { var shardMapManagerConnectionString = GetSmmConnectionString(); // Get shard map manager database connection string // Try to get a reference to the Shard Map Manager in the Shard Map Manager database. If it doesn't already exist, then create it. ShardMapManager shardMapManager; var shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager); return(!shardMapManagerExists ? null : shardMapManager); }
public void CreateShardingIfNotExists() { ShardMapManager smm; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(_shardingManagerOptions.ShardMapManager, ShardMapManagerLoadPolicy.Lazy, out smm)) { smm = ShardMapManagerFactory.CreateSqlShardMapManager(_shardingManagerOptions.ShardMapManager); } if (!smm.TryGetListShardMap <long>(ElasticScaleConstants.ListMapName, out _)) { smm.CreateListShardMap <long>(ElasticScaleConstants.ListMapName); } }
public ShardMapManager Get(string connectionString) { var shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( connectionString, ShardMapManagerLoadPolicy.Lazy, out var shardMapManager); if (!shardMapManagerExists) { throw new ShardMapManagerNotExistsException(); } return(shardMapManager); }
/// <summary> /// Creates a shard map manager in the database specified by the given connection string. /// </summary> public static ShardMapManager CreateOrGetShardMapManager(string shardMapManagerConnectionString) { // Get shard map manager database connection string // Try to get a reference to the Shard Map Manager in the Shard Map Manager database. If it doesn't already exist, then create it. ShardMapManager shardMapManager; bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager); if (!shardMapManagerExists) { shardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(shardMapManagerConnectionString); } return(shardMapManager); }
// Bootstrap Elastic Scale by creating a new shard map manager and a shard map on // the shard map manager database if necessary. public Sharding()//string smmserver, string smmdatabase, string smmconnstr) { string smmserver = Sharding.server; string smmconnstr = Sharding.connectionString; string smmdatabase = Sharding.shardmapmgrdb; // Connection string with administrative credentials for the root database SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder(smmconnstr); connStrBldr.DataSource = smmserver; connStrBldr.InitialCatalog = smmdatabase; connstring = smmconnstr; // Deploy shard map manager. ShardMapManager smm; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connStrBldr.ConnectionString, ShardMapManagerLoadPolicy.Lazy, out smm)) { this.ShardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(connStrBldr.ConnectionString); } else { this.ShardMapManager = smm; } ListShardMap <Guid> sm; if (!ShardMapManager.TryGetListShardMap <Guid>(sharmapName, out sm)) { this.ShardMap = ShardMapManager.CreateListShardMap <Guid>(sharmapName); } else { this.ShardMap = sm; } initDd("shard0"); initDd("shard1"); //initDd("shard2"); //initDd("shard3"); //initDd("shard4"); }
/// <summary> /// Tries to get the ShardMapManager that is stored in the specified database. /// </summary> public static ShardMapManager TryGetShardMapManager() { if (!SqlDatabaseUtils.ExistsDatabase(MultiShardConfiguration.ShardMapManagerServerName, MultiShardConfiguration.ShardMapManagerDatabaseName)) { // Shard Map Manager database has not yet been created return(null); } ShardMapManager shardMapManager; bool smmExists = ShardMapManagerFactory.TryGetSqlShardMapManager(MultiShardConfiguration.GetConnectionString(), ShardMapManagerLoadPolicy.Lazy, out shardMapManager); if (!smmExists) { // Shard Map Manager database exists, but Shard Map Manager has not been created return(null); } return(shardMapManager); }
public void TryGetShardMapManager_Fail() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); ShardMapManager smm = null; bool success = false; // Null retry policy not allowed AssertExtensions.AssertThrows <ArgumentNullException>(() => success = ShardMapManagerFactory.TryGetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Eager, null, out smm)); Assert.IsFalse(success); Assert.IsNull(smm); }
/// <summary> /// Creates a shard map manager in the database specified by the given connection string. /// </summary> public static ShardMapManager CreateOrGetShardMapManager(string shardMapManagerConnectionString) { // Get shard map manager database connection string // Try to get a reference to the Shard Map Manager in the Shard Map Manager database. If it doesn't already exist, then create it. ShardMapManager shardMapManager; bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager( shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager); if (shardMapManagerExists) { ConsoleUtils.WriteInfo("Shard Map Manager already exists"); } else { // The Shard Map Manager does not exist, so create it shardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(shardMapManagerConnectionString); ConsoleUtils.WriteInfo("Created Shard Map Manager"); } return(shardMapManager); }
public ShardMap CreateShardMap() { // Deploy shard map manager. ShardMapManager shardMapManager; ListShardMap <Guid> listShardMap; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(_connectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager)) { shardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(_connectionString); } if (!shardMapManager.TryGetListShardMap(_configuredShardMap, out listShardMap)) { listShardMap = shardMapManager.CreateListShardMap <Guid>(_configuredShardMap); } if (_shardMapAccessor != null) { _shardMapAccessor.ShardMap = listShardMap; } /* * TO DO : This code needs to be externalized * string appserver = "bddbdev.database.windows.net"; * string appdatabase = "Test"; * Guid TenantId = Guid.Parse("3e376368-bf33-49ce-a0de-e9ad6438aa1c"); * var shardLocation = new ShardLocation(appserver, appdatabase); * if (!listShardMap.TryGetShard(shardLocation, out var shard)) * { * shard=listShardMap.CreateShard(new ShardLocation(appserver, appdatabase)); * * } * PointMapping<Guid> mapping; * if (!listShardMap.TryGetMappingForKey(TenantId, out mapping)) * { * listShardMap.CreatePointMapping(TenantId, shard); * }*/ return(listShardMap); }
public DbConnection OpenDDRConnection() { var connectionString = _configuration.GetConnectionString("ShardMapManager"); SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder(connectionString); SqlConnectionStringBuilder emptyCon = new SqlConnectionStringBuilder { UserID = connStrBldr.UserID, Password = connStrBldr.Password, ApplicationName = connStrBldr.ApplicationName }; ShardMapManager smm; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connStrBldr.ConnectionString, ShardMapManagerLoadPolicy.Lazy, out smm)) { return(null); } ListShardMap <long> shardMap; if (!smm.TryGetListShardMap <long>(ElasticScaleConstants.ListMapName, out shardMap)) { return(null); } var tenantId = _tenantProvider.GetTenantId(); SqlConnection conn = shardMap.OpenConnectionForKey(tenantId, emptyCon.ConnectionString, ConnectionOptions.Validate); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"SET CONTEXT_INFO " + tenantId; cmd.CommandType = System.Data.CommandType.Text; cmd.ExecuteNonQuery(); return(conn); }
public Sharding(string shardManagerDatabase, string connectionString) { ShardMapManager shardMapManager; if (!ShardMapManagerFactory.TryGetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager)) { this.ShardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(connectionString); } else { this.ShardMapManager = shardMapManager; } ListShardMap <byte[]> shardMap; if (!ShardMapManager.TryGetListShardMap(shardManagerDatabase, out shardMap)) { this.ShardMap = ShardMapManager.CreateListShardMap <byte[]>(shardManagerDatabase); } else { this.ShardMap = shardMap; } }
public static bool ShardMapManagerExists(string connectionString) { ShardMapManager _ = null; return(ShardMapManagerFactory.TryGetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Eager, out _)); }