@@ -159,6 +159,103 @@ TEST_F(CreateDatabaseTest, createDatabaseSuccess) {
159159 future.default_timed_get ();
160160}
161161
162+ TEST_F (CreateDatabaseTest,
163+ createDatabaseShardReturnsNamespaceNotFoundForFlushDatabaseCacheUpdates) {
164+ const std::string dbname = " db1" ;
165+
166+ ShardType s0;
167+ s0.setName (" shard0000" );
168+ s0.setHost (" ShardHost0:27017" );
169+ setupShards (vector<ShardType>{s0});
170+
171+ ShardType s1;
172+ s1.setName (" shard0001" );
173+ s1.setHost (" ShardHost1:27017" );
174+ setupShards (vector<ShardType>{s1});
175+
176+ ShardType s2;
177+ s2.setName (" shard0002" );
178+ s2.setHost (" ShardHost2:27017" );
179+ setupShards (vector<ShardType>{s2});
180+
181+ // Prime the shard registry with information about the existing shards
182+ shardRegistry ()->reload (operationContext ());
183+
184+ // Set up all the target mocks return values.
185+ RemoteCommandTargeterMock::get (
186+ uassertStatusOK (shardRegistry ()->getShard (operationContext (), s0.getName ()))->getTargeter ())
187+ ->setFindHostReturnValue (HostAndPort (s0.getHost ()));
188+ RemoteCommandTargeterMock::get (
189+ uassertStatusOK (shardRegistry ()->getShard (operationContext (), s1.getName ()))->getTargeter ())
190+ ->setFindHostReturnValue (HostAndPort (s1.getHost ()));
191+ RemoteCommandTargeterMock::get (
192+ uassertStatusOK (shardRegistry ()->getShard (operationContext (), s2.getName ()))->getTargeter ())
193+ ->setFindHostReturnValue (HostAndPort (s2.getHost ()));
194+
195+ // Now actually start the createDatabase work.
196+
197+ auto future = launchAsync ([this , dbname] {
198+ ThreadClient tc (" Test" , getGlobalServiceContext ());
199+ auto opCtx = cc ().makeOperationContext ();
200+ ShardingCatalogManager::get (opCtx.get ())->createDatabase (opCtx.get (), dbname);
201+ });
202+
203+ // Return size information about first shard
204+ onCommand ([&](const RemoteCommandRequest& request) {
205+ ASSERT_EQUALS (s0.getHost (), request.target .toString ());
206+ ASSERT_EQUALS (" admin" , request.dbname );
207+ std::string cmdName = request.cmdObj .firstElement ().fieldName ();
208+ ASSERT_EQUALS (" listDatabases" , cmdName);
209+ ASSERT_FALSE (request.cmdObj .hasField (repl::ReadConcernArgs::kReadConcernFieldName ));
210+
211+ ASSERT_BSONOBJ_EQ (
212+ ReadPreferenceSetting (ReadPreference::PrimaryPreferred).toContainingBSON (),
213+ rpc::TrackingMetadata::removeTrackingData (request.metadata ));
214+
215+ return BSON (" ok" << 1 << " totalSize" << 10 );
216+ });
217+
218+ // Return size information about second shard
219+ onCommand ([&](const RemoteCommandRequest& request) {
220+ ASSERT_EQUALS (s1.getHost (), request.target .toString ());
221+ ASSERT_EQUALS (" admin" , request.dbname );
222+ std::string cmdName = request.cmdObj .firstElement ().fieldName ();
223+ ASSERT_EQUALS (" listDatabases" , cmdName);
224+ ASSERT_FALSE (request.cmdObj .hasField (repl::ReadConcernArgs::kReadConcernFieldName ));
225+
226+ ASSERT_BSONOBJ_EQ (
227+ ReadPreferenceSetting (ReadPreference::PrimaryPreferred).toContainingBSON (),
228+ rpc::TrackingMetadata::removeTrackingData (request.metadata ));
229+
230+ return BSON (" ok" << 1 << " totalSize" << 1 );
231+ });
232+
233+ // Return size information about third shard
234+ onCommand ([&](const RemoteCommandRequest& request) {
235+ ASSERT_EQUALS (s2.getHost (), request.target .toString ());
236+ ASSERT_EQUALS (" admin" , request.dbname );
237+ std::string cmdName = request.cmdObj .firstElement ().fieldName ();
238+ ASSERT_EQUALS (" listDatabases" , cmdName);
239+
240+ ASSERT_BSONOBJ_EQ (
241+ ReadPreferenceSetting (ReadPreference::PrimaryPreferred).toContainingBSON (),
242+ rpc::TrackingMetadata::removeTrackingData (request.metadata ));
243+
244+ return BSON (" ok" << 1 << " totalSize" << 100 );
245+ });
246+
247+ // Return NamespaceNotFound for _flushDatabaseCacheUpdates
248+ onCommand ([&](const RemoteCommandRequest& request) {
249+ std::string cmdName = request.cmdObj .firstElement ().fieldName ();
250+ ASSERT_EQUALS (" _flushDatabaseCacheUpdates" , cmdName);
251+
252+ return BSON (" ok" << 0 << " code" << ErrorCodes::NamespaceNotFound << " errmsg"
253+ << " dummy" );
254+ });
255+
256+ future.default_timed_get ();
257+ }
258+
162259TEST_F (CreateDatabaseTest, createDatabaseDBExists) {
163260 const std::string dbname = " db3" ;
164261
0 commit comments