| 3708 | } |
| 3709 | |
| 3710 | KeyRange getShardKeyRange(StorageServer* data, const KeySelectorRef& sel) |
| 3711 | // Returns largest range such that the shard state isReadable and selectorInRange(sel, range) or wrong_shard_server if |
| 3712 | // no such range exists |
| 3713 | { |
| 3714 | auto i = sel.isBackward() ? data->shards.rangeContainingKeyBefore(sel.getKey()) |
| 3715 | : data->shards.rangeContaining(sel.getKey()); |
| 3716 | auto fullRange = data->shards.ranges(); |
| 3717 | if (!i->value()->isReadable()) |
| 3718 | throw wrong_shard_server(); |
| 3719 | ASSERT(selectorInRange(sel, i->range())); |
| 3720 | Key begin, end; |
| 3721 | if (sel.isBackward()) { |
| 3722 | end = i->range().end; |
| 3723 | while (i != fullRange.begin() && i.value()->isReadable()) { |
| 3724 | begin = i->range().begin; |
| 3725 | --i; |
| 3726 | } |
| 3727 | if (i.value()->isReadable()) { |
| 3728 | begin = i->range().begin; |
| 3729 | } |
| 3730 | } else { |
| 3731 | begin = i->range().begin; |
| 3732 | while (i != fullRange.end() && i.value()->isReadable()) { |
| 3733 | end = i->range().end; |
| 3734 | ++i; |
| 3735 | } |
| 3736 | } |
| 3737 | return KeyRangeRef(begin, end); |
| 3738 | } |
| 3739 | |
| 3740 | ACTOR Future<Void> getKeyValuesQ(StorageServer* data, GetKeyValuesRequest req) |
| 3741 | // Throws a wrong_shard_server if the keys in the request or result depend on data outside this server OR if a large |
no test coverage detected