public SqlDataManager( Logger logger, GrainStateMap grainStateMap, string connectionString, string shardCredentials, string mapName, BatchingOptions batchingOptions =null) { Logger = logger; Guard.NotNullOrEmpty(connectionString, "conectionString"); Guard.NotNullOrEmpty(shardCredentials, "shardCredentials"); Guard.NotNullOrEmpty(mapName, "mapName"); // Try to get a reference to the Shard Map Manager via the Shard Map Manager database. // If it doesn't already exist, then fail var shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy); var shardMap = (RangeShardMap<int>)shardMapManager.GetShardMap(mapName); var shardBatchers = new ConcurrentDictionary<Range<int>, ShardBatcher>(); foreach (var rangeMapping in shardMap.GetMappings()) { Range<int> range = rangeMapping.Value; shardBatchers.TryAdd(range, new ShardBatcher(logger, grainStateMap, rangeMapping.Shard, shardCredentials, batchingOptions)); } _shardBatchers = shardBatchers; _shardMap = shardMap; }
public SqlDataManager( Logger logger, GrainStateMap grainStateMap, string connectionString, string shardCredentials, string mapName, BatchingOptions batchingOptions = null) { Logger = logger; Guard.NotNullOrEmpty(connectionString, "conectionString"); Guard.NotNullOrEmpty(shardCredentials, "shardCredentials"); Guard.NotNullOrEmpty(mapName, "mapName"); // Try to get a reference to the Shard Map Manager via the Shard Map Manager database. // If it doesn't already exist, then fail var shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy); var shardMap = (RangeShardMap <int>)shardMapManager.GetShardMap(mapName); var shardBatchers = new ConcurrentDictionary <Range <int>, ShardBatcher>(); foreach (var rangeMapping in shardMap.GetMappings()) { Range <int> range = rangeMapping.Value; shardBatchers.TryAdd(range, new ShardBatcher(logger, grainStateMap, rangeMapping.Shard, shardCredentials, batchingOptions)); } _shardBatchers = shardBatchers; _shardMap = shardMap; }
internal ShardBatcher( Logger logger, GrainStateMap grainStateMap, Shard shard, string shardCredentials, BatchingOptions batchingOptions = null) { Logger = logger; if (null != batchingOptions) { BatchSize = batchingOptions.BatchSize; MaxConcurrentWrites = batchingOptions.MaxConcurrentWrites; BatchTimeoutSeconds = batchingOptions.BatchTimeoutSeconds; } // sanity check against bad parameters if (BatchSize <= 0) { BatchSize = 1000; } if (MaxConcurrentWrites <= 0) { MaxConcurrentWrites = 1; } if (BatchTimeoutSeconds <= 0) { BatchTimeoutSeconds = 1; } // You may want to make it configurable RetryPolicy = new RetryPolicy(new TransientErrorStrategy(), 5, TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(800), TimeSpan.FromMilliseconds(200)); RetryPolicy.Retrying += (sender, args) => { Logger.Warn(0, "Sql transient error", args.LastException); }; _grainStateMap = grainStateMap; _shard = shard; _shardCredentials = shardCredentials; _readGroups = new ConcurrentDictionary <string, Lazy <BatchGroup <ReadEntry> > >(); _writeGroups = new ConcurrentDictionary <string, Lazy <BatchGroup <WriteEntry> > >(); _writeActionBlock = new ActionBlock <IEnumerable <WriteEntry> >( async batch => await WriteBatchDataAsync(batch), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = MaxConcurrentWrites } ); _readActionBlock = new ActionBlock <IEnumerable <ReadEntry> >( async batch => await ReadBatchDataAsync(batch), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = MaxConcurrentWrites } ); Logger.Info("ShardBatcher created for {0}", shard.Location.Database); }