예제 #1
0
        public async Task Retrieve(IEnumerable <byte[]> keys, RetrieveCallback cb)
        {
            var shardCount = await GetShardCount();

            var servers = await GetShardServers();

            if (servers == null)
            {
                await RetrieveEntities(keys.Select(m => new ScalableEntity(m, null).SetPartition(shardCount)), cb);
            }
            else
            {
                bool        running = true;
                var         shards  = keys.Select(m => new ScalableEntity(m, null).SetPartition(shardCount)).ToLookup(m => m.Partition);
                List <Task> pending = new List <Task>();
                foreach (var shard in shards)
                {
                    pending.Add(servers[shard.Key].RetrieveEntities(shard, m => {
                        if (!running)
                        {
                            return(false);
                        }
                        if (!cb(m))
                        {
                            running = false;
                            return(false);
                        }
                        return(true);
                    }));
                }
                await Task.WhenAll(pending);
            }
        }
예제 #2
0
        protected override Task RetrieveRange(byte[] start, byte[] end, RetrieveCallback cb)
        {
            AzureOperationHandle rangeRetrieve = new AzureOperationHandle(null, OpType.RangeRetrieve)
            {
                StartRange = start, EndRange = end, callback = cb
            };

            lock (evt)
            {
                if (!pendingOperations.ContainsKey(0))
                {
                    pendingOperations.Add(0, new List <AzureOperationHandle>());
                }
                pendingOperations[0].Add(rangeRetrieve);
                evt.Set();
            }
            return(rangeRetrieve.Task.Task);
        }
예제 #3
0
        public async Task Retrieve(byte[] start, byte[] end, RetrieveCallback cb)
        {
            var shardCount = await GetShardCount();

            var servers = await GetShardServers();

            if (servers == null)
            {
                await RetrieveRange(start, end, cb);
            }
            else
            {
                bool running = true;
                int  a       = 0;
                int  b       = (int)shardCount;
                if (start != null)
                {
                    a = (int)(start.LinearHash() % shardCount);
                }
                if (end != null)
                {
                    b = (int)(end.LinearHash() % shardCount) + 1;
                }

                List <Task> pending = new List <Task>();
                for (int i = a; i < b; i++)
                {
                    pending.Add(servers[i].RetrieveRange(start, end, m => {
                        if (!running)
                        {
                            return(false);
                        }
                        if (!cb(m))
                        {
                            running = false;
                            return(false);
                        }
                        return(true);
                    }));
                }
                await Task.WhenAll(pending);
            }
        }
예제 #4
0
        protected override Task RetrieveRange(byte[] start, byte[] end, RetrieveCallback cb)
        {
            TaskCompletionSource <bool> tsktsktsktsk = new TaskCompletionSource <bool>();
            List <ScalableEntity>       entities     = new List <ScalableEntity>();

            lock (db)
            {
                int startIdx = 0;
                if (start != null)
                {
                    int found = Array.BinarySearch(index, start, new ByteComparer());
                    if (found < 0)
                    {
                        startIdx = ~found;
                    }
                    else
                    {
                        startIdx = found + 1; //exclusive search
                    }
                }
                for (int i = startIdx; i < indexLen; i++)
                {
                    byte[] key = index[i];
                    if (end != null)
                    {
                        if (ByteComparer.instance.Compare(key, end) >= 0)
                        {
                            break;
                        }
                    }
                    entities.Add(new ScalableEntity(key, db[key]));
                }
            }
            cb(entities);
            tsktsktsktsk.SetResult(true);
            return(tsktsktsktsk.Task);
        }
예제 #5
0
 protected override Task RetrieveEntities(IEnumerable <ScalableEntity> entities, RetrieveCallback cb)
 {
     throw new NotImplementedException();
 }
예제 #6
0
 protected override Task RetrieveRange(byte[] start, byte[] end, RetrieveCallback cb)
 {
     throw new NotImplementedException();
 }
예제 #7
0
        protected override Task RetrieveEntities(IEnumerable <ScalableEntity> entities, RetrieveCallback cb)
        {
            TaskCompletionSource <bool> src = new TaskCompletionSource <bool>();

            List <ScalableEntity> retval = new List <ScalableEntity>();

            lock (db)
            {
                foreach (var iable in entities)
                {
                    if (db.ContainsKey(iable.Key))
                    {
                        var    found    = db[iable.Key];
                        byte[] newkey   = new byte[iable.Key.Length];
                        byte[] newvalue = new byte[found.Length];
                        Buffer.BlockCopy(iable.Key, 0, newkey, 0, newkey.Length);
                        Buffer.BlockCopy(found, 0, newvalue, 0, newvalue.Length);
                        retval.Add(new ScalableEntity(newkey, newvalue));
                    }
                }
            }
            if (retval.Any())
            {
                cb(retval);
            }
            src.SetResult(true);
            return(src.Task);
        }
예제 #8
0
 protected abstract Task RetrieveRange(byte[] start, byte[] end, RetrieveCallback cb);
예제 #9
0
 protected abstract Task RetrieveEntities(IEnumerable <ScalableEntity> entities, RetrieveCallback cb);
예제 #10
0
        protected override async Task RetrieveEntities(IEnumerable <ScalableEntity> entities, RetrieveCallback cb)
        {
            List <AzureOperationHandle> ops = null;

            ops = entities.Select(m => new AzureOperationHandle(m.SetPartition(optimal_shard_size), OpType.Retrieve)
            {
                callback = cb
            }).ToList();
            lock (evt)
            {
                foreach (var iable in ops)
                {
                    if (!pendingOperations.ContainsKey(iable.Entity.Partition))
                    {
                        pendingOperations.Add(iable.Entity.Partition, new List <AzureOperationHandle>());
                    }
                    pendingOperations[iable.Entity.Partition].Add(iable);
                }

                evt.Set();
            }
            await Task.WhenAll(ops.Select(m => m.Task.Task));
        }