Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongo-php-library
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sinan
mongo-php-library
Commits
9d0cbbb7
Unverified
Commit
9d0cbbb7
authored
Aug 23, 2019
by
Andreas Braun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PHPLIB-466: Respect pinned session during server selection
parent
4a3db491
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
75 additions
and
39 deletions
+75
-39
Client.php
src/Client.php
+3
-3
Collection.php
src/Collection.php
+26
-26
Database.php
src/Database.php
+8
-8
Watch.php
src/Operation/Watch.php
+7
-2
functions.php
src/functions.php
+31
-0
No files found.
src/Client.php
View file @
9d0cbbb7
...
...
@@ -170,7 +170,7 @@ class Client
$options
[
'typeMap'
]
=
$this
->
typeMap
;
}
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
if
(
!
isset
(
$options
[
'writeConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForWritableCommandWriteConcern
))
{
$options
[
'writeConcern'
]
=
$this
->
writeConcern
;
...
...
@@ -246,7 +246,7 @@ class Client
public
function
listDatabases
(
array
$options
=
[])
{
$operation
=
new
ListDatabases
(
$options
);
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
return
$operation
->
execute
(
$server
);
}
...
...
@@ -311,7 +311,7 @@ class Client
$options
[
'readPreference'
]
=
$this
->
readPreference
;
}
$server
=
$this
->
manager
->
selectServer
(
$options
[
'readPreference'
]
);
$server
=
select_server
(
$this
->
manager
,
$options
[
'readPreference'
],
extract_session_from_options
(
$options
)
);
if
(
!
isset
(
$options
[
'readConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForReadConcern
))
{
$options
[
'readConcern'
]
=
$this
->
readConcern
;
...
...
src/Collection.php
View file @
9d0cbbb7
This diff is collapsed.
Click to expand it.
src/Database.php
View file @
9d0cbbb7
...
...
@@ -206,7 +206,7 @@ class Database
$options
[
'readPreference'
]
=
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
);
}
$server
=
$this
->
manager
->
selectServer
(
$options
[
'readPreference'
]
);
$server
=
select_server
(
$this
->
manager
,
$options
[
'readPreference'
],
extract_session_from_options
(
$options
)
);
/* MongoDB 4.2 and later supports a read concern when an $out stage is
* being used, but earlier versions do not.
...
...
@@ -258,7 +258,7 @@ class Database
}
$operation
=
new
DatabaseCommand
(
$this
->
databaseName
,
$command
,
$options
);
$server
=
$this
->
manager
->
selectServer
(
$options
[
'readPreference'
]
);
$server
=
select_server
(
$this
->
manager
,
$options
[
'readPreference'
],
extract_session_from_options
(
$options
)
);
return
$operation
->
execute
(
$server
);
}
...
...
@@ -280,7 +280,7 @@ class Database
$options
[
'typeMap'
]
=
$this
->
typeMap
;
}
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
if
(
!
isset
(
$options
[
'writeConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForWritableCommandWriteConcern
))
{
$options
[
'writeConcern'
]
=
$this
->
writeConcern
;
...
...
@@ -307,7 +307,7 @@ class Database
$options
[
'typeMap'
]
=
$this
->
typeMap
;
}
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
if
(
!
isset
(
$options
[
'writeConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForWritableCommandWriteConcern
))
{
$options
[
'writeConcern'
]
=
$this
->
writeConcern
;
...
...
@@ -335,7 +335,7 @@ class Database
$options
[
'typeMap'
]
=
$this
->
typeMap
;
}
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
if
(
!
isset
(
$options
[
'writeConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForWritableCommandWriteConcern
))
{
$options
[
'writeConcern'
]
=
$this
->
writeConcern
;
...
...
@@ -420,7 +420,7 @@ class Database
public
function
listCollections
(
array
$options
=
[])
{
$operation
=
new
ListCollections
(
$this
->
databaseName
,
$options
);
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
return
$operation
->
execute
(
$server
);
}
...
...
@@ -442,7 +442,7 @@ class Database
$options
[
'typeMap'
]
=
$this
->
typeMap
;
}
$server
=
$this
->
manager
->
selectServer
(
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
));
$server
=
select_server
(
$this
->
manager
,
new
ReadPreference
(
ReadPreference
::
RP_PRIMARY
),
extract_session_from_options
(
$options
));
if
(
!
isset
(
$options
[
'writeConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForWritableCommandWriteConcern
))
{
$options
[
'writeConcern'
]
=
$this
->
writeConcern
;
...
...
@@ -509,7 +509,7 @@ class Database
$options
[
'readPreference'
]
=
$this
->
readPreference
;
}
$server
=
$this
->
manager
->
selectServer
(
$options
[
'readPreference'
]
);
$server
=
select_server
(
$this
->
manager
,
$options
[
'readPreference'
],
extract_session_from_options
(
$options
)
);
if
(
!
isset
(
$options
[
'readConcern'
])
&&
server_supports_feature
(
$server
,
self
::
$wireVersionForReadConcern
))
{
$options
[
'readConcern'
]
=
$this
->
readConcern
;
...
...
src/Operation/Watch.php
View file @
9d0cbbb7
...
...
@@ -40,6 +40,8 @@ use function is_object;
use
function
is_string
;
use
function
MongoDB
\Driver\Monitoring\addSubscriber
;
use
function
MongoDB
\Driver\Monitoring\removeSubscriber
;
use
function
MongoDB
\extract_session_from_options
;
use
function
MongoDB
\select_server
;
use
function
MongoDB
\server_supports_feature
;
/**
...
...
@@ -375,8 +377,11 @@ class Watch implements Executable, /* @internal */ CommandSubscriber
$this
->
hasResumed
=
true
;
// Select a new server using the original read preference
$server
=
$this
->
manager
->
selectServer
(
$this
->
aggregateOptions
[
'readPreference'
]);
/* Select a new server using the original read preference. While watch
* is not usable within transactions, we still check if there is a
* pinned session. This is to avoid an ambiguous error message about
* running a command on the wrong server. */
$server
=
select_server
(
$this
->
manager
,
$this
->
aggregateOptions
[
'readPreference'
],
extract_session_from_options
(
$this
->
aggregateOptions
));
$resumeOption
=
isset
(
$this
->
changeStreamOptions
[
'startAfter'
])
&&
!
$hasAdvanced
?
'startAfter'
:
'resumeAfter'
;
...
...
src/functions.php
View file @
9d0cbbb7
...
...
@@ -19,6 +19,8 @@ namespace MongoDB;
use
Exception
;
use
MongoDB\BSON\Serializable
;
use
MongoDB\Driver\Manager
;
use
MongoDB\Driver\ReadPreference
;
use
MongoDB\Driver\Server
;
use
MongoDB\Driver\Session
;
use
MongoDB\Exception\InvalidArgumentException
;
...
...
@@ -373,3 +375,32 @@ function with_transaction(Session $session, callable $callback, array $transacti
$operation
=
new
WithTransaction
(
$callback
,
$transactionOptions
);
$operation
->
execute
(
$session
);
}
/**
* Returns the session option if it is set and valid.
*
* @internal
* @param array $options
* @return Session|null
*/
function
extract_session_from_options
(
array
$options
)
{
if
(
!
isset
(
$options
[
'session'
])
||
!
$options
[
'session'
]
instanceof
Session
)
{
return
null
;
}
return
$options
[
'session'
];
}
/**
* Performs server selection, respecting the server a session may be pinned to
*
* @internal
* @return Server
*/
function
select_server
(
Manager
$manager
,
ReadPreference
$readPreference
=
null
,
Session
$session
=
null
)
{
$server
=
$session
!==
null
?
$session
->
getServer
()
:
null
;
return
$server
?:
$manager
->
selectServer
(
$readPreference
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment