[SERVER-32563] explain output for sharded count command is incorrect Created: 05/Jan/18  Updated: 17/Nov/23

Status: Backlog
Project: Core Server
Component/s: Diagnostics, Querying
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Charlie Swanson Assignee: Backlog - Query Execution
Resolution: Unresolved Votes: 0
Labels: open_todo_in_code, query-44-grooming
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Depends
Related
is related to SERVER-29449 Explain of find command does not tran... Backlog
is related to SERVER-82471 Make sure explain.find issued on mong... Backlog
is related to SERVER-82218 Unify explain and execution path in s... Closed
Assigned Teams:
Query Execution
Operating System: ALL
Participants:

 Description   

When run against a sharded collection with multiple shards, it looks like the explain implementation will simply forward the count command to each shard, which would be incorrect and is not what the regular, non-explain implementation does. More specifically, if there is a skip specified, that should not be forwarded to the shards.

This can be observed by running the test jstests/core/explain_count.js against a cluster with multiple shards - although without modification the test will fail earlier because it doesn't correctly add the 'nSkipped' totals from each shard. Once that issue is resolved, this assertion fails, because each shard will apply the skip of 3 in the explained version, resulting in the following explain output, implying there were only 4 in the resulting count:

[js_test:explain_count] 2018-01-04T23:56:43.232+0000 {
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 	"queryPlanner" : {
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 		"mongosPlannerVersion" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 		"winningPlan" : {
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 			"stage" : "SHARD_MERGE",
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 			"shards" : [
[js_test:explain_count] 2018-01-04T23:56:43.232+0000 				{
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 					"shardName" : "shard0000",
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 					"connectionString" : "localhost:20503",
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 					"serverInfo" : {
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 						"host" : "ip-10-218-215-76",
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 						"port" : 20503,
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 						"version" : "3.7.0-405-g534b1d0c5a-patch-5a4eb2bfe3c33103b7004eb0",
[js_test:explain_count] 2018-01-04T23:56:43.233+0000 						"gitVersion" : "534b1d0c5abc8f62d7e3961081f54fd965480ddc"
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					},
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					"plannerVersion" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					"namespace" : "test.jstests_explain_count",
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					"indexFilterSet" : false,
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					"winningPlan" : {
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 						"stage" : "COUNT"
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					},
[js_test:explain_count] 2018-01-04T23:56:43.234+0000 					"rejectedPlans" : [ ]
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 				},
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 				{
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 					"shardName" : "shard0001",
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 					"connectionString" : "localhost:20504",
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 					"serverInfo" : {
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 						"host" : "ip-10-218-215-76",
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 						"port" : 20504,
[js_test:explain_count] 2018-01-04T23:56:43.235+0000 						"version" : "3.7.0-405-g534b1d0c5a-patch-5a4eb2bfe3c33103b7004eb0",
[js_test:explain_count] 2018-01-04T23:56:43.236+0000 						"gitVersion" : "534b1d0c5abc8f62d7e3961081f54fd965480ddc"
[js_test:explain_count] 2018-01-04T23:56:43.236+0000 					},
[js_test:explain_count] 2018-01-04T23:56:43.236+0000 					"plannerVersion" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.236+0000 					"namespace" : "test.jstests_explain_count",
[js_test:explain_count] 2018-01-04T23:56:43.236+0000 					"indexFilterSet" : false,
[js_test:explain_count] 2018-01-04T23:56:43.237+0000 					"winningPlan" : {
[js_test:explain_count] 2018-01-04T23:56:43.237+0000 						"stage" : "COUNT"
[js_test:explain_count] 2018-01-04T23:56:43.237+0000 					},
[js_test:explain_count] 2018-01-04T23:56:43.237+0000 					"rejectedPlans" : [ ]
[js_test:explain_count] 2018-01-04T23:56:43.237+0000 				}
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 			]
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		}
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 	},
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 	"executionStats" : {
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		"nReturned" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		"executionTimeMillis" : 2,
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		"totalKeysExamined" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		"totalDocsExamined" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.238+0000 		"executionStages" : {
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"stage" : "SHARD_MERGE",
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"nReturned" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"executionTimeMillis" : 2,
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"totalKeysExamined" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"totalDocsExamined" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"totalChildMillis" : NumberLong(0),
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 			"shards" : [
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 				{
[js_test:explain_count] 2018-01-04T23:56:43.239+0000 					"shardName" : "shard0000",
[js_test:explain_count] 2018-01-04T23:56:43.240+0000 					"executionSuccess" : true,
[js_test:explain_count] 2018-01-04T23:56:43.240+0000 					"executionStages" : {
[js_test:explain_count] 2018-01-04T23:56:43.240+0000 						"stage" : "COUNT",
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"nReturned" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"executionTimeMillisEstimate" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"works" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"advanced" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"needTime" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"needYield" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"saveState" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.241+0000 						"restoreState" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.242+0000 						"isEOF" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.242+0000 						"invalidates" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.242+0000 						"nCounted" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.242+0000 						"nSkipped" : 0
[js_test:explain_count] 2018-01-04T23:56:43.242+0000 					}
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 				},
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 				{
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 					"shardName" : "shard0001",
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 					"executionSuccess" : true,
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 					"executionStages" : {
[js_test:explain_count] 2018-01-04T23:56:43.243+0000 						"stage" : "COUNT",
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"nReturned" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"executionTimeMillisEstimate" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"works" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"advanced" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"needTime" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.244+0000 						"needYield" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"saveState" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"restoreState" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"isEOF" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"invalidates" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"nCounted" : 0,
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 						"nSkipped" : 0
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 					}
[js_test:explain_count] 2018-01-04T23:56:43.245+0000 				}
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 			]
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 		}
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 	},
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 	"ok" : 1,
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 	"$clusterTime" : {
[js_test:explain_count] 2018-01-04T23:56:43.246+0000 		"clusterTime" : Timestamp(1515110203, 12),
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 		"signature" : {
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 			"keyId" : NumberLong(0)
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 		}
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 	},
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 	"operationTime" : Timestamp(1515110203, 12)
[js_test:explain_count] 2018-01-04T23:56:43.247+0000 }


Generated at Thu Feb 08 04:30:37 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.