@@ -159,6 +159,103 @@ TEST_F(CreateDatabaseTest, createDatabaseSuccess) {
159
159
future.default_timed_get ();
160
160
}
161
161
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
+
162
259
TEST_F (CreateDatabaseTest, createDatabaseDBExists) {
163
260
const std::string dbname = " db3" ;
164
261
0 commit comments