Search in sources :

Example 1 with JedisConnectionException

use of redis.clients.jedis.exceptions.JedisConnectionException in project MSEC by Tencent.

the class QueryRedisClusterDetail method exec.

public QueryRedisClusterDetailResponse exec(QueryRedisClusterDetailRequest request) {
    Logger logger = Logger.getLogger(QueryRedisClusterDetail.class);
    QueryRedisClusterDetailResponse resp = new QueryRedisClusterDetailResponse();
    String result = checkIdentity();
    if (!result.equals("success")) {
        resp.setStatus(99);
        resp.setMessage(result);
        return resp;
    }
    boolean all_ok = true;
    int master_num = 0;
    util = new DBUtil();
    if (util.getConnection() == null) {
        resp.setStatus(100);
        resp.setMessage("db connect failed!");
        return resp;
    }
    master_nodes = new HashMap<>();
    slave_nodes = new HashMap<>();
    HashMap<String, Integer> master_ips = new HashMap<>();
    HashMap<String, QueryRedisClusterDetailResponse.RTInfo> host_infos = new HashMap<>();
    HashMap<String, Long> host_seqs = new HashMap<>();
    ArrayList<String> masters_with_no_slaves = new ArrayList<>();
    HashMap<String, QueryRedisClusterDetailResponse.RTInfo> info_map = new HashMap<>();
    try {
        if (updatePlan(request.getFirst_level_service_name(), request.getSecond_level_service_name())) {
            resp.setMessage("refresh");
            resp.setStatus(101);
            return resp;
        }
        getStatus(request.getFirst_level_service_name(), request.getSecond_level_service_name());
        for (String host : request.getHosts()) {
            Jedis jedis = null;
            String[] ip_pair = host.split(":");
            QueryRedisClusterDetailResponse.RTInfo rt_info = resp.new RTInfo();
            try {
                jedis = new Jedis(ip_pair[0], Integer.parseInt(ip_pair[1]));
                String info = "";
                try {
                    info = jedis.clusterInfo();
                } catch (JedisDataException ex) {
                    if (ex.getMessage().startsWith("LOADING")) {
                        rt_info.setStatus("Syncing");
                    } else {
                        rt_info.setStatus(ex.getMessage());
                    }
                    host_infos.put(host, rt_info);
                    continue;
                }
                if (!jedis.clusterInfo().split("\n")[0].contains("ok")) {
                    rt_info.setStatus("Cluster state error");
                } else {
                    rt_info.setStatus("OK");
                    rt_info.setOK(true);
                    rt_info.setMaster(checkMaster(jedis));
                    //if it is master..
                    if (rt_info.isMaster()) {
                        //add master_ips
                        int count = master_ips.containsKey(ip_pair[0]) ? master_ips.get(ip_pair[0]) : 0;
                        master_ips.put(ip_pair[0], count + 1);
                        master_num += 1;
                        if (slave_nodes.containsKey(host)) {
                            updateMaster(request.getFirst_level_service_name(), request.getSecond_level_service_name(), ip_pair[0], Integer.parseInt(ip_pair[1]), slave_nodes.get(host));
                            resp.setMessage("refresh");
                            resp.setStatus(101);
                            return resp;
                        }
                        //get data seq
                        String[] infos = jedis.info("replication").split("\r\n");
                        boolean has_slave = false;
                        HashMap<String, Long> hs = new HashMap<>();
                        long master_seq = -1;
                        for (String line : infos) {
                            if (line.startsWith("slave")) {
                                has_slave = true;
                                String[] cols = line.split(",");
                                if (cols.length >= 4) {
                                    String ip = cols[0].split("=")[1];
                                    String port = cols[1].split("=")[1];
                                    long seq = Long.parseLong(cols[3].split("=")[1]);
                                    hs.put(ip + ":" + port, seq);
                                }
                            } else if (line.startsWith("master_repl_offset")) {
                                master_seq = Long.parseLong(line.split(":")[1]);
                            }
                        }
                        if (master_seq >= 0) {
                            for (Map.Entry<String, Long> entry : hs.entrySet()) {
                                host_seqs.put(entry.getKey(), master_seq - entry.getValue());
                            }
                        }
                        if (!has_slave) {
                            masters_with_no_slaves.add(host);
                        }
                    }
                }
                host_infos.put(host, rt_info);
            } catch (JedisConnectionException e) {
                rt_info.setStatus("Connection lost");
                host_infos.put(host, rt_info);
            } finally {
                if (jedis != null)
                    jedis.close();
            }
        }
        for (String host : request.getHosts()) {
            String[] ip_pair = host.split(":");
            QueryRedisClusterDetailResponse.RTInfo rt_info = host_infos.get(host);
            if (rt_info != null) {
                if (host_seqs.containsKey(host))
                    rt_info.setSeq(host_seqs.get(host));
                if (!rt_info.isOK()) {
                    logger.info(String.format("host failed|%s", host));
                    all_ok = false;
                }
                info_map.put(host, rt_info);
                updateStatus(request.getFirst_level_service_name(), request.getSecond_level_service_name(), ip_pair[0], Integer.parseInt(ip_pair[1]), rt_info);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        logger.error(e.getMessage());
    } finally {
        util.releaseConn();
    }
    resp.setInfo_map(info_map);
    if (all_ok) {
        for (Map.Entry<String, Integer> entry : master_ips.entrySet()) {
            if (entry.getValue() * 2 >= master_num) {
                resp.setWarning(String.format("超过一半的主机部署在%s上,如果该IP出现问题,redis cluster将不能自动恢复。请尽快对该IP进行主从切换或对cluster进行扩容。", entry.getKey()));
                break;
            }
        }
    } else {
        if (masters_with_no_slaves.size() > 0) {
            String message = "下述主机只有一份拷贝,请尽快添加拷贝:";
            for (String host : masters_with_no_slaves) {
                message += "<br/>    " + host;
            }
            resp.setWarning(message);
        }
    }
    resp.setMessage("success");
    resp.setStatus(0);
    return resp;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Logger(org.apache.log4j.Logger) Jedis(redis.clients.jedis.Jedis) QueryRedisClusterDetailResponse(beans.response.QueryRedisClusterDetailResponse) JedisDataException(redis.clients.jedis.exceptions.JedisDataException) JedisDataException(redis.clients.jedis.exceptions.JedisDataException) SQLException(java.sql.SQLException) JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException) DBUtil(msec.org.DBUtil) HashMap(java.util.HashMap) Map(java.util.Map) JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException)

Example 2 with JedisConnectionException

use of redis.clients.jedis.exceptions.JedisConnectionException in project MSEC by Tencent.

the class JedisHelper method CheckOneServer.

public void CheckOneServer(String host, Jedis jedis) {
    Logger logger = Logger.getLogger(JedisHelper.class);
    ClusterStatus status = new ClusterStatus();
    if (jedis == null) {
        status.setIp_port(host);
        status.setOK(false);
        status.setError_message("Connection lost");
        cluster_status_map.put(host, status);
        return;
    }
    try {
        String str_nodes = "";
        try {
            str_nodes = jedis.clusterNodes();
        } catch (JedisDataException ex) {
            status.setIp_port(host);
            status.setOK(false);
            status.setError_message(ex.toString());
            cluster_status_map.put(host, status);
            logger.error(String.format("Exception|%s|", host), ex);
            return;
        }
        //node_id - [slots]
        TreeMap<String, String> config_map = new TreeMap<>();
        String master_nodeid = "";
        String master_ip = "";
        HashMap<String, ArrayList<String>> master_slaves = new HashMap<>();
        for (String node_info : str_nodes.split("\n")) {
            if (node_info.contains("myself")) {
                String[] node_status = node_info.split(" ");
                if (//slave = 8, master = 9+
                node_status.length < 8) {
                    status.setIp_port(host);
                    status.setOK(false);
                    cluster_status_map.put(host, status);
                    continue;
                } else {
                    status.setNodeid(node_status[0]);
                    status.setIp_port(node_status[1]);
                    if (node_status[2].contains("master")) {
                        master_nodeid = node_status[0];
                        master_ip = node_status[1];
                        ArrayList<String> slots = new ArrayList<>();
                        status.setMaster(true);
                        status.setOK(true);
                        //check slot
                        TreeSet<Integer> running_slots = new TreeSet<>();
                        TreeSet<Integer> importing_slots = new TreeSet<>();
                        TreeSet<Integer> migrating_slots = new TreeSet<>();
                        for (int i = 8; i < node_status.length; i++) {
                            if (node_status[i].startsWith("[")) {
                                //importing/migrating slot
                                int idx = node_status[i].indexOf("-<-");
                                if (idx > 0) {
                                    importing_slots.add(Integer.parseInt(node_status[i].substring(1, idx)));
                                }
                                idx = node_status[i].indexOf("->-");
                                if (idx > 0) {
                                    migrating_slots.add(Integer.parseInt(node_status[i].substring(1, idx)));
                                }
                                setMigrating(true);
                            } else {
                                slots.add(node_status[i]);
                                int idx = node_status[i].indexOf("-");
                                if (idx > 0) {
                                    int start = Integer.parseInt(node_status[i].substring(0, idx));
                                    int end = Integer.parseInt(node_status[i].substring(idx + 1));
                                    for (int j = start; j <= end; j++) {
                                        running_slots.add(j);
                                    }
                                } else {
                                    running_slots.add(new Integer(node_status[i]));
                                }
                                Collections.sort(slots);
                                config_map.put(node_status[0], join(slots, ","));
                            }
                        }
                        status.setRunning_slots(running_slots);
                        status.setImporting_slots(importing_slots);
                        status.setMigrating_slots(migrating_slots);
                        master_nodes.put(host, running_slots);
                        logger.info(String.format("%s|%d", host, running_slots.size()));
                        allocated_slots.addAll(running_slots);
                    } else if (node_status[2].contains("slave")) {
                        status.setMaster(false);
                        status.setOK(true);
                        status.setMaster_nodeid(node_status[3]);
                        if (master_slaves.get(node_status[3]) == null) {
                            master_slaves.put(node_status[3], new ArrayList<String>());
                        }
                        master_slaves.get(node_status[3]).add(node_status[1]);
                    } else {
                        status.setOK(false);
                        logger.error(str_nodes);
                    }
                    cluster_status_map.put(host, status);
                //nodeid_status_map.put(status.getNodeid(), status);
                }
            } else if (node_info.contains("master")) {
                String[] node_status = node_info.split(" ");
                ArrayList<String> slots = new ArrayList<>();
                for (int i = 8; i < node_status.length; i++) {
                    if (!node_status[i].startsWith("[")) {
                        slots.add(node_status[i]);
                    }
                }
                if (slots.size() > 0) {
                    Collections.sort(slots);
                    config_map.put(node_status[0], join(slots, ","));
                }
                if (master_acks.get(node_status[1]) == null) {
                    master_acks.put(node_status[1], new ArrayList<String>());
                }
                master_acks.get(node_status[1]).add(host);
            } else if (node_info.contains("slave")) {
                if (node_info.contains("fail") && !node_info.contains("fail?")) {
                    //fail
                    logger.info(String.format("OmitFail|%s", node_info));
                } else {
                    String[] node_status = node_info.split(" ");
                    status.setMaster_nodeid(node_status[3]);
                    if (master_slaves.get(node_status[3]) == null) {
                        master_slaves.put(node_status[3], new ArrayList<String>());
                    }
                    master_slaves.get(node_status[3]).add(node_status[1]);
                }
            }
        }
        if (config_map.size() > 1) {
            //only for multiple masters...
            String config_signature = join(config_map, "|");
            slot_sigs.put(host, config_signature);
        }
        if (!master_nodeid.isEmpty()) {
            //master
            ArrayList<String> slaves = master_slaves.get(master_nodeid);
            if (slaves != null)
                master_slave_infos.put(master_ip, slaves);
        }
    } catch (JedisConnectionException e) {
        logger.error(String.format("Exception|%s|", host), e);
        status.setError_message(e.toString());
        status.setIp_port(host);
        status.setOK(false);
        cluster_status_map.put(host, status);
    }
}
Also used : Logger(org.apache.log4j.Logger) JedisDataException(redis.clients.jedis.exceptions.JedisDataException) JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException)

Example 3 with JedisConnectionException

use of redis.clients.jedis.exceptions.JedisConnectionException in project dubbo by alibaba.

the class RedisProtocol method refer.

public <T> Invoker<T> refer(final Class<T> type, final URL url) throws RpcException {
    try {
        GenericObjectPool.Config config = new GenericObjectPool.Config();
        config.testOnBorrow = url.getParameter("test.on.borrow", true);
        config.testOnReturn = url.getParameter("test.on.return", false);
        config.testWhileIdle = url.getParameter("test.while.idle", false);
        if (url.getParameter("max.idle", 0) > 0)
            config.maxIdle = url.getParameter("max.idle", 0);
        if (url.getParameter("min.idle", 0) > 0)
            config.minIdle = url.getParameter("min.idle", 0);
        if (url.getParameter("max.active", 0) > 0)
            config.maxActive = url.getParameter("max.active", 0);
        if (url.getParameter("max.wait", 0) > 0)
            config.maxWait = url.getParameter("max.wait", 0);
        if (url.getParameter("num.tests.per.eviction.run", 0) > 0)
            config.numTestsPerEvictionRun = url.getParameter("num.tests.per.eviction.run", 0);
        if (url.getParameter("time.between.eviction.runs.millis", 0) > 0)
            config.timeBetweenEvictionRunsMillis = url.getParameter("time.between.eviction.runs.millis", 0);
        if (url.getParameter("min.evictable.idle.time.millis", 0) > 0)
            config.minEvictableIdleTimeMillis = url.getParameter("min.evictable.idle.time.millis", 0);
        final JedisPool jedisPool = new JedisPool(config, url.getHost(), url.getPort(DEFAULT_PORT), url.getParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT));
        final int expiry = url.getParameter("expiry", 0);
        final String get = url.getParameter("get", "get");
        final String set = url.getParameter("set", Map.class.equals(type) ? "put" : "set");
        final String delete = url.getParameter("delete", Map.class.equals(type) ? "remove" : "delete");
        return new AbstractInvoker<T>(type, url) {

            protected Result doInvoke(Invocation invocation) throws Throwable {
                Jedis resource = null;
                try {
                    resource = jedisPool.getResource();
                    if (get.equals(invocation.getMethodName())) {
                        if (invocation.getArguments().length != 1) {
                            throw new IllegalArgumentException("The redis get method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
                        }
                        byte[] value = resource.get(String.valueOf(invocation.getArguments()[0]).getBytes());
                        if (value == null) {
                            return new RpcResult();
                        }
                        ObjectInput oin = getSerialization(url).deserialize(url, new ByteArrayInputStream(value));
                        return new RpcResult(oin.readObject());
                    } else if (set.equals(invocation.getMethodName())) {
                        if (invocation.getArguments().length != 2) {
                            throw new IllegalArgumentException("The redis set method arguments mismatch, must be two arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
                        }
                        byte[] key = String.valueOf(invocation.getArguments()[0]).getBytes();
                        ByteArrayOutputStream output = new ByteArrayOutputStream();
                        ObjectOutput value = getSerialization(url).serialize(url, output);
                        value.writeObject(invocation.getArguments()[1]);
                        resource.set(key, output.toByteArray());
                        if (expiry > 1000) {
                            resource.expire(key, expiry / 1000);
                        }
                        return new RpcResult();
                    } else if (delete.equals(invocation.getMethodName())) {
                        if (invocation.getArguments().length != 1) {
                            throw new IllegalArgumentException("The redis delete method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
                        }
                        resource.del(String.valueOf(invocation.getArguments()[0]).getBytes());
                        return new RpcResult();
                    } else {
                        throw new UnsupportedOperationException("Unsupported method " + invocation.getMethodName() + " in redis service.");
                    }
                } catch (Throwable t) {
                    RpcException re = new RpcException("Failed to invoke redis service method. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url + ", cause: " + t.getMessage(), t);
                    if (t instanceof TimeoutException || t instanceof SocketTimeoutException) {
                        re.setCode(RpcException.TIMEOUT_EXCEPTION);
                    } else if (t instanceof JedisConnectionException || t instanceof IOException) {
                        re.setCode(RpcException.NETWORK_EXCEPTION);
                    } else if (t instanceof JedisDataException) {
                        re.setCode(RpcException.SERIALIZATION_EXCEPTION);
                    }
                    throw re;
                } finally {
                    if (resource != null) {
                        try {
                            jedisPool.returnResource(resource);
                        } catch (Throwable t) {
                            logger.warn("returnResource error: " + t.getMessage(), t);
                        }
                    }
                }
            }

            public void destroy() {
                super.destroy();
                try {
                    jedisPool.destroy();
                } catch (Throwable e) {
                    logger.warn(e.getMessage(), e);
                }
            }
        };
    } catch (Throwable t) {
        throw new RpcException("Failed to refer redis service. interface: " + type.getName() + ", url: " + url + ", cause: " + t.getMessage(), t);
    }
}
Also used : Invocation(com.alibaba.dubbo.rpc.Invocation) ObjectOutput(com.alibaba.dubbo.common.serialize.ObjectOutput) RpcResult(com.alibaba.dubbo.rpc.RpcResult) AbstractInvoker(com.alibaba.dubbo.rpc.protocol.AbstractInvoker) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) GenericObjectPool(org.apache.commons.pool.impl.GenericObjectPool) JedisDataException(redis.clients.jedis.exceptions.JedisDataException) Jedis(redis.clients.jedis.Jedis) SocketTimeoutException(java.net.SocketTimeoutException) ByteArrayInputStream(java.io.ByteArrayInputStream) RpcException(com.alibaba.dubbo.rpc.RpcException) JedisPool(redis.clients.jedis.JedisPool) ObjectInput(com.alibaba.dubbo.common.serialize.ObjectInput) JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException) TimeoutException(java.util.concurrent.TimeoutException) SocketTimeoutException(java.net.SocketTimeoutException)

Example 4 with JedisConnectionException

use of redis.clients.jedis.exceptions.JedisConnectionException in project cachecloud by sohutv.

the class ScriptingCommandsTest method scriptExistsWithBrokenConnection.

@Test
public void scriptExistsWithBrokenConnection() {
    Jedis deadClient = new Jedis(jedis.getClient().getHost(), jedis.getClient().getPort());
    deadClient.auth("foobared");
    deadClient.clientSetname("DEAD");
    ClientKillerUtil.killClient(deadClient, "DEAD");
    // sure, script doesn't exist, but it's just for checking connection
    try {
        deadClient.scriptExists("abcdefg");
    } catch (JedisConnectionException e) {
    // ignore it
    }
    assertEquals(true, deadClient.getClient().isBroken());
    deadClient.close();
}
Also used : BinaryJedis(redis.clients.jedis.BinaryJedis) Jedis(redis.clients.jedis.Jedis) JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException) Test(org.junit.Test)

Example 5 with JedisConnectionException

use of redis.clients.jedis.exceptions.JedisConnectionException in project cachecloud by sohutv.

the class RedisInputStream method ensureFill.

/**
   * This methods assumes there are required bytes to be read. If we cannot read anymore bytes an
   * exception is thrown to quickly ascertain that the stream was smaller than expected.
   */
private void ensureFill() throws JedisConnectionException {
    if (count >= limit) {
        try {
            limit = in.read(buf);
            count = 0;
            if (limit == -1) {
                throw new JedisConnectionException("Unexpected end of stream.");
            }
        } catch (IOException e) {
            throw new JedisConnectionException(e);
        }
    }
}
Also used : JedisConnectionException(redis.clients.jedis.exceptions.JedisConnectionException)

Aggregations

JedisConnectionException (redis.clients.jedis.exceptions.JedisConnectionException)34 Jedis (redis.clients.jedis.Jedis)14 IOException (java.io.IOException)8 Logger (org.apache.log4j.Logger)8 Test (org.junit.Test)7 JedisDataException (redis.clients.jedis.exceptions.JedisDataException)5 URI (java.net.URI)3 SSLSocketFactory (javax.net.ssl.SSLSocketFactory)3 JedisShardInfo (redis.clients.jedis.JedisShardInfo)3 UsefulDataModel (com.sohu.tv.jedis.stat.model.UsefulDataModel)2 InetSocketAddress (java.net.InetSocketAddress)2 Socket (java.net.Socket)2 SSLParameters (javax.net.ssl.SSLParameters)2 GenericObjectPoolConfig (org.apache.commons.pool2.impl.GenericObjectPoolConfig)2 BinaryJedis (redis.clients.jedis.BinaryJedis)2 JedisSentinelPool (redis.clients.jedis.JedisSentinelPool)2 Transaction (redis.clients.jedis.Transaction)2 RedisInputStream (redis.clients.util.RedisInputStream)2 ServerInfo (beans.dbaccess.ServerInfo)1 QueryRedisClusterDetailResponse (beans.response.QueryRedisClusterDetailResponse)1