Ejemplo n.º 1
0
 public PartitionHelper(IPartitionHelperLogger logger)
 {
     _logger     = logger;
     _partitions = new ConcurrentDictionary <Uri, IEnumerable <Int64RangePartitionInformation> >();
 }
Ejemplo n.º 2
0
        public async Task <IEnumerable <Int64RangePartitionInformation> > GetInt64Partitions(Uri serviceUri, IPartitionHelperLogger logger)
        {
            logger.EnumeratingPartitions(serviceUri);

            lock (_lock)
            {
                if (_int64Partitions.ContainsKey(serviceUri))
                {
                    var partitions = _int64Partitions[serviceUri];
                    logger.EnumeratedExistingPartitions(serviceUri, partitions);
                    return(partitions);
                }
            }

            try
            {
                var fabricClient         = new FabricClient();
                var servicePartitionList = await fabricClient.QueryManager.GetPartitionListAsync(serviceUri);

                IList <Int64RangePartitionInformation> partitionKeys = new List <Int64RangePartitionInformation>(servicePartitionList.Count);
                foreach (var partition in servicePartitionList)
                {
                    var partitionInfo = partition.PartitionInformation as Int64RangePartitionInformation;
                    if (partitionInfo == null)
                    {
                        throw new InvalidOperationException($"The service {serviceUri} should have a uniform Int64 partition. Instead: {partition.PartitionInformation.Kind}");
                    }
                    partitionKeys.Add(partitionInfo);
                }
                lock (_lock)
                {
                    if (!_int64Partitions.ContainsKey(serviceUri))
                    {
                        _int64Partitions.Add(serviceUri, partitionKeys.ToArray());
                    }
                }

                logger.EnumeratedAndCachedPartitions(serviceUri, partitionKeys);
                return(partitionKeys);
            }
            catch (Exception ex)
            {
                logger.FailedToEnumeratePartitions(serviceUri, ex);
                throw new PartitionEnumerationException(serviceUri, ex);
            }
        }