summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/query/get_executor.cpp5
-rw-r--r--src/mongo/db/query/plan_cache.cpp27
-rw-r--r--src/mongo/db/query/plan_cache.h3
3 files changed, 24 insertions, 11 deletions
diff --git a/src/mongo/db/query/get_executor.cpp b/src/mongo/db/query/get_executor.cpp
index 9ca28b322fa..0dae9645c93 100644
--- a/src/mongo/db/query/get_executor.cpp
+++ b/src/mongo/db/query/get_executor.cpp
@@ -38,7 +38,6 @@
#include "mongo/base/error_codes.h"
#include "mongo/base/parse_number.h"
-#include "mongo/base/simple_string_data_comparator.h"
#include "mongo/db/catalog/index_catalog.h"
#include "mongo/db/exec/cached_plan.h"
#include "mongo/db/exec/collection_scan.h"
@@ -352,9 +351,7 @@ StatusWith<PrepareExecutionResult> prepareExecution(OperationContext* opCtx,
auto planCacheKey = collection->infoCache()->getPlanCache()->computeKey(*canonicalQuery);
// Fill in opDebug information.
- boost::optional<uint32_t> hash =
- SimpleStringDataComparator::kInstance.hash(StringData(planCacheKey));
- CurOp::get(opCtx)->debug().queryHash = hash;
+ CurOp::get(opCtx)->debug().queryHash = PlanCache::computeQueryHash(planCacheKey);
// Try to look up a cached solution for the query.
if (auto cs =
diff --git a/src/mongo/db/query/plan_cache.cpp b/src/mongo/db/query/plan_cache.cpp
index 9e4fb5edf93..f132dc077b9 100644
--- a/src/mongo/db/query/plan_cache.cpp
+++ b/src/mongo/db/query/plan_cache.cpp
@@ -47,6 +47,7 @@
#include "mongo/db/query/query_knobs.h"
#include "mongo/db/query/query_solution.h"
#include "mongo/util/assert_util.h"
+#include "mongo/util/hex.h"
#include "mongo/util/log.h"
#include "mongo/util/mongoutils/str.h"
#include "mongo/util/transitional_tools_do_not_use/vector_spooling.h"
@@ -728,12 +729,14 @@ void PlanCache::encodeKeyForProj(const BSONObj& projObj, StringBuilder* keyBuild
* - The new entry should be marked 'active'
*/
PlanCache::NewEntryState PlanCache::getNewEntryState(const CanonicalQuery& query,
+ uint32_t queryHash,
PlanCacheEntry* oldEntry,
size_t newWorks,
double growthCoefficient) {
NewEntryState res;
if (!oldEntry) {
LOG(1) << "Creating inactive cache entry for query shape " << redact(query.toStringShort())
+ << " and queryHash " << unsignedIntToFixedLengthHex(queryHash)
<< " with works value " << newWorks;
res.shouldBeCreated = true;
res.shouldBeActive = false;
@@ -745,12 +748,14 @@ PlanCache::NewEntryState PlanCache::getNewEntryState(const CanonicalQuery& query
// occur if many MultiPlanners are run simultaneously.
LOG(1) << "Replacing active cache entry for query " << redact(query.toStringShort())
- << " with works " << oldEntry->works << " with a plan with works " << newWorks;
+ << " and queryHash " << unsignedIntToFixedLengthHex(queryHash) << " with works "
+ << oldEntry->works << " with a plan with works " << newWorks;
res.shouldBeCreated = true;
res.shouldBeActive = true;
} else if (oldEntry->isActive) {
LOG(1) << "Attempt to write to the planCache for query " << redact(query.toStringShort())
- << "with a plan with works " << newWorks
+ << " and queryHash " << unsignedIntToFixedLengthHex(queryHash)
+ << " with a plan with works " << newWorks
<< " is a noop, since there's already a plan with works value " << oldEntry->works;
// There is already an active cache entry with a higher works value.
// We do nothing.
@@ -768,7 +773,8 @@ PlanCache::NewEntryState PlanCache::getNewEntryState(const CanonicalQuery& query
oldEntry->works + 1u, static_cast<size_t>(oldEntry->works * growthCoefficient));
LOG(1) << "Increasing work value associated with cache entry for query "
- << redact(query.toStringShort()) << " from " << oldEntry->works << " to "
+ << redact(query.toStringShort()) << " and queryHash "
+ << unsignedIntToFixedLengthHex(queryHash) << " from " << oldEntry->works << " to "
<< increasedWorks;
oldEntry->works = increasedWorks;
@@ -779,8 +785,9 @@ PlanCache::NewEntryState PlanCache::getNewEntryState(const CanonicalQuery& query
// inactive entry's works. We use this as an indicator that it's safe to
// cache (as an active entry) the plan this query used for the future.
LOG(1) << "Inactive cache entry for query " << redact(query.toStringShort())
- << " with works " << oldEntry->works
- << " is being promoted to active entry with works value " << newWorks;
+ << " and queryHash " << unsignedIntToFixedLengthHex(queryHash) << " with works "
+ << oldEntry->works << " is being promoted to active entry with works value "
+ << newWorks;
// We'll replace the old inactive entry with an active entry.
res.shouldBeCreated = true;
res.shouldBeActive = true;
@@ -818,15 +825,24 @@ Status PlanCache::set(const CanonicalQuery& query,
const size_t newWorks = why->stats[0]->common.works;
stdx::lock_guard<stdx::mutex> cacheLock(_cacheMutex);
bool isNewEntryActive = false;
+ uint32_t queryHash;
if (internalQueryCacheDisableInactiveEntries.load()) {
// All entries are always active.
isNewEntryActive = true;
+ queryHash = PlanCache::computeQueryHash(key);
} else {
PlanCacheEntry* oldEntry = nullptr;
Status cacheStatus = _cache.get(key, &oldEntry);
invariant(cacheStatus.isOK() || cacheStatus == ErrorCodes::NoSuchKey);
+ if (oldEntry) {
+ queryHash = oldEntry->queryHash;
+ } else {
+ queryHash = PlanCache::computeQueryHash(key);
+ }
+
auto newState = getNewEntryState(
query,
+ queryHash,
oldEntry,
newWorks,
worksGrowthCoefficient.get_value_or(internalQueryCacheWorksGrowthCoefficient));
@@ -837,7 +853,6 @@ Status PlanCache::set(const CanonicalQuery& query,
isNewEntryActive = newState.shouldBeActive;
}
- uint32_t queryHash = computeQueryHash(key);
auto newEntry = std::make_unique<PlanCacheEntry>(solns, why.release(), queryHash);
const QueryRequest& qr = query.getQueryRequest();
newEntry->query = qr.getFilter().getOwned();
diff --git a/src/mongo/db/query/plan_cache.h b/src/mongo/db/query/plan_cache.h
index 729cdafed3a..b0b767c13ea 100644
--- a/src/mongo/db/query/plan_cache.h
+++ b/src/mongo/db/query/plan_cache.h
@@ -396,7 +396,7 @@ public:
* The return value will provide the "state" of the cache entry, as well as the CachedSolution
* for the query (if there is one).
*/
- GetResult get(const PlanCacheKey& query) const;
+ GetResult get(const PlanCacheKey& key) const;
/**
* If the cache entry exists and is active, return a CachedSolution. If the cache entry is
@@ -483,6 +483,7 @@ private:
};
NewEntryState getNewEntryState(const CanonicalQuery& query,
+ uint32_t queryHash,
PlanCacheEntry* oldEntry,
size_t newWorks,
double growthCoefficient);