mirror of
https://github.com/apple/foundationdb.git
synced 2025-06-02 03:12:12 +08:00
Handle versionstamped keys, and include additonal trace information
This commit is contained in:
parent
fd993df807
commit
ed60afc964
@ -176,8 +176,6 @@ FoundationDB may return the following error codes from API functions. If you nee
|
|||||||
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
||||||
| unknown_tenant | 2137| Tenant is not available from this server |
|
| unknown_tenant | 2137| Tenant is not available from this server |
|
||||||
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
||||||
| illegal_tenant_access | 2138| Tenant information mismatch |
|
|
||||||
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
|
||||||
| api_version_unset | 2200| API version is not set |
|
| api_version_unset | 2200| API version is not set |
|
||||||
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
+-----------------------------------------------+-----+--------------------------------------------------------------------------------+
|
||||||
| api_version_already_set | 2201| API version may be set only once |
|
| api_version_already_set | 2201| API version may be set only once |
|
||||||
|
@ -279,13 +279,32 @@ bool verifyPrefix(ProxyCommitData* const commitData, const CommitTransactionRequ
|
|||||||
for (auto& m : req.transaction.mutations) {
|
for (auto& m : req.transaction.mutations) {
|
||||||
if (m.param1 != metadataVersionKey) {
|
if (m.param1 != metadataVersionKey) {
|
||||||
if (!m.param1.startsWith(tenantPrefix)) {
|
if (!m.param1.startsWith(tenantPrefix)) {
|
||||||
|
TraceEvent(SevWarnAlways, "TenantPrefixMismatch")
|
||||||
|
.suppressFor(60)
|
||||||
|
.detail("Prefix", tenantPrefix.toHexString())
|
||||||
|
.detail("Key", m.param1.toHexString())
|
||||||
|
.detail("KeyType", "Key");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.type == MutationRef::ClearRange && !m.param2.startsWith(tenantPrefix)) {
|
if (m.type == MutationRef::ClearRange && !m.param2.startsWith(tenantPrefix)) {
|
||||||
|
TraceEvent(SevWarnAlways, "TenantPrefixMismatch")
|
||||||
|
.suppressFor(60)
|
||||||
|
.detail("Prefix", tenantPrefix.toHexString())
|
||||||
|
.detail("Key", m.param2.toHexString())
|
||||||
|
.detail("KeyType", "ClearRangeKey");
|
||||||
return false;
|
return false;
|
||||||
} else if (m.type != MutationRef::SetVersionstampedKey) {
|
} else if (m.type == MutationRef::SetVersionstampedKey) {
|
||||||
// TODO: How should this be handled?
|
uint8_t* key = const_cast<uint8_t*>(m.param1.begin());
|
||||||
// Maybe skip checking this for now? If so, fall-through.
|
int* offset = reinterpret_cast<int*>(&key[m.param1.size() - 4]);
|
||||||
|
if (*offset <= tenantPrefix.size()) {
|
||||||
|
TraceEvent(SevWarnAlways, "TenantPrefixMismatch")
|
||||||
|
.suppressFor(60)
|
||||||
|
.detail("Prefix", tenantPrefix.toHexString())
|
||||||
|
.detail("Key", m.param1.toHexString())
|
||||||
|
.detail("KeyType", "VersionstampedKey");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -293,6 +312,11 @@ bool verifyPrefix(ProxyCommitData* const commitData, const CommitTransactionRequ
|
|||||||
for (auto& rc : req.transaction.read_conflict_ranges) {
|
for (auto& rc : req.transaction.read_conflict_ranges) {
|
||||||
if (rc.begin != metadataVersionKey &&
|
if (rc.begin != metadataVersionKey &&
|
||||||
(!rc.begin.startsWith(tenantPrefix) || !rc.end.startsWith(tenantPrefix))) {
|
(!rc.begin.startsWith(tenantPrefix) || !rc.end.startsWith(tenantPrefix))) {
|
||||||
|
TraceEvent(SevWarnAlways, "TenantPrefixMismatch")
|
||||||
|
.suppressFor(60)
|
||||||
|
.detail("Prefix", tenantPrefix.toHexString())
|
||||||
|
.detail("BeginKey", rc.begin.toHexString())
|
||||||
|
.detail("EndKey", rc.end.toHexString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,6 +324,11 @@ bool verifyPrefix(ProxyCommitData* const commitData, const CommitTransactionRequ
|
|||||||
for (auto& wc : req.transaction.write_conflict_ranges) {
|
for (auto& wc : req.transaction.write_conflict_ranges) {
|
||||||
if (wc.begin != metadataVersionKey &&
|
if (wc.begin != metadataVersionKey &&
|
||||||
(!wc.begin.startsWith(tenantPrefix) || !wc.end.startsWith(tenantPrefix))) {
|
(!wc.begin.startsWith(tenantPrefix) || !wc.end.startsWith(tenantPrefix))) {
|
||||||
|
TraceEvent(SevWarnAlways, "TenantPrefixMismatch")
|
||||||
|
.suppressFor(60)
|
||||||
|
.detail("Prefix", tenantPrefix.toHexString())
|
||||||
|
.detail("BeginKey", wc.begin.toHexString())
|
||||||
|
.detail("EndKey", wc.end.toHexString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -358,7 +387,6 @@ ACTOR Future<Void> commitBatcher(ProxyCommitData* commitData,
|
|||||||
if (!verifyPrefix(commitData, req)) {
|
if (!verifyPrefix(commitData, req)) {
|
||||||
++commitData->stats.txnCommitErrors;
|
++commitData->stats.txnCommitErrors;
|
||||||
req.reply.sendError(illegal_tenant_access());
|
req.reply.sendError(illegal_tenant_access());
|
||||||
TraceEvent(SevWarnAlways, "TenantPrefixMismatch").suppressFor(60);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ ERROR( invalid_tenant_name, 2134, "Tenant name cannot begin with \\xff");
|
|||||||
ERROR( tenant_prefix_allocator_conflict, 2135, "The database already has keys stored at the prefix allocated for the tenant");
|
ERROR( tenant_prefix_allocator_conflict, 2135, "The database already has keys stored at the prefix allocated for the tenant");
|
||||||
ERROR( tenants_disabled, 2136, "Tenants have been disabled in the cluster");
|
ERROR( tenants_disabled, 2136, "Tenants have been disabled in the cluster");
|
||||||
ERROR( unknown_tenant, 2137, "Tenant is not available from this server")
|
ERROR( unknown_tenant, 2137, "Tenant is not available from this server")
|
||||||
ERROR( illegal_tenant_access, 2138, "Tenant information mismatch")
|
ERROR( illegal_tenant_access, 2138, "Illegal tenant access")
|
||||||
|
|
||||||
// 2200 - errors from bindings and official APIs
|
// 2200 - errors from bindings and official APIs
|
||||||
ERROR( api_version_unset, 2200, "API version is not set" )
|
ERROR( api_version_unset, 2200, "API version is not set" )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user