Class MultiPrimaryClient

  • All Implemented Interfaces:
    java.lang.AutoCloseable, Client
    Direct Known Subclasses:
    MultiPrimaryReplicaClient

    public class MultiPrimaryClient
    extends java.lang.Object
    implements Client
    Handling connection failing automatic reconnection transparently when possible for multi-master Topology.

    remark: would have been better using proxy, but for AOT compilation, avoiding to using not supported proxy class.

    • Field Detail

      • denyList

        protected static final java.util.concurrent.ConcurrentMap<HostAddress,​java.lang.Long> denyList
        temporary blacklisted hosts
      • logger

        private static final Logger logger
      • deniedListTimeout

        protected final long deniedListTimeout
        denied timeout
      • closed

        protected boolean closed
        is connections explicitly closed
      • currentClient

        protected Client currentClient
        current client
    • Constructor Detail

      • MultiPrimaryClient

        public MultiPrimaryClient​(Configuration conf,
                                  ClosableLock lock)
                           throws java.sql.SQLException
        Constructor
        Parameters:
        conf - configuration
        lock - thread locker
        Throws:
        java.sql.SQLException - if fail to connect
    • Method Detail

      • connectHost

        protected Client connectHost​(boolean readOnly,
                                     boolean failFast)
                              throws java.sql.SQLException
        Trying connecting server.

        searching each connecting primary / replica connection not temporary denied until found one. searching in temporary denied host if not succeed, until reaching `retriesAllDown` attempts.

        Parameters:
        readOnly - must connect a replica / primary
        failFast - must try only not denied server
        Returns:
        a valid connection client
        Throws:
        java.sql.SQLException - if not succeed to create a connection.
      • reConnect

        protected Client reConnect()
                            throws java.sql.SQLException
        Connection loop
        Returns:
        client connection
        Throws:
        java.sql.SQLException - if fail to connect
      • replayIfPossible

        protected void replayIfPossible​(Client oldClient,
                                        boolean canRedo)
                                 throws java.sql.SQLException
        Execute transaction replay if in transaction and configured for it, throw an exception if not
        Parameters:
        oldClient - previous client
        canRedo - if command can be redo even if not in transaction
        Throws:
        java.sql.SQLException - if not able to replay
      • executeTransactionReplay

        protected void executeTransactionReplay​(Client oldCli)
                                         throws java.sql.SQLException
        Execute transaction replay
        Parameters:
        oldCli - previous client
        Throws:
        java.sql.SQLException - if not able to replay
      • syncNewState

        public void syncNewState​(Client oldCli)
                          throws java.sql.SQLException
        Synchronized previous and new client states.
        Parameters:
        oldCli - previous client
        Throws:
        java.sql.SQLException - if error occurs
      • execute

        public java.util.List<Completion> execute​(ClientMessage message,
                                                  boolean canRedo)
                                           throws java.sql.SQLException
        Description copied from interface: Client
        Send client message and read result
        Specified by:
        execute in interface Client
        Parameters:
        message - client message
        canRedo - can client message be redone in case of failover
        Returns:
        results
        Throws:
        java.sql.SQLException - if execution fails
      • execute

        public java.util.List<Completion> execute​(ClientMessage message,
                                                  Statement stmt,
                                                  boolean canRedo)
                                           throws java.sql.SQLException
        Description copied from interface: Client
        Send client message and read result
        Specified by:
        execute in interface Client
        Parameters:
        message - client message
        stmt - statement
        canRedo - can client message be redone in case of failover
        Returns:
        results
        Throws:
        java.sql.SQLException - if execution fails
      • execute

        public java.util.List<Completion> execute​(ClientMessage message,
                                                  Statement stmt,
                                                  int fetchSize,
                                                  long maxRows,
                                                  int resultSetConcurrency,
                                                  int resultSetType,
                                                  boolean closeOnCompletion,
                                                  boolean canRedo)
                                           throws java.sql.SQLException
        Description copied from interface: Client
        Send client message and read result
        Specified by:
        execute in interface Client
        Parameters:
        message - client message
        stmt - statement
        fetchSize - fetch size
        maxRows - maximum number of rows. 0 = all
        resultSetConcurrency - concurrency
        resultSetType - result-set type
        closeOnCompletion - close statement on completion
        canRedo - can client message be redone in case of failover
        Returns:
        results
        Throws:
        java.sql.SQLException - if any error occurs
      • executePipeline

        public java.util.List<Completion> executePipeline​(ClientMessage[] messages,
                                                          Statement stmt,
                                                          int fetchSize,
                                                          long maxRows,
                                                          int resultSetConcurrency,
                                                          int resultSetType,
                                                          boolean closeOnCompletion,
                                                          boolean canRedo)
                                                   throws java.sql.SQLException
        Description copied from interface: Client
        Send client messages pipelining and read result
        Specified by:
        executePipeline in interface Client
        Parameters:
        messages - client message
        stmt - statement
        fetchSize - fetch size
        maxRows - maximum number of rows. 0 = all
        resultSetConcurrency - concurrency
        resultSetType - result-set type
        closeOnCompletion - close statement on completion
        canRedo - can client message be redone in case of failover
        Returns:
        results
        Throws:
        java.sql.SQLException - if any error occurs
      • readStreamingResults

        public void readStreamingResults​(java.util.List<Completion> completions,
                                         int fetchSize,
                                         long maxRows,
                                         int resultSetConcurrency,
                                         int resultSetType,
                                         boolean closeOnCompletion)
                                  throws java.sql.SQLException
        Description copied from interface: Client
        Read results
        Specified by:
        readStreamingResults in interface Client
        Parameters:
        completions - List that will have the new results
        fetchSize - fetch size
        maxRows - maximum number of rows. 0 = all
        resultSetConcurrency - concurrency
        resultSetType - result-set type
        closeOnCompletion - close statement on completion
        Throws:
        java.sql.SQLException - if any error occurs
      • closePrepare

        public void closePrepare​(Prepare prepare)
                          throws java.sql.SQLException
        Description copied from interface: Client
        Close prepare command
        Specified by:
        closePrepare in interface Client
        Parameters:
        prepare - prepare command
        Throws:
        java.sql.SQLException - if any error occurs
      • abort

        public void abort​(java.util.concurrent.Executor executor)
                   throws java.sql.SQLException
        Description copied from interface: Client
        Abort current connection
        Specified by:
        abort in interface Client
        Parameters:
        executor - executor
        Throws:
        java.sql.SQLException - if any error occurs
      • close

        public void close()
                   throws java.sql.SQLException
        Description copied from interface: Client
        Close client
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface Client
        Throws:
        java.sql.SQLException - if any error occurs
      • setReadOnly

        public void setReadOnly​(boolean readOnly)
                         throws java.sql.SQLException
        Description copied from interface: Client
        Switch to a writer/read-only connection, no effet on mono-connection
        Specified by:
        setReadOnly in interface Client
        Parameters:
        readOnly - must use read-only connection
        Throws:
        java.sql.SQLException - if any error occurs
      • getSocketTimeout

        public int getSocketTimeout()
        Description copied from interface: Client
        get socket timeout
        Specified by:
        getSocketTimeout in interface Client
        Returns:
        socket timeout
      • setSocketTimeout

        public void setSocketTimeout​(int milliseconds)
                              throws java.sql.SQLException
        Description copied from interface: Client
        Set socket timeout
        Specified by:
        setSocketTimeout in interface Client
        Parameters:
        milliseconds - timeout
        Throws:
        java.sql.SQLException - if any error occurs
      • isClosed

        public boolean isClosed()
        Description copied from interface: Client
        Is client closed
        Specified by:
        isClosed in interface Client
        Returns:
        close flag
      • getContext

        public Context getContext()
        Description copied from interface: Client
        Get connection context
        Specified by:
        getContext in interface Client
        Returns:
        connection context
      • getExceptionFactory

        public ExceptionFactory getExceptionFactory()
        Description copied from interface: Client
        Get connection exception factory
        Specified by:
        getExceptionFactory in interface Client
        Returns:
        connection exception factory
      • getHostAddress

        public HostAddress getHostAddress()
        Description copied from interface: Client
        Get connection host
        Specified by:
        getHostAddress in interface Client
        Returns:
        connection host
      • getSocketIp

        public java.lang.String getSocketIp()
        Description copied from interface: Client
        Get current socket IP or null (for Pipe / unix socket)
        Specified by:
        getSocketIp in interface Client
        Returns:
        Socket current IP
      • isPrimary

        public boolean isPrimary()
        Description copied from interface: Client
        is current client writer or read-only
        Specified by:
        isPrimary in interface Client
        Returns:
        is primary
      • reset

        public void reset()
        Description copied from interface: Client
        Reset connection
        Specified by:
        reset in interface Client