Re: Request for submitting a PECL extension which uses mysqlnd plugin APIand enables redirection functionality for MySQL servers
| From: | Christoph M. Becker | Date: | Wed, 07 Aug 2019 09:23:02 +0000 |
| Subject: | Re: Request for submitting a PECL extension which uses mysqlnd plugin APIand enables redirection functionality for MySQL servers | ||
| References: | 1 | Groups: | php.pecl.dev |
| Request: | Send a blank email to pecl-dev+get-16139@lists.php.net to get a copy of this message | ||
Hi!
On 07.08.2019 at 10:03, Qianqian Bu via pecl-dev wrote:
> Dear Madam/Sir,
>
> My name is Qianqian Bu, I'm from Microsoft company and recently work on a project which
> enables redirection functionality for MySQL servers using PHP mysqlnd driver. The functionality has
> been implemented as a PHP extension using mysqlnd plugin API, and I'd like to request
> submitting it to PECL website.
>
> There is a document https://jira.mariadb.org/browse/MDEV-15935
> for MariaDB Connector J for the same purpose which you may use as a reference. The document gives
> the purpose and initial approach. The final implementation takes use of the message field of OK
> packet, server fills the message field with redirection information, then driver side needs extract
> the information and use it to establish a new connection. There is a ongoing pull request
> https://github.com/MariaDB/mariadb-connector-j/pull/134 for MariaDB
> Connector J for this, which you may also use as a reference. Following is the detailed description
> of the scenario and extension solution for PHP mysqlnd.
>
> Scenario (same as described in MDEV-15935):
> Currently when multiple servers share one proxy, proxy forwards all the packets between servers
> and clients. Thus, the proxy adds latency, take many computing resources and impacts the overall
> performance. Especially for short connections scenarios like WordPress, the latency can be a
> critical issue.
> Supporting redirection mechanism is helpful for proxy-based scenario. It is more like HTTP
> redirects or Oracle redirected connections. Clients get the servers' address from proxies and
> connect to servers transparently without latency and computing resource wasted.
>
> Extension solution:
> We implement the solution as a PECL style extension using mysqlnd plugin API, and the basic
> idea is modifying the MYSQLND_METHOD(mysqlnd_data, connect) method, make it possible to establish a
> new connection based on the redirection information provided by the response OK packet in the last
> message field, and use the new connection if connection succeed. And then cache the redirection
> information, so next time, it only need one establishment phase to connect to MySQL server.
> There are three MYSQLND_METHOD methods replaced as follows:
> conn_m->connect = MYSQLND_METHOD(mysqlnd_rd, connect);
> conn_d_m->connect = MYSQLND_METHOD(mysqlnd_rd_data, connect);
> conn_d_m->dtor = MYSQLND_METHOD_PRIVATE(mysqlnd_rd_data, dtor);
>
> And I've modified the interface of MYSQLND_METHOD(mysqlnd_rd_data, connect) a little, make
> the first parameter as MYSQLND_CONN_DATA ** instead of MYSQLND_CONN_DATA *, so I can modify the
> content of the connection object the pointer points to.
> After the first connection established and before send the init_command which may update last
> message field:
> {
> const MYSQLND_CSTRING scheme = { transport.s, transport.l };
> if (FAIL == conn->m->connect_handshake(conn, &scheme, &username,
> &password, &database, mysql_flags)) {
> goto err;
> }
> }
> Try to establish a new connection:
> enum_func_status redirectState =
> redirect_conn->m->connect_handshake(redirect_conn, &redirect_scheme,
> &redirect_username, &password, &database, mysql_flags);
> If succeeds, close the original connection, and update the connection information:
> conn->m->send_close(conn);
> conn->m->dtor(conn);
> ...
> conn = redirect_conn;
> ...
> *pconn = redirect_conn; //use new conn outside for caller
> ...
> hostname = redirect_hostname;
> username = redirect_username;
> port = ui_redirect_port;
Thanks for the detailed explanation. From what I can tell, this looks
good to me.
> I've presented the code to @Christoph Becker (HAYS Professional Solutions
> GM)<mailto:a-chbeck@microsoft.com> before. Since currently the
> code is hold on a private repository, and there is a limit foe email size so I cannot add it in the
> attachment, may I ask how should I present the code to you?
One option could be to move it to a public Github repository. Some
other PECL extensions are also hosted there (e.g. Imagick[1]).
> The code does not have a package.xml yet, from
> https://pear.php.net/manual/en/pyrus.commands.pickle.php it says
> that I can use picke with pyrus.phar to generate the package file, but it seems pyrus.phar cannot
> work with PHP7. I cannot find pyrus.phar from pear2.php.net as described on
> https://pear.php.net/manual/en/installationpyrus.introduction.php,
> and the download version from https://github.com/pyrus/Pyrus does
> not work, and the repo has not been updated for many years. May I ask can you give me some help
> about how to generate the package.xml file?
I've filed a bug report regarding the obviously out-dated Pyrus
documentation[2]. It seems to me that you would have to write the
package.xml manually. :(
[1] <https://github.com/Imagick/imagick>
[2] <https://pear.php.net/bugs/bug.php?id=23840>
Thanks,
Christoph