Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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);
        }