[SERVER-70761] Validation for one view is incorrectly applied to all views on viewGraph refresh Created: 21/Oct/22  Updated: 29/Oct/23  Resolved: 14/Jun/23

Status: Closed
Project: Core Server
Component/s: None
Affects Version/s: 6.0.0-rc13, 6.2.0-rc0
Fix Version/s: 7.1.0-rc0

Type: Bug Priority: Major - P3
Reporter: Alya Berciu Assignee: Shin Yee Tan
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Depends
Backwards Compatibility: Fully Compatible
Operating System: ALL
Steps To Reproduce:

See linked BF for a repro script.

Sprint: Execution Team 2023-02-06, Execution Team 2023-04-03, Execution Team 2023-05-01, Execution Team 2023-05-15, Execution Team 2023-05-29, Execution Team 2023-06-12, Execution NAMR Team 2023-06-26
Participants:
Linked BF Score: 0

 Description   

In the linked BF, we have two tests running in parallel: (1) jstests/core/[api_version_test_expression.js|https://github.com/10gen/mongo/blob/master/jstests/core/api_version_test_expression.js] and (2) jstests/core/[api_version_new_50_language_features.js|https://github.com/10gen/mongo/blob/master/jstests/core/api_version_new_50_language_features.js].

 

(1) successfully creates views with validators on them. Several of these may collide with (2) in a similar way; for example, (1) creates a view "unstableView" with the pipeline:

 

[{"v": {"$_testApiVersion": {"unstable": true}}}}}]

 

 

 

(2) then tries to create a view with apiStrict: true. This view will define a PipelineValidatorFn validatePipeline which is passed into upsertIntoGraph; this validates that the pipeline we're creating doesn't include (among other things) stages marked as unstable. The test failure happens while this view is being created and _viewGraphNeedsRefresh is set to true. At this point, we iterate over views in our view map, and call the same validatePipeline function for apiStrict:true on _all views, including the ones which shouldn't be getting validated.

This wouldn't cause a test failure if we were only returning an error status code; however, it seems that the particular uassert being triggered is not returned as a Status with an error code (which we would handle correctly), but rather thrown as an error which is not caught.

In any case, we shouldn't be applying the apiStrict:true validation for one view to all views in the viewGraph at all.



 Comments   
Comment by Githook User [ 13/Jun/23 ]

Author:

{'name': 'Shin Yee Tan', 'email': 'shinyee.tan@mongodb.com', 'username': 'shinyeet'}

Message: SERVER-70761 Update api version tests to use unique db namespaces
Branch: master
https://github.com/mongodb/mongo/commit/669dc354f8316b2e04cf5c5eb36b6282278cc339

Comment by Shin Yee Tan [ 09/Jun/23 ]

What I'm observing is that we have two clients and both are using the test namespace. We set apiStrict in conn10 for api_version_new_50_language_features.js and this client will reject anything outside of the stable API. When we need to refresh the view graph, we will iterate through all views in the viewMap for namespace test including the views in api_version_test_expression.js. It is then expected behavior that views from api_version_test_expression.js with pipelines containing an unstable expression are erroring with apiStrict.

As for the uassert, I believe the expected behavior is that we do fail the test when we hit this since in the test we assert.CommandWorked.

I'm going to update the js tests to use unique namespaces and this should fix the issue.

Comment by Shin Yee Tan [ 08/Jun/23 ]

I added some log statements to better understand this is a snippet of what I'm seeing:

[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expression parse obj:{ $_testApiVersion: { unstable: true } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expr passed in is { unstable: true }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"initial unstableField:false"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"field is unstable field and set to true"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expressiontestapiversion apiStrict: true unstablefield:true expCtx.ns:test.api_version_test_expression_validated"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.233+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"document source parse for view "}
[j0] {"t":{"$date":"2023-06-08T22:23:27.234+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"expression parse obj:{ $setField: { input: \"$$ROOT\", field: \"x\", value: \"foo\" } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.241+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expression parse obj:{ $_testApiVersion: { unstable: true } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.242+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expr passed in is { unstable: true }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.242+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"initial unstableField:false"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.242+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"field is unstable field and set to true"}
[js_test:parallel_views] sh19425|
[js_test:parallel_views] sh19425|
[j0] {"t":{"$date":"2023-06-08T22:23:27.242+00:00"},"s":"I",  "c":"STORAGE",  "id":20320,   "ctx":"conn9","msg":"createCollection","attr":{"namespace":"test.api_version_test_expression_validated","uuidDisposition":"generated","uuid":{"uuid":{"$uuid":"83cf992b-a4f2-4a31-8306-8a62e26d093a"}},"options":{"validator":{"$expr":{"$_testApiVersion":{"unstable":true}}}}}}
[js_test:parallel_views] sh19425| [jsTest] ----
[js_test:parallel_views] sh19425| [jsTest] assert view success with api strict [
[js_test:parallel_views] sh19425| [jsTest] 	{
[js_test:parallel_views] sh19425| [jsTest] 		"$set" : {
[js_test:parallel_views] sh19425| [jsTest] 			"x" : {
[js_test:parallel_views] sh19425| [jsTest] 				"$setField" : {
[js_test:parallel_views] sh19425| [jsTest] 					"input" : "$$ROOT",
[js_test:parallel_views] sh19425| [jsTest] 					"field" : "x",
[js_test:parallel_views] sh19425| [jsTest] 					"value" : "foo"
[js_test:parallel_views] sh19425| [jsTest] 				}
[js_test:parallel_views] sh19425| [jsTest] 			}
[js_test:parallel_views] sh19425| [jsTest] 		}
[js_test:parallel_views] sh19425| [jsTest] 	}
[js_test:parallel_views] sh19425| [jsTest] ] api_version_new_50_language_features_view api_version_new_50_language_features
[js_test:parallel_views] sh19425| [jsTest] ----
[js_test:parallel_views] sh19425|
[j0] {"t":{"$date":"2023-06-08T22:23:27.248+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"viewGraphNeedsRefresh view: test.api_version_new_50_language_features_view viewOn:test.api_version_new_50_language_features pipeline:({\"$set\":{\"x\":{\"$setField\":{\"input\":\"$$ROOT\",\"field\":\"x\",\"value\":\"foo\"}}}})"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.248+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"validatePipeline made expCtx with view: test.view, viewOn: test.api_version_test_expression, pipeline: ()"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"validatePipeline made expCtx with view: test.unstableView, viewOn: test.api_version_test_expression, pipeline: ({\"$project\":{\"v\":{\"$_testApiVersion\":{\"unstable\":true}}}})"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"document source parse for view test.unstableView"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"documentsourceproject::createfrombson fieldNameStringData: $project kStageName:$project elem.obj:{ v: { $_testApiVersion: { unstable: true } } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"expression parse obj:{ $_testApiVersion: { unstable: true } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"expr passed in is { unstable: true }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.249+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"initial unstableField:false"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.250+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"field is unstable field and set to true"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.250+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"expressiontestapiversion apiStrict: true unstablefield:true expCtx.ns:test.api_version_test_expression"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.252+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expression parse obj:{ $_testApiVersion: { unstable: true } }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.252+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expr passed in is { unstable: true }"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.252+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"initial unstableField:false"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.252+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"field is unstable field and set to true"}
[j0] {"t":{"$date":"2023-06-08T22:23:27.263+00:00"},"s":"I",  "c":"INDEX",    "id":20345,   "ctx":"conn9","msg":"Index build: done building","attr":{"buildUUID":null,"collectionUUID":{"uuid":{"$uuid":"83cf992b-a4f2-4a31-8306-8a62e26d093a"}},"namespace":"test.api_version_test_expression_validated","index":"_id_","ident":"index-24-624554566849028107","collectionIdent":"collection-23-624554566849028107","commitTimestamp":null}}
[js_test:parallel_views] sh19425| 2023-06-08T22:23:27.265Z assert: command failed: {
[js_test:parallel_views] sh19425| 	"ok" : 0,
[js_test:parallel_views] sh19425| 	"errmsg" : "Invalid $project :: caused by :: Provided apiStrict is true with an unstable parameter.",
[js_test:parallel_views] sh19425| 	"code" : 323,
[js_test:parallel_views] sh19425| 	"codeName" : "APIStrictError"
[js_test:parallel_views] sh19425| } with original command request: {
[js_test:parallel_views] sh19425| 	"create" : "api_version_new_50_language_features_view",
[js_test:parallel_views] sh19425| 	"viewOn" : "api_version_new_50_language_features",
[js_test:parallel_views] sh19425| 	"pipeline" : [
[js_test:parallel_views] sh19425| 		{
[js_test:parallel_views] sh19425| 			"$set" : {
[js_test:parallel_views] sh19425| 				"x" : {
[js_test:parallel_views] sh19425| 					"$setField" : {
[js_test:parallel_views] sh19425| 						"input" : "$$ROOT",
[js_test:parallel_views] sh19425| 						"field" : "x",
[js_test:parallel_views] sh19425| 						"value" : "foo"
[js_test:parallel_views] sh19425| 					}
[js_test:parallel_views] sh19425| 				}
[js_test:parallel_views] sh19425| 			}
[js_test:parallel_views] sh19425| 		}
[js_test:parallel_views] sh19425| 	],
[js_test:parallel_views] sh19425| 	"apiStrict" : true,
[js_test:parallel_views] sh19425| 	"apiVersion" : "1",
[js_test:parallel_views] sh19425| 	"lsid" : {
[js_test:parallel_views] sh19425| 		"id" : UUID("d3d9cc19-e3fa-4266-a48f-ee08d26ebd0d")
[js_test:parallel_views] sh19425| 	}
[js_test:parallel_views] sh19425| } on connection: connection to localhost:20000
[js_test:parallel_views] sh19425| _getErrorWithCode@src/mongo/shell/utils.js:24:13
[js_test:parallel_views] sh19425| doassert@src/mongo/shell/assert.js:18:14
[js_test:parallel_views] sh19425| _assertCommandWorked@src/mongo/shell/assert.js:766:25
[js_test:parallel_views] sh19425| assert.commandWorked@src/mongo/shell/assert.js:860:16
[js_test:parallel_views] sh19425| assertViewSucceedsWithAPIStrict@jstests/libs/api_version_helpers.js:71:16
[js_test:parallel_views] sh19425| @jstests/core/api/api_version_new_50_language_features.js:36:23
[js_test:parallel_views] sh19425| @jstests/core/api/api_version_new_50_language_features.js:74:3

From what I can see, conn9 is running api_version_test_expression and conn10 is running api_version_new_50_language_features. In the earliest parsing on conn9, I already see apiStrict:true. 

[j0] {"t":{"$date":"2023-06-08T22:23:26.006+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn9","msg":"expressiontestapiversion apiStrict: true unstablefield:true expCtx.ns:test.api_version_test_expression"}

Then I'm starting to see a few instances of conn10 validating what looks like views from api_version_test_expression. eg.

[j0] {"t":{"$date":"2023-06-08T22:23:27.036+00:00"},"s":"I",  "c":"-",        "id":0,       "ctx":"conn10","msg":"validatePipeline made expCtx with view: test.view, viewOn: test.api_version_test_expression, pipeline: ()"}

The above log line where the validatePipeline with views from api_version_test_expression only occur when _viewGraphNeedsRefresh however this happens a few times without failing. The reproducer fails when the expression being parsed is `{ $_testApiVersion:

{ unstable: true }

` on conn10. Somehow we are parsing an expression from api_version_test_expression on conn10 and that's when our tests fail.

I wonder if this is a test issue because both tests are using the test namespace and so their views are existing in the same db.

Comment by Shin Yee Tan [ 07/Jun/23 ]

I got to run this reproducer with gdb:

{
    db.a.drop();
    var parallel = startParallelShell(() => {
        try {
            while (true) {
                sleep(Math.random() * 1000);
                load("jstests/core/api/api_version_new_50_language_features.js");
            }
        } finally {
            db.a.insertOne({done: true});
        }
    });
    while (db.a.count() == 0) {
        load("jstests/core/api/api_version_test_expression.js");
    }
    db.a.drop();
    parallel();
}

Since this is a parallel test, I see two threads executing.

The jstest error we get from the reproducer is:

[js_test:parallel_views] sh21846| 2023-06-07T21:48:05.942Z assert: command failed: {
[js_test:parallel_views] sh21846| 	"ok" : 0,
[js_test:parallel_views] sh21846| 	"errmsg" : "Invalid $project :: caused by :: Provided apiStrict is true with an unstable parameter.",
[js_test:parallel_views] sh21846| 	"code" : 323,
[js_test:parallel_views] sh21846| 	"codeName" : "APIStrictError"
[js_test:parallel_views] sh21846| } with original command request: {
[js_test:parallel_views] sh21846| 	"create" : "api_version_new_50_language_features_view",
[js_test:parallel_views] sh21846| 	"viewOn" : "api_version_new_50_language_features",
[js_test:parallel_views] sh21846| 	"pipeline" : [
[js_test:parallel_views] sh21846| 		{
[js_test:parallel_views] sh21846| 			"$set" : {
[js_test:parallel_views] sh21846| 				"x" : {
[js_test:parallel_views] sh21846| 					"$getField" : {
[js_test:parallel_views] sh21846| 						"input" : "$$ROOT",
[js_test:parallel_views] sh21846| 						"field" : "x"
[js_test:parallel_views] sh21846| 					}
[js_test:parallel_views] sh21846| 				}
[js_test:parallel_views] sh21846| 			}
[js_test:parallel_views] sh21846| 		}
[js_test:parallel_views] sh21846| 	],
[js_test:parallel_views] sh21846| 	"apiStrict" : true,
[js_test:parallel_views] sh21846| 	"apiVersion" : "1",
[js_test:parallel_views] sh21846| 	"lsid" : {
[js_test:parallel_views] sh21846| 		"id" : UUID("cdefcd8b-b41e-4c6c-80db-01378614779a")
[js_test:parallel_views] sh21846| 	}
[js_test:parallel_views] sh21846| } on connection: connection to localhost:20000
[js_test:parallel_views] sh21846| _getErrorWithCode@src/mongo/shell/utils.js:24:13
[js_test:parallel_views] sh21846| doassert@src/mongo/shell/assert.js:18:14
[js_test:parallel_views] sh21846| _assertCommandWorked@src/mongo/shell/assert.js:766:25
[js_test:parallel_views] sh21846| assert.commandWorked@src/mongo/shell/assert.js:860:16
[js_test:parallel_views] sh21846| assertViewSucceedsWithAPIStrict@jstests/libs/api_version_helpers.js:71:16
[js_test:parallel_views] sh21846| @jstests/core/api/api_version_new_50_language_features.js:35:23
[js_test:parallel_views] sh21846| @jstests/core/api/api_version_new_50_language_features.js:73:3

and this is the relevant stacktrace that I'm seeing

#0  mongo::ExpressionTestApiVersion::parse(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&)::$_6::operator()() const (this=0x7f2c2cf6fcc8) at src/mongo/db/pipeline/expression_test_api_version.cpp:78
#1  0x00007f2c62b13c5a in mongo::ExpressionTestApiVersion::parse (expCtx=0x7f2c3dbd3c20, expr=..., vps=...) at src/mongo/db/pipeline/expression_test_api_version.cpp:78
#2  0x00007f2c658e1ed8 in std::__invoke_impl<boost::intrusive_ptr<mongo::Expression>, boost::intrusive_ptr<mongo::Expression> (*&)(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&), mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&> (__f=@0x7f2c459e8638: 0x7f2c62b13710 <mongo::ExpressionTestApiVersion::parse(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&)>, __args=..., __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:61
#3  0x00007f2c658e1dff in std::__invoke_r<boost::intrusive_ptr<mongo::Expression>, boost::intrusive_ptr<mongo::Expression> (*&)(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&), mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&> (__fn=@0x7f2c459e8638: 0x7f2c62b13710 <mongo::ExpressionTestApiVersion::parse(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&)>, __args=..., __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:114
#4  0x00007f2c658e1caf in std::_Function_handler<boost::intrusive_ptr<mongo::Expression> (mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&), boost::intrusive_ptr<mongo::Expression> (*)(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&)>::_M_invoke(std::_Any_data const&, mongo::ExpressionContext*&&, mongo::BSONElement&&, mongo::VariablesParseState const&) (__functor=..., __args=..., __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:290
#5  0x00007f2c62a5ac2f in std::function<boost::intrusive_ptr<mongo::Expression> (mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&)>::operator()(mongo::ExpressionContext*, mongo::BSONElement, mongo::VariablesParseState const&) const (this=0x7f2c459e8638, __args=..., __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:590
#6  0x00007f2c629aeb40 in mongo::Expression::parseExpression (expCtx=0x7f2c3dbd3c20, obj=unowned BSONObj 39 bytes @ 0x7f2c45a77fbd = {...}, vps=...) at src/mongo/db/pipeline/expression.cpp:232
#7  0x00007f2c676f1765 in mongo::projection_ast::(anonymous namespace)::attemptToParseGenericExpression (parseCtx=0x7f2c2cf70bf8, path=..., subObj=unowned BSONObj 39 bytes @ 0x7f2c45a77fbd = {...}, parent=0x7f2c2cf70bb0) at src/mongo/db/query/projection_parser.cpp:288
#8  0x00007f2c676f0dd9 in mongo::projection_ast::(anonymous namespace)::parseSubObjectAsExpression (parseCtx=0x7f2c2cf70bf8, path=..., subObj=unowned BSONObj 39 bytes @ 0x7f2c45a77fbd = {...}, parent=0x7f2c2cf70bb0) at src/mongo/db/query/projection_parser.cpp:370
#9  0x00007f2c676eef40 in mongo::projection_ast::(anonymous namespace)::parseSubObject (ctx=0x7f2c2cf70bf8, objFieldName="v", fullPathToParent=, obj=unowned BSONObj 39 bytes @ 0x7f2c45a77fbd = {...}, parent=0x7f2c2cf70bb0) at src/mongo/db/query/projection_parser.cpp:510
#10 0x00007f2c676ee0f6 in mongo::projection_ast::(anonymous namespace)::parseElement (ctx=0x7f2c2cf70bf8, elem=..., fullPathToParent=, parent=0x7f2c2cf70bb0) at src/mongo/db/query/projection_parser.cpp:573
#11 0x00007f2c676ed858 in mongo::projection_ast::parseAndAnalyze (expCtx=0x7f2c3dbd3c20 = {...}, obj=unowned BSONObj 47 bytes @ 0x7f2c45a77fb6 = {...}, query=0x0, queryObj=unowned empty BSONObj @ 0x7f2c83cf6977 <mongo::BSONObj::kEmptyObjectPrototype>, policies=..., shouldOptimize=false) at src/mongo/db/query/projection_parser.cpp:607
#12 0x00007f2c676ee628 in mongo::projection_ast::parseAndAnalyze (expCtx=uninitialized, obj=unowned BSONObj 47 bytes @ 0x7f2c45a77fb6 = {...}, policies=..., shouldOptimize=false) at src/mongo/db/query/projection_parser.cpp:654
#13 0x00007f2c66cb186d in mongo::DocumentSourceProject::create (projectSpec=unowned BSONObj 47 bytes @ 0x7f2c45a77fb6 = {...}, expCtx=0x7f2c3dbd3c20 = {...}, specifiedName="$project") at src/mongo/db/pipeline/document_source_project.h:64
#14 0x00007f2c66e419a2 in mongo::DocumentSourceProject::createFromBson (elem=..., expCtx=0x7f2c3dbd3c20 = {...}) at src/mongo/db/pipeline/document_source_project.cpp:130
#15 0x00007f2c7d7cdd20 in std::__invoke_impl<boost::intrusive_ptr<mongo::DocumentSource>, boost::intrusive_ptr<mongo::DocumentSource> (*&)(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&), mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&> (__f=@0x7f2c45cdf2a0: 0x7f2c66e41850 <mongo::DocumentSourceProject::createFromBson(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:61
#16 0x00007f2c7d7cdc4a in std::__invoke_r<boost::intrusive_ptr<mongo::DocumentSource>, boost::intrusive_ptr<mongo::DocumentSource> (*&)(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&), mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&> (__fn=@0x7f2c45cdf2a0: 0x7f2c66e41850 <mongo::DocumentSourceProject::createFromBson(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:114
#17 0x00007f2c7d7cdb0a in std::_Function_handler<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&), boost::intrusive_ptr<mongo::DocumentSource> (*)(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>::_M_invoke(std::_Any_data const&, mongo::BSONElement&&, boost::intrusive_ptr<mongo::ExpressionContext> const&) (__functor=..., __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:290
#18 0x00007f2c66c23faa in std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>::operator()(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&) const (this=0x7f2c45cdf2a0, __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:590
#19 0x00007f2c66bfb0e5 in mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1::operator()[abi:cxx11](mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&) const (this=0x7f2c45cdf2a0, stageSpec=..., expCtx=0x7f2c3dbd3c20 = {...}) at src/mongo/db/pipeline/document_source.cpp:107
#20 0x00007f2c66bfb020 in std::__invoke_impl<std::__cxx11::list<boost::intrusive_ptr<mongo::DocumentSource>, std::allocator<boost::intrusive_ptr<mongo::DocumentSource> > >, mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1&, mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&>(std::__invoke_other, mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1&, mongo::BSONElement&&, boost::intrusive_ptr<mongo::ExpressionContext> const&) (__f=..., __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:61
#21 0x00007f2c66bfaf7a in std::__invoke_r<std::__cxx11::list<boost::intrusive_ptr<mongo::DocumentSource>, std::allocator<boost::intrusive_ptr<mongo::DocumentSource> > >, mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1&, mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&>(mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1&, mongo::BSONElement&&, boost::intrusive_ptr<mongo::ExpressionContext> const&) (__fn=..., __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:114
#22 0x00007f2c66bfadda in std::_Function_handler<std::__cxx11::list<boost::intrusive_ptr<mongo::DocumentSource>, std::allocator<boost::intrusive_ptr<mongo::DocumentSource> > > (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&), mongo::DocumentSource::registerParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<boost::intrusive_ptr<mongo::DocumentSource> (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>, boost::optional<mongo::FeatureFlag>)::$_1>::_M_invoke(std::_Any_data const&, mongo::BSONElement&&, boost::intrusive_ptr<mongo::ExpressionContext> const&) (__functor=..., __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:290
#23 0x00007f2c66bfea7a in std::function<std::__cxx11::list<boost::intrusive_ptr<mongo::DocumentSource>, std::allocator<boost::intrusive_ptr<mongo::DocumentSource> > > (mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&)>::operator()(mongo::BSONElement, boost::intrusive_ptr<mongo::ExpressionContext> const&) const (this=0x7f2c45c90110, __args=0x7f2c3dbd3c20 = {...}, __args=0x7f2c3dbd3c20 = {...}) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:590
#24 0x00007f2c66bf556e in mongo::DocumentSource::parse[abi:cxx11](boost::intrusive_ptr<mongo::ExpressionContext> const&, mongo::BSONObj) (expCtx=0x7f2c3dbd3c20 = {...}, stageObj=owned BSONObj 62 bytes @ 0x7f2c45a77fa8 = {...}) at src/mongo/db/pipeline/document_source.cpp:143
#25 0x00007f2c66f12be2 in mongo::Pipeline::parseCommon<mongo::BSONObj>(std::vector<mongo::BSONObj, std::allocator<mongo::BSONObj> > const&, boost::intrusive_ptr<mongo::ExpressionContext> const&, std::function<void (mongo::Pipeline const&)>, std::function<mongo::BSONObj (mongo::BSONObj)>) (rawPipeline=std::vector of length 1, capacity 1 = {...}, expCtx=0x7f2c3dbd3c20 = {...}, validator=..., getElemFunc=...) at src/mongo/db/pipeline/pipeline.cpp:200
#26 0x00007f2c66f089c2 in mongo::Pipeline::parse(std::vector<mongo::BSONObj, std::allocator<mongo::BSONObj> > const&, boost::intrusive_ptr<mongo::ExpressionContext> const&, std::function<void (mongo::Pipeline const&)>) (rawPipeline=std::vector of length 1, capacity 1 = {...}, expCtx=0x7f2c3dbd3c20 = {...}, validator=...) at src/mongo/db/pipeline/pipeline.cpp:244
#27 0x00007f2c7c28436c in mongo::view_catalog_helpers::validatePipeline (opCtx=0x7f2c3d602920, viewDef=...) at src/mongo/db/views/view_catalog_helpers.cpp:95
#28 0x00007f2c7164b6bd in std::__invoke_impl<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > >, mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (*&)(mongo::OperationContext*, mongo::ViewDefinition const&), mongo::OperationContext*, mongo::ViewDefinition const&> (__f=@0x7f2c2cf72cc8: 0x7f2c7c283af0 <mongo::view_catalog_helpers::validatePipeline(mongo::OperationContext*, mongo::ViewDefinition const&)>, __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:61
#29 0x00007f2c7164b5fa in std::__invoke_r<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > >, mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (*&)(mongo::OperationContext*, mongo::ViewDefinition const&), mongo::OperationContext*, mongo::ViewDefinition const&> (__fn=@0x7f2c2cf72cc8: 0x7f2c7c283af0 <mongo::view_catalog_helpers::validatePipeline(mongo::OperationContext*, mongo::ViewDefinition const&)>, __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/invoke.h:114
#30 0x00007f2c7164b4aa in std::_Function_handler<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&), mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (*)(mongo::OperationContext*, mongo::ViewDefinition const&)>::_M_invoke(std::_Any_data const&, mongo::OperationContext*&&, mongo::ViewDefinition const&) (__functor=..., __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:290
#31 0x00007f2c6b6bebe6 in std::function<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&)>::operator()(mongo::OperationContext*, mongo::ViewDefinition const&) const (this=0x7f2c2cf72cc8, __args=..., __args=...) at /opt/mongodbtoolchain/revisions/11316f1e7b36f08dcdd2ad0640af18f9287876f4/stow/gcc-v4.zdM/lib/gcc/x86_64-mongodb-linux/11.3.0/../../../../include/c++/11.3.0/bits/std_function.h:590
#32 0x00007f2c6b6b9cef in mongo::ViewsForDatabase::_upsertIntoGraph(mongo::OperationContext*, mongo::ViewDefinition const&, std::function<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&)> const&, bool)::$_5::operator()(mongo::ViewDefinition const&, bool) const (this=0x7f2c2cf724d0, viewDef=..., needsValidation=false) at src/mongo/db/catalog/views_for_database.cpp:230
#33 0x00007f2c6b6b88fe in mongo::ViewsForDatabase::_upsertIntoGraph(mongo::OperationContext*, mongo::ViewDefinition const&, std::function<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&)> const&, bool) (this=0x7f2c2cf728e0, opCtx=0x7f2c3d602920, viewDef=..., validatePipeline=..., needsValidation=true) at src/mongo/db/catalog/views_for_database.cpp:265
#34 0x00007f2c6b6b82f3 in mongo::ViewsForDatabase::insert(mongo::OperationContext*, mongo::CollectionPtr const&, mongo::NamespaceString const&, mongo::NamespaceString const&, mongo::BSONArray const&, std::function<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&)> const&, mongo::BSONObj const&, mongo::ViewsForDatabase::Durability) (this=0x7f2c2cf728e0, opCtx=0x7f2c3d602920, systemViews=..., viewName=..., viewOn=..., pipeline=..., validatePipeline=..., collator=unowned empty BSONObj @ 0x7f2c83cf6977 <mongo::BSONObj::kEmptyObjectPrototype>, durability=mongo::ViewsForDatabase::Durability::kNotYetDurable) at src/mongo/db/catalog/views_for_database.cpp:156
#35 0x00007f2c6b58c059 in mongo::CollectionCatalog::createView(mongo::OperationContext*, mongo::NamespaceString const&, mongo::NamespaceString const&, mongo::BSONArray const&, std::function<mongo::StatusWith<absl::lts_20211102::node_hash_set<mongo::NamespaceString, absl::lts_20211102::hash_internal::Hash<mongo::NamespaceString>, std::equal_to<mongo::NamespaceString>, std::allocator<mongo::NamespaceString> > > (mongo::OperationContext*, mongo::ViewDefinition const&)> const&, mongo::BSONObj const&, mongo::ViewsForDatabase::Durability) const (this=0x7f2c3e0f4c70, opCtx=0x7f2c3d602920, viewName=..., viewOn=..., pipeline=..., validatePipeline=..., collation=unowned empty BSONObj @ 0x7f2c83cf6977 <mongo::BSONObj::kEmptyObjectPrototype>, durability=mongo::ViewsForDatabase::Durability::kNotYetDurable) at src/mongo/db/catalog/collection_catalog.cpp:639
#36 0x00007f2c5fc8d8a5 in mongo::DatabaseImpl::createView (this=0x7f2c3c8e6e80, opCtx=0x7f2c3d602920, viewName=..., options=...) at src/mongo/db/catalog/database_impl.cpp:668

I'm going to try to figure out where apiStrict and unstableField are assigned for the view pipeline.

Generated at Thu Feb 08 06:17:03 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.