| 1853 | } |
| 1854 | |
| 1855 | bool DatabaseContext::getCachedLocations(const Optional<TenantNameRef>& tenantName, |
| 1856 | const KeyRangeRef& range, |
| 1857 | std::vector<KeyRangeLocationInfo>& result, |
| 1858 | int limit, |
| 1859 | Reverse reverse) { |
| 1860 | result.clear(); |
| 1861 | |
| 1862 | TenantMapEntry tenantEntry; |
| 1863 | Arena arena; |
| 1864 | KeyRangeRef resolvedRange = range; |
| 1865 | |
| 1866 | if (tenantName.present()) { |
| 1867 | auto itr = tenantCache.find(tenantName.get()); |
| 1868 | if (itr != tenantCache.end()) { |
| 1869 | tenantEntry = itr->second; |
| 1870 | resolvedRange = resolvedRange.withPrefix(tenantEntry.prefix, arena); |
| 1871 | } else { |
| 1872 | return false; |
| 1873 | } |
| 1874 | } |
| 1875 | |
| 1876 | auto begin = locationCache.rangeContaining(resolvedRange.begin); |
| 1877 | auto end = locationCache.rangeContainingKeyBefore(resolvedRange.end); |
| 1878 | |
| 1879 | loop { |
| 1880 | auto r = reverse ? end : begin; |
| 1881 | if (!r->value()) { |
| 1882 | CODE_PROBE(result.size(), "had some but not all cached locations"); |
| 1883 | result.clear(); |
| 1884 | return false; |
| 1885 | } |
| 1886 | result.emplace_back(tenantEntry, toRelativeRange(r->range() & resolvedRange, tenantEntry.prefix), r->value()); |
| 1887 | if (result.size() == limit || begin == end) { |
| 1888 | break; |
| 1889 | } |
| 1890 | |
| 1891 | if (reverse) |
| 1892 | --end; |
| 1893 | else |
| 1894 | ++begin; |
| 1895 | } |
| 1896 | |
| 1897 | return true; |
| 1898 | } |
no test coverage detected