@Override
  public Connection<Cassandra.Client> createConnection(
      final HostConnectionPool<Cassandra.Client> pool) throws ThrottledException {
    if (limiter.check() == false) {
      throw new ThrottledException("Too many connection attempts");
    }

    return new ThriftConnection(pool, asConfig.getMaxThriftSize());
  }
 @Override
 public String describePartitioner() throws ConnectionException {
   return connectionPool
       .executeWithFailover(
           new AbstractOperationImpl<String>(
               tracerFactory.newTracer(CassandraOperationType.DESCRIBE_PARTITIONER)) {
             @Override
             public String internalExecute(Client client, ConnectionContext context)
                 throws Exception {
               return client.describe_partitioner();
             }
           },
           config.getRetryPolicy().duplicate())
       .getResult();
 }
 /**
  * Get the version from the cluster
  *
  * @return
  * @throws OperationException
  */
 @Override
 public String getVersion() throws ConnectionException {
   return connectionPool
       .executeWithFailover(
           new AbstractOperationImpl<String>(
               tracerFactory.newTracer(CassandraOperationType.GET_VERSION)) {
             @Override
             public String internalExecute(Client client, ConnectionContext state)
                 throws Exception {
               return client.describe_version();
             }
           },
           config.getRetryPolicy().duplicate())
       .getResult();
 }
 @Override
 public Map<String, List<String>> describeSchemaVersions() throws ConnectionException {
   return connectionPool
       .executeWithFailover(
           new AbstractOperationImpl<Map<String, List<String>>>(
               tracerFactory.newTracer(CassandraOperationType.DESCRIBE_SCHEMA_VERSION)) {
             @Override
             public Map<String, List<String>> internalExecute(
                 Client client, ConnectionContext context) throws Exception {
               return client.describe_schema_versions();
             }
           },
           config.getRetryPolicy().duplicate())
       .getResult();
 }
 private <K> OperationResult<K> executeSchemaChangeOperation(AbstractOperationImpl<K> op)
     throws OperationException, ConnectionException {
   int attempt = 0;
   do {
     try {
       return connectionPool.executeWithFailover(op, config.getRetryPolicy().duplicate());
     } catch (SchemaDisagreementException e) {
       if (++attempt >= MAX_SCHEMA_CHANGE_ATTEMPTS) {
         throw e;
       }
       try {
         Thread.sleep(SCHEMA_DISAGREEMENT_BACKOFF);
       } catch (InterruptedException e1) {
         Thread.interrupted();
         throw new RuntimeException(e1);
       }
     }
   } while (true);
 }
 @Override
 public List<KeyspaceDefinition> describeKeyspaces() throws ConnectionException {
   return connectionPool
       .executeWithFailover(
           new AbstractOperationImpl<List<KeyspaceDefinition>>(
               tracerFactory.newTracer(CassandraOperationType.DESCRIBE_KEYSPACES)) {
             @Override
             public List<KeyspaceDefinition> internalExecute(
                 Client client, ConnectionContext context) throws Exception {
               List<KsDef> ksDefs = client.describe_keyspaces();
               return Lists.transform(
                   ksDefs,
                   new Function<KsDef, KeyspaceDefinition>() {
                     @Override
                     public KeyspaceDefinition apply(KsDef ksDef) {
                       return new ThriftKeyspaceDefinitionImpl(ksDef);
                     }
                   });
             }
           },
           config.getRetryPolicy().duplicate())
       .getResult();
 }