mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-15 18:32:18 +08:00
Fix bug in tenant map range reads when the end key is outside of the tenant map range.
This commit is contained in:
parent
90983990df
commit
e8a38bb048
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
// Unit tests for the FoundationDB C API.
|
// Unit tests for the FoundationDB C API.
|
||||||
|
|
||||||
|
#include "fdb_c_options.g.h"
|
||||||
#define FDB_API_VERSION 710
|
#define FDB_API_VERSION 710
|
||||||
#include <foundationdb/fdb_c.h>
|
#include <foundationdb/fdb_c.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -2430,6 +2431,38 @@ TEST_CASE("Tenant create, access, and delete") {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
StringRef begin = "\xff\xff/management/tenant_map/"_sr;
|
||||||
|
StringRef end = "\xff\xff/management/tenant_map0"_sr;
|
||||||
|
|
||||||
|
fdb_check(tr.set_option(FDB_TR_OPTION_SPECIAL_KEY_SPACE_ENABLE_WRITES, nullptr, 0));
|
||||||
|
fdb::KeyValueArrayFuture f = tr.get_range(FDB_KEYSEL_FIRST_GREATER_OR_EQUAL(begin.data(), begin.size()),
|
||||||
|
FDB_KEYSEL_FIRST_GREATER_OR_EQUAL(end.data(), end.size()),
|
||||||
|
/* limit */ 0,
|
||||||
|
/* target_bytes */ 0,
|
||||||
|
/* FDBStreamingMode */ FDB_STREAMING_MODE_WANT_ALL,
|
||||||
|
/* iteration */ 0,
|
||||||
|
/* snapshot */ false,
|
||||||
|
/* reverse */ 0);
|
||||||
|
|
||||||
|
fdb_error_t err = wait_future(f);
|
||||||
|
if (err) {
|
||||||
|
fdb::EmptyFuture f2 = tr.on_error(err);
|
||||||
|
fdb_check(wait_future(f2));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
FDBKeyValue const* outKv;
|
||||||
|
int outCount;
|
||||||
|
int outMore;
|
||||||
|
fdb_check(f1.get(&outKv, &outCount, &outMore));
|
||||||
|
CHECK(outCount == 1);
|
||||||
|
CHECK(StringRef(outKv->key, outKv->key_length) == StringRef(tenantName).withPrefix(tenantMapKeys.begin));
|
||||||
|
|
||||||
|
tr.reset();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
fdb::Tenant tenant(db, reinterpret_cast<const uint8_t*>(tenantName.c_str()), tenantName.size());
|
fdb::Tenant tenant(db, reinterpret_cast<const uint8_t*>(tenantName.c_str()), tenantName.size());
|
||||||
fdb::Transaction tr2(tenant);
|
fdb::Transaction tr2(tenant);
|
||||||
|
|
||||||
|
@ -2704,16 +2704,23 @@ Future<Optional<std::string>> FailedLocalitiesRangeImpl::commit(ReadYourWritesTr
|
|||||||
}
|
}
|
||||||
|
|
||||||
ACTOR Future<RangeResult> getTenantList(ReadYourWritesTransaction* ryw, KeyRangeRef kr, GetRangeLimits limitsHint) {
|
ACTOR Future<RangeResult> getTenantList(ReadYourWritesTransaction* ryw, KeyRangeRef kr, GetRangeLimits limitsHint) {
|
||||||
KeyRangeRef tenantRange =
|
|
||||||
kr.removePrefix(SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin)
|
|
||||||
.removePrefix(TenantMapRangeImpl::submoduleRange.begin);
|
|
||||||
state KeyRef managementPrefix =
|
state KeyRef managementPrefix =
|
||||||
kr.begin.substr(0,
|
kr.begin.substr(0,
|
||||||
SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin.size() +
|
SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin.size() +
|
||||||
TenantMapRangeImpl::submoduleRange.begin.size());
|
TenantMapRangeImpl::submoduleRange.begin.size());
|
||||||
|
|
||||||
std::map<TenantName, TenantMapEntry> tenants = wait(ManagementAPI::listTenantsTransaction(
|
kr = kr.removePrefix(SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin);
|
||||||
&ryw->getTransaction(), tenantRange.begin, tenantRange.end, limitsHint.rows));
|
TenantNameRef beginTenant = kr.begin.removePrefix(TenantMapRangeImpl::submoduleRange.begin);
|
||||||
|
|
||||||
|
TenantNameRef endTenant = kr.end;
|
||||||
|
if (endTenant.startsWith(TenantMapRangeImpl::submoduleRange.begin)) {
|
||||||
|
endTenant = endTenant.removePrefix(TenantMapRangeImpl::submoduleRange.begin);
|
||||||
|
} else {
|
||||||
|
endTenant = "\xff"_sr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<TenantName, TenantMapEntry> tenants =
|
||||||
|
wait(ManagementAPI::listTenantsTransaction(&ryw->getTransaction(), beginTenant, endTenant, limitsHint.rows));
|
||||||
|
|
||||||
RangeResult results;
|
RangeResult results;
|
||||||
for (auto tenant : tenants) {
|
for (auto tenant : tenants) {
|
||||||
@ -2783,7 +2790,7 @@ Future<Optional<std::string>> TenantMapRangeImpl::commit(ReadYourWritesTransacti
|
|||||||
TenantNameRef endTenant = range.end().removePrefix(
|
TenantNameRef endTenant = range.end().removePrefix(
|
||||||
SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin);
|
SpecialKeySpace::getModuleRange(SpecialKeySpace::MODULE::MANAGEMENT).begin);
|
||||||
if (endTenant.startsWith(submoduleRange.begin)) {
|
if (endTenant.startsWith(submoduleRange.begin)) {
|
||||||
endTenant = endTenant.removePrefix(submoduleRange.end);
|
endTenant = endTenant.removePrefix(submoduleRange.begin);
|
||||||
} else {
|
} else {
|
||||||
endTenant = "\xff"_sr;
|
endTenant = "\xff"_sr;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user