Skip to content

Commit 6b8cda3

Browse files
committed
PHPC-1291: Add APM based tests for retryable reads
1 parent 9ce1238 commit 6b8cda3

File tree

4 files changed

+222
-0
lines changed

4 files changed

+222
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
--TEST--
2+
Retryable reads: executeReadCommand is retried once
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_libmongoc_crypto(); ?>
6+
<?php skip_if_no_failcommand_failpoint(); ?>
7+
<?php skip_if_not_clean(); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
class Observer implements MongoDB\Driver\Monitoring\CommandSubscriber
13+
{
14+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
15+
{
16+
printf("Command started: %s\n", $event->getCommandName());
17+
}
18+
19+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
20+
{
21+
}
22+
23+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
24+
{
25+
}
26+
}
27+
28+
$manager = new MongoDB\Driver\Manager(URI, ['retryReads' => true]);
29+
30+
$bulk = new MongoDB\Driver\BulkWrite;
31+
$bulk->insert(['x' => 1]);
32+
$bulk->insert(['x' => 2]);
33+
34+
$manager->executeBulkWrite(NS, $bulk);
35+
36+
configureFailPoint($manager, 'failCommand', ['times' => 1], ['failCommands' => ['aggregate'], 'closeConnection' => true]);
37+
38+
$observer = new Observer;
39+
MongoDB\Driver\Monitoring\addSubscriber($observer);
40+
41+
$command = new MongoDB\Driver\Command([
42+
'aggregate' => COLLECTION_NAME,
43+
'pipeline' => [
44+
['$group' => ['_id' => 1, 'n' => ['$sum' => 1]]],
45+
],
46+
'cursor' => (object) [],
47+
]);
48+
$cursor = $manager->executeReadCommand(DATABASE_NAME, $command);
49+
var_dump(iterator_to_array($cursor));
50+
51+
MongoDB\Driver\Monitoring\removeSubscriber($observer);
52+
53+
?>
54+
===DONE===
55+
<?php exit(0); ?>
56+
--EXPECTF--
57+
Command started: aggregate
58+
Command started: aggregate
59+
array(1) {
60+
[0]=>
61+
object(stdClass)#%d (2) {
62+
["_id"]=>
63+
int(1)
64+
["n"]=>
65+
int(2)
66+
}
67+
}
68+
===DONE===
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
--TEST--
2+
Retryable reads: executeQuery is retried once
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_libmongoc_crypto(); ?>
6+
<?php skip_if_no_failcommand_failpoint(); ?>
7+
<?php skip_if_not_clean(); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
class Observer implements MongoDB\Driver\Monitoring\CommandSubscriber
13+
{
14+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
15+
{
16+
printf("Command started: %s\n", $event->getCommandName());
17+
}
18+
19+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
20+
{
21+
}
22+
23+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
24+
{
25+
}
26+
}
27+
28+
$manager = new MongoDB\Driver\Manager(URI, ['retryReads' => true]);
29+
30+
$bulk = new MongoDB\Driver\BulkWrite;
31+
$bulk->insert(['x' => 1]);
32+
$bulk->insert(['x' => 2]);
33+
34+
$manager->executeBulkWrite(NS, $bulk);
35+
36+
configureFailPoint($manager, 'failCommand', ['times' => 1], ['failCommands' => ['find'], 'closeConnection' => true]);
37+
38+
$observer = new Observer;
39+
MongoDB\Driver\Monitoring\addSubscriber($observer);
40+
41+
$cursor = $manager->executeQuery(NS, new \MongoDB\Driver\Query(['x' => 1]));
42+
var_dump(iterator_count($cursor));
43+
44+
MongoDB\Driver\Monitoring\removeSubscriber($observer);
45+
46+
?>
47+
===DONE===
48+
<?php exit(0); ?>
49+
--EXPECT--
50+
Command started: find
51+
Command started: find
52+
int(1)
53+
===DONE===
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
--TEST--
2+
Retryable reads: executeReadCommand is not retried when retryable reads are disabled
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_libmongoc_crypto(); ?>
6+
<?php skip_if_no_failcommand_failpoint(); ?>
7+
--FILE--
8+
<?php
9+
require_once __DIR__ . "/../utils/basic.inc";
10+
11+
class Observer implements MongoDB\Driver\Monitoring\CommandSubscriber
12+
{
13+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
14+
{
15+
printf("Command started: %s\n", $event->getCommandName());
16+
}
17+
18+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
19+
{
20+
}
21+
22+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
23+
{
24+
}
25+
}
26+
27+
$manager = new MongoDB\Driver\Manager(URI, ['retryReads' => false]);
28+
29+
configureFailPoint($manager, 'failCommand', ['times' => 1], ['failCommands' => ['aggregate'], 'closeConnection' => true]);
30+
31+
$observer = new Observer;
32+
MongoDB\Driver\Monitoring\addSubscriber($observer);
33+
34+
throws(
35+
function() use ($manager) {
36+
$command = new MongoDB\Driver\Command([
37+
'aggregate' => COLLECTION_NAME,
38+
'pipeline' => [
39+
['$group' => ['_id' => 1, 'n' => ['$sum' => 1]]],
40+
],
41+
'cursor' => (object) [],
42+
]);
43+
$manager->executeReadCommand(DATABASE_NAME, $command);
44+
},
45+
\MongoDB\Driver\Exception\ConnectionTimeoutException::class
46+
);
47+
48+
?>
49+
===DONE===
50+
<?php exit(0); ?>
51+
--EXPECT--
52+
Command started: aggregate
53+
OK: Got MongoDB\Driver\Exception\ConnectionTimeoutException
54+
===DONE===
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
Retryable reads: executeQuery is not retried when retryable reads are disabled
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_libmongoc_crypto(); ?>
6+
<?php skip_if_no_failcommand_failpoint(); ?>
7+
--FILE--
8+
<?php
9+
require_once __DIR__ . "/../utils/basic.inc";
10+
11+
class Observer implements MongoDB\Driver\Monitoring\CommandSubscriber
12+
{
13+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
14+
{
15+
printf("Command started: %s\n", $event->getCommandName());
16+
}
17+
18+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
19+
{
20+
}
21+
22+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
23+
{
24+
}
25+
}
26+
27+
$manager = new MongoDB\Driver\Manager(URI, ['retryReads' => false]);
28+
29+
configureFailPoint($manager, 'failCommand', ['times' => 1], ['failCommands' => ['find'], 'closeConnection' => true]);
30+
31+
$observer = new Observer;
32+
MongoDB\Driver\Monitoring\addSubscriber($observer);
33+
34+
throws(
35+
function() use ($manager) {
36+
$manager->executeQuery(NS, new \MongoDB\Driver\Query(['x' => 1]));
37+
},
38+
\MongoDB\Driver\Exception\ConnectionTimeoutException::class
39+
);
40+
41+
?>
42+
===DONE===
43+
<?php exit(0); ?>
44+
--EXPECT--
45+
Command started: find
46+
OK: Got MongoDB\Driver\Exception\ConnectionTimeoutException
47+
===DONE===

0 commit comments

Comments
 (0)