Skip to content

Commit

Permalink
SERVER-66604 Analyze command skeleton
Browse files Browse the repository at this point in the history
  • Loading branch information
lynne-wang authored and Evergreen Agent committed Jul 6, 2022
1 parent ca7aaa4 commit e8db2d2
Show file tree
Hide file tree
Showing 14 changed files with 180 additions and 0 deletions.
1 change: 1 addition & 0 deletions jstests/core/views/views_all_commands.js
Expand Up @@ -191,6 +191,7 @@ let viewsCommandTests = {
addShard: {skip: isUnrelated},
addShardToZone: {skip: isUnrelated},
aggregate: {command: {aggregate: "view", pipeline: [{$match: {}}], cursor: {}}},
analyze: {skip: isUnrelated},
appendOplogNote: {skip: isUnrelated},
applyOps: {
command: {applyOps: [{op: "i", o: {_id: 1}, ns: "test.view"}]},
Expand Down
23 changes: 23 additions & 0 deletions jstests/cqf/analyze_command.js
@@ -0,0 +1,23 @@
(function() {
"use strict";

load("jstests/libs/optimizer_utils.js"); // For checkCascadesOptimizerEnabled.
if (!checkCascadesOptimizerEnabled(db)) {
jsTestLog("Skipping test because the optimizer is not enabled");
return;
}

const coll = db.cqf_analyze;
coll.drop();

assert.commandWorked(coll.insert({a: [1, 2, 4, 4, 5, 6]}));

let res = db.runCommand({analyze: coll.getName()});
assert.commandFailedWithCode(res, ErrorCodes.NotImplemented);

res = db.runCommand({analyze: coll.getName(), apiVersion: "1", apiStrict: true});
assert.commandFailedWithCode(res, ErrorCodes.APIStrictError);

res = db.runCommand({analyze: coll.getName(), writeConcern: {w: 1}});
assert.commandFailedWithCode(res, ErrorCodes.NotImplemented);
}());
1 change: 1 addition & 0 deletions jstests/replsets/db_reads_while_recovering_all_commands.js
Expand Up @@ -113,6 +113,7 @@ const allCommands = {
expectFailure: true,
expectedErrorCode: ErrorCodes.NotPrimaryOrSecondary,
},
analyze: {skip: isPrimaryOnly},
appendOplogNote: {skip: isPrimaryOnly},
applyOps: {skip: isPrimaryOnly},
authenticate: {skip: isNotAUserDataRead},
Expand Down
2 changes: 2 additions & 0 deletions jstests/sharding/database_versioning_all_commands.js
Expand Up @@ -268,6 +268,8 @@ let testCases = {
}
}
},
analyze:
{skip: "unimplemented. Serves only as a stub."}, // TODO SERVER-67655: Test db versioning
appendOplogNote: {skip: "unversioned and executes on all shards"},
authenticate: {skip: "does not forward command to primary shard"},
balancerCollectionStatus: {skip: "does not forward command to primary shard"},
Expand Down
1 change: 1 addition & 0 deletions jstests/sharding/libs/last_lts_mongod_commands.js
Expand Up @@ -13,6 +13,7 @@ const commandsRemovedFromMongodSinceLastLTS = [
// listCommands output of a last LTS version mongod. We will allow these commands to have a
// test defined without always existing on the mongod being used.
const commandsAddedToMongodSinceLastLTS = [
"analyze", // TODO SERVER-67707: Remove once 7.0 becomes last LTS
"clusterAbortTransaction",
"clusterAggregate",
"clusterCommitTransaction",
Expand Down
1 change: 1 addition & 0 deletions jstests/sharding/libs/last_lts_mongos_commands.js
Expand Up @@ -15,6 +15,7 @@ const commandsRemovedFromMongosSinceLastLTS = [
// defined without always existing on the mongos being used.
const commandsAddedToMongosSinceLastLTS = [
"abortReshardCollection",
"analyze",
"appendOplogNote",
"cleanupReshardCollection",
"commitReshardCollection",
Expand Down
Expand Up @@ -216,6 +216,7 @@ let testCases = {
checkReadConcern: true,
checkWriteConcern: true,
},
analyze: {skip: "TODO SERVER-67772"},
appendOplogNote: {
command: {appendOplogNote: 1, data: {foo: 1}},
checkReadConcern: false,
Expand Down
1 change: 1 addition & 0 deletions jstests/sharding/safe_secondary_reads_drop_recreate.js
Expand Up @@ -106,6 +106,7 @@ let testCases = {
},
behavior: "versioned"
},
analyze: {skip: "primary only"},
appendOplogNote: {skip: "primary only"},
applyOps: {skip: "primary only"},
authSchemaUpgrade: {skip: "primary only"},
Expand Down
Expand Up @@ -122,6 +122,7 @@ let testCases = {
},
behavior: "versioned"
},
analyze: {skip: "primary only"},
appendOplogNote: {skip: "primary only"},
applyOps: {skip: "primary only"},
authSchemaUpgrade: {skip: "primary only"},
Expand Down
Expand Up @@ -109,6 +109,7 @@ let testCases = {
},
behavior: "versioned"
},
analyze: {skip: "primary only"},
appendOplogNote: {skip: "primary only"},
applyOps: {skip: "primary only"},
authenticate: {skip: "does not return user data"},
Expand Down
2 changes: 2 additions & 0 deletions src/mongo/db/commands/SConscript
Expand Up @@ -324,6 +324,8 @@ env.Library(
env.Library(
target="standalone",
source=[
"analyze_cmd.cpp",
"analyze_command.idl",
"count_cmd.cpp",
"cqf/cqf_aggregate.cpp",
"cqf/cqf_command_utils.cpp",
Expand Down
84 changes: 84 additions & 0 deletions src/mongo/db/commands/analyze_cmd.cpp
@@ -0,0 +1,84 @@
/**
* Copyright (C) 2022-present MongoDB, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Server Side Public License, version 1,
* as published by MongoDB, Inc.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Server Side Public License for more details.
*
* You should have received a copy of the Server Side Public License
* along with this program. If not, see
* <http://www.mongodb.com/licensing/server-side-public-license>.
*
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
* linked combinations including the program with the OpenSSL library. You
* must comply with the Server Side Public License in all respects for
* all of the code used other than as permitted herein. If you modify file(s)
* with this exception, you may extend this exception to your version of the
* file(s), but you are not obligated to do so. If you do not wish to do so,
* delete this exception statement from your version. If you delete this
* exception statement from all source files in the program, then also delete
* it in the license file.
*/

#include <string>

#include "mongo/db/commands.h"
#include "mongo/db/commands/analyze_command_gen.h"
#include "mongo/db/query/query_feature_flags_gen.h"

namespace mongo {
namespace {

class CmdAnalyze final : public TypedCommand<CmdAnalyze> {
public:
using Request = AnalyzeCommandRequest;

AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
return AllowedOnSecondary::kNever;
}

std::string help() const override {
return "Command to generate statistics for a collection for use in the optimizer.";
}

ReadWriteType getReadWriteType() const override {
return ReadWriteType::kWrite;
}

class Invocation final : public InvocationBase {
public:
using InvocationBase::InvocationBase;

bool supportsWriteConcern() const final {
return true;
}

NamespaceString ns() const final {
return request().getNamespace();
}

void typedRun(OperationContext* opCtx) {
uassert(6660400,
"Analyze command requires common query framework feature flag to be enabled",
feature_flags::gFeatureFlagCommonQueryFramework.isEnabled(
serverGlobalParams.featureCompatibility));
uasserted(ErrorCodes::NotImplemented, "Analyze command not yet implemented");
}

private:
void doCheckAuthorization(OperationContext* opCtx) const override {
// TODO SERVER-67656
}
};

} cmdAnalyze;

} // namespace
} // namespace mongo
60 changes: 60 additions & 0 deletions src/mongo/db/commands/analyze_command.idl
@@ -0,0 +1,60 @@
# Copyright (C) 2022-present MongoDB, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the Server Side Public License, version 1,
# as published by MongoDB, Inc.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# Server Side Public License for more details.
#
# You should have received a copy of the Server Side Public License
# along with this program. If not, see
# <http://www.mongodb.com/licensing/server-side-public-license>.
#
# As a special exception, the copyright holders give permission to link the
# code of portions of this program with the OpenSSL library under certain
# conditions as described in each individual source file and distribute
# linked combinations including the program with the OpenSSL library. You
# must comply with the Server Side Public License in all respects for
# all of the code used other than as permitted herein. If you modify file(s)
# with this exception, you may extend this exception to your version of the
# file(s), but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version. If you delete this
# exception statement from all source files in the program, then also delete
# it in the license file.
#

global:
cpp_namespace: "mongo"

imports:
- "mongo/idl/basic_types.idl"

commands:
analyze:
description: "Command to allow for manual update and creation of statistics."
command_name: analyze
cpp_name: AnalyzeCommandRequest
strict: true
namespace: concatenate_with_db
api_version: ""
reply_type: OkReply
fields:
key:
description: "The possibly dotted field path for which to create or update stats."
type: string
optional: true
sampleRate:
description: "The proportion of the collection, in the range (0,1] to be sampled
for creating stats."
type: safeInt
validator: { gt: 0.0, lte: 1.0 }
optional: true
sampleSize:
description: "The number of documents used to build the stats, based on a random
sample of the collection."
type: safeInt64
validator: { gt: 0 }
optional: true
1 change: 1 addition & 0 deletions src/mongo/embedded/mongo_embedded/mongo_embedded_test.cpp
Expand Up @@ -556,6 +556,7 @@ TEST_F(MongodbCAPITest, RunListCommands) {
std::vector<std::string> allowlist = {"_hashBSONElement",
"_killOperations",
"aggregate",
"analyze",
"buildInfo",
"collMod",
"collStats",
Expand Down

0 comments on commit e8db2d2

Please sign in to comment.