1.6.0 alpha

  Motto/theme: maintenance and initial MySQL Fabric

  * Added trx_warn_serverlist_changes option to Fabric configuration. PHP shall
    warn if server list changes (e.g. loading list of shards for key) happen
    in the middle of a transaction. Consider this experimental!

  * Added timeout option to Fabric configuration. The timeout value is interpreted
    by PHP's HTTP stream wrapper (connect + read timeout - depends on streams
    implementation)

  * Introduced new statistics related to Fabrics sharding.lookup_servers command.

    fabric_sharding_lookup_servers_success - # of successful RPC network calls
    fabric_sharding_lookup_servers_failure - # of failed RPC network calls
    fabric_sharding_lookup_servers_time_total - total time spent in milliseconds
    fabric_sharding_lookup_servers_bytes_total - total bytes received from Fabric
    fabric_sharding_lookup_servers_xml_failure - # of XML reply parsing failures

  * Bugs fixed: #66064, #65496, #65408
  * Won't fix: #66616 - see the manual for details, be careful with the GTID support

  * Due to Fabric, we now depend on libxml2.

  * Introduced initial support for MySQL Fabric.

    MySQL Fabric is an integrated framework for managing farms of MySQL servers
    with support for both high-availability and sharding.

    This release adds premilary support for Faric-based sharding setups. Please
    see README.fabric for details.

    New configuration object: fabric
    New functions:
      void mysqlnd_ms_fabric_select_shard(object $connection, string $tablename, string $shard_key);
      void mysqlnd_ms_fabric_select_global(object $connection, string $tablename);
      array mysqlnd_ms_dump_servers(object $connection);
      array mysqlnd_ms_dump_fabric_hosts(object $connection);

  * Introduced automatic query retry for transient errrors.

    Whenever any kind of MySQL cluster wants a client to wait and repeat its
    command before giving up, the driver plugin can now attempt a wait and repeat
    loop before forwarding the transient/temporary error to the application.

    For example, MySQL Cluster can return SQL error code 1297/Temporary error
    for many reasons. In all cases the client may retry its command in a bit.
    Clients are not required to immediately fail over to other nodes but
    can continue to ask the server they are connected to before eventually
    giving up. Sometimes MySQL Cluster hides 1297 from the user already
    by transparently retrying the command before forwarding 1297 to the user.

    Other kinds of MySQL clusters may have other reasons for issuing a
    transient error, for example, they may want to hint a client that a
    server is synchronizing with the rest but can be expected to be back
    soon, thus no fail over is required.

    Transient errors are not limited to 1297, error codes can be set freely.
    Transient error handling does not replace failover logic. Failover
    logic is applied whenever the plugin attempts to connect to a server.
    Transient error handling logic is applied when already connected to
    a server and a command fails.

    Covers: query(),
            change_user(), select_db(), set_charset(), set_server_option(),
            prepare(), execute()
    Implicit: set_autocommit() [through query when connected, not handled if not connected:
    impossible set_client_option() has buffer]
    Implicit: tx_commit, tx_rollback, tx_commit_or_rollback through query()
    Implicit: tx_begin

    New statistics: transient_error_retries

    Note: settings are per connection,
    if dispatching to multiple connections, for example, in change_user()
    you can wait upto number of connections * retry count * retry sleep milliseconds.

    EXPERIMENTAL, incomplete.


1.5.2 stable

  Release date: 06/2013

  Fixed problems with versions


1.5.1 stable

  Release date: 06/2013

  Release as stable


1.5.0 alpha

  Motto/theme: Sharding support, improved transaction support
  Release date: 03/2013

  * BC break and bug fix: SQL hints enforcing the use of a specific server
    are ignored for the duration of a transaction, given a transaction
    has been properly detected. Please note, other than intended
    SQL hints did not overrule all other rules in prior versions
    in all cases (bug). For example, the QoS filter did ignore the SQL hints
    MYSQLND_MS_USE_SLAVE, MYSQLND_MS_USE_MASTER, MYSQLND_MS_USE_LAST_USED
    already in prior versions whereas transaction stickiness could
    be overruled using the SQL hints if, and only if, transaction
    stickiness was not used with a QoS filter. The new behaviour
    differs from the previous but its consistent: neither transaction
    stickiness nor QoS can be overruled by SQL hints. It is no longer
    possible to send a query to a slave using MYSQLND_MS_USE_SLAVE hint
    when in a transaction that is to be executed on the master. This is
    most likely what you expect anyway.

  * BC break and bug fix: Calls to mysqlnd_ms_set_qos() are blocked
    in the middle of a transaction if transaction stickiness is
    set and transaction boundaries are detected properly. Switching
    servers is forbidden in the middle of a transaction, thus
    changes to quality of service resulting in different servers
    being used are blocked. However, if autocommit is disabled one
    can still change QoS in between transactions like so:
    autocommit(false); mysqlnd_ms_set_qos(); begin(); ... ; commit(); mysqlnd_ms_set_qos(); begin();
    This is no longer allowed:
    autocommit(false); query()|begin(): mysqlnd_ms_set_qos();

  * Fixed #60605 PHP segmentation fault when mysqlnd_ms is enabled
   The bug was caused by using an uninitialized handle. Implicit
   connect as part of lazy connections have been extended to cover
   (hopefully) all situations in which the status of a connection
   is read before a connection has been established, for example,
   situations in which get_server_version() is called prior
   to connecting to any server. The implicit connect added
   will establish a connection to the first configured
   master.

   The extended implicit connect also means less warnings,
   for example, when calling more_results() on a connection
   handle on which no query has been run so far.

  * New filter: node_groups

   The filter lets you organize servers (master and slaves)
   in groups. Queries can be directed to a certain group of servers
   by prefixing the query statement with a SQL hint/comment, e.g.:

     /*group_name*/SELECT ...
     /*group_name*/INSERT ...

   Directing a query to a fixed and predefined subset of cluster
   nodes may be desired for cache locality optimizations (keep
   certain server caches hot with certain queries) or to build
   shard/partitioning groups. In the latter case the group_name
   can be considered a shard key. Note, however, this is only
   the client part, which is the easiest. Do not confuse the
   feature with the table filter (experimental) which supports
   schema based partitioning (do-replicate-* server config).

 * examples/ contents clearned up

 * Extended warnings during RINIT about faulty configuration file

   PHP warnings are thrown is the configuration file cannot be read,
   is empty or contains no valid JSON.

   Distributions that aim to provide a pre-configured setup including a
   configuration file stub are asked to put <literal>{}</literal> into
   the configuration file to prevent any warnings about an invalid
   configuration.

  * Fixed: Setting transaction stickiness disables all load balancing,
    including automatic failover, for the duration of a transaction.
    So far connection switches could have happened in the middle of a
    transaction in multi-master configurations and during automatic
    failover although transaction monitoring had detected
    transaction boundaries properly.

  * Added transaction monitoring based on mysqlnd tx_begin()
    (user space call: mysqli_begin(), mysqli_rollback(), ...)
    NOTE: PDO_MySQL has not yet been modified to use the appropriate
    mysqlnd library calls. Improved trx monitoring works
    with mysqli only.

  * Added new transaction stickiness setting trx_stickiness=on
    which allows the use of slaves for read only transactions.

  * Removed experimental feature notes for remember_failed
    failover setting from documentation. remember_failed is
    very useful together with the improved trx_stickiness=on
    setting.

  * Marked query cache support as beta for mysqli in config.m4.
    It should work fine for primary copy based clusters.
    NOTE: PDO is a different story, still experimental.


1.4.2 stable

  Release date: 08/2012

1.4.1 beta

  Release date: 08/2012

  * Fixed compatibility with PHP 5.5

1.4.0 alpha

  Motto/theme: Tweaking based on user feedback
  Release date: 07/2012

  * BC break: renamed ini setting "ini_file" to "config_file".
    Earlier versions have been configured through an ini style file
    and its name was set with the ini setting "ini_file". The ini
    style soon got replaced with JSON. We are now updating the file name
    to config_file to leave the past behing and avoid confusion with
    the PHP configuration file

  * New config setting: "server_charset". Allows setting of charset
    to be used for string encoding before connections have been opened.
    Most useful with lazy connections.

  * Improved error messages if opening and/or parsing of plugin
    configuration file fails.

  * Added "wait_for_gtid_timeout" for throttling of read-your-write SELECTs

  * Weighted load balancing. Servers can have a weight. Before picking a server, the
    load balancing logic sorts the server list by weight and picks the one with the
    highest weight. Then, the weight counter is decremented and the same logic is
    applied for the next request.

  * New failover strategy "loop_before_master". If connecting to a slave
    fails the plugin can either return an error to the caller
    (strategy "disabled", default), fall back to the master (stategy "master") or
    try to connect to any of the other slaves before connecting to the master
    (stategy "loop_before_master").

  * New "max_retries" setting to be used with fail over strategy "loop_before_master".
    If "max_retries" is set to 0 (default), all alternatives will be tested
    and the search is unlimited. Set max_retries to n to limit slave connection attempts
    to n attempts before falling back to master. If, multiple master are configured
    and max_retries = n != 0, then n masters are tested. No matter whether there
    was a slave loop before or not. This means that there can be update 2 * n
    connection attempts before the plugin gives up. Experimental: stable but syntax
    may change and QoS may not support it.

  * New "remember_failed" setting to remember hosts that have failed and skip
    them for the rest of the the web request instead of attempting to connect
    again. Experimental: stable with roundrobin and random but not supported
    with QoS - syntax is likely to change due to refactoring.


1.3.2 stable

  Release date: 04/2012

  * Fixed problem with multi-master where although in a transaction
   the queries to the master weren't sticky and were spread all
   over the masters (RR). Still not sticky for Random. Random_once
   is not affected.


1.3.1 beta

  Release date: 04/2012

  * Fixed problem with building together with QC.


1.3.0 alpha

  Motto/theme: Query caching through quality-of-service concept
  Release date: 04/2012

  * Added support for MySQL 5.6.5-m8+ global transaction ID feature
    - GTID is string if using server-side feature
    - GTID continues to be a long if using client-side emulation

  * Added query cache support to quality-of-service filter
    - new compile option --enable-mysqlnd-ms-cache-support
    - new constant MYSQLND_MS_QOS_OPTION_CACHE to be used with mysqlnd_ms_set_qos()
    - new constant MYSQLND_MS_HAVE_CACHE_SUPPORT set if cache support is compiled in


1.2.1 beta

  Motto/theme: Global Transaction ID injection and quality-of-service concept
  Release date: 01/2012

  * No major changes


1.2.0 alpha

  Motto/theme: Global Transaction ID injection and quality-of-service concept
  Release date: 12/2011

  * Introduced quality-of-service (QoS) filter
  * Added mysqlnd_ms_set_qos() function to set required connection quality at runtime
  * New constants related to mysqlnd_ms_set_qos()
    - MYSQLND_MS_QOS_CONSISTENCY_STRONG
    - MYSQLND_MS_QOS_CONSISTENCY_SESSION
    - MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
    - MYSQLND_MS_QOS_OPTION_GTID
    - MYSQLND_MS_QOS_OPTION_AGE
  * Service levels provided by QoS filter
    * eventual consistency, optional option slave lag
    * session consistency, optional option GTID
    * strong consistency

  * Added global transaction ID injection (GTID)
  * Added mysqlnd_ms_get_last_gtid() to fetch last transaction id
  * Enabled support for multi master with or without slaves
  * New statistics related to GTID:
    - gtid_autocommit_injections_success
    - gtid_autocommit_injections_failure
    - gtid_commit_injections_success
	- gtid_commit_injections_failure
	- gtid_implicit_commit_injections_success
    - gtid_implicit_commit_injections_failure


1.1.2 stable / production ready

  Motto/theme : Cover replication basics with production quality
  Release date: 11/2011

  * Introduced mysqlnd_ms.disable_rw_split ini setting
  * Fixed Bug #60119 - 	host="localhost" lost in mysqlnd_ms_get_last_used_connection()


1.1.1 beta

  Motto/theme : Cover replication basics with production quality
  Release date: 10/2011

  * NOTE: 1.1.0 alpha (PECL version) has reported itself as "1.1.0-beta"
  * Fixed PECL #59982 - Unusable extension with --enable-mysqlnd-ms-table-filter
    Use of the option is NOT supported. You must not used it. Added note to m4.


1.1.0 alpha

  Motto/theme : Cover replication basics with production quality
  Release date: 09/2011

  * Code base refactored to prepare for future releases
  * Introduction of (chainable) filter concept
  * New powerful JSON based configuration syntax
  * Lazy connections improved: security relevant, state changing commands covered
  * Support for (native) prepared statements
  * Added new function - mysqlnd_ms_get_last_used_connection($obj_or_res)
  * Replaced mysqlnd_ms_set_user_pick_server() with "user" filter
  * New statistics: use_slave_guess, use_master_guess
  * Change of semantics of statistics: use_slave, use_master
  * List of broadcasted messages extended: ssl_set
  * Commands monitored to remember settings for lazy connections: change_user,
    select_db, set_charset, set_autocommit.
  * The plugin configuration file must contain a slave list. Failing to provide
    will cause an E_ERROR level error (fatal). The slave list may be empty.

  * MySQL replication filter (client-side partitioning) support prepared
  * Multi-master configuration support prepared (ini setting: mysqlnd_ms.multi_master)

  * Almost 5x more tests, code coverage through tests 75-90% for core files
  * Fixed PECL #22724 - Server switching (mysqlnd_ms_query_is_select case sensitive)
  * Fixed PECL #22784 - Using mysql_connect and mysql_select_db() won't work


1.0 alpha

  Release date: 04/2011
  Motto/theme : Cover replication basics to test user feeedback

  * Basic automatic read-write split (read: slave, write: master)
  * SQL hints to overrule automatic R/W split
  * Load balancing of slave requests


1.0 pre-alpha

  Release date: 09/2010
  Motto/theme : Proof-of-concept

  * Initial check-in
  * Hardly more than a demo of the mysqlnd
  * Hardly of any practial use.


