Example #1
0
proxy_client*AllocRemote(proxy_client*c)
{
    proxy_client*r=malloc(sizeof(proxy_client));
    r->flags=0;
    int fd=anetTcpNonBlockConnect(anet_error,policy->hosts[0].addr,policy->hosts[0].port);
    if(r==NULL||fd==-1) return NULL;
    LogDebug("connect remote fd:%d",fd);
    anetNonBlock(NULL,fd);
    anetTcpNoDelay(NULL,fd);
    r->fd=fd;
    r->remote=c;
    r->OnError=RemoteDown;
    r->blist=AllocBufferList(3);
    if(aeCreateFileEvent(el,r->fd,AE_READABLE,ReadIncome,r)==AE_ERR){
	//bug:free remote
	close(fd);
	return NULL;
    }
    LogDebug("new peer:%d---%d",r->fd,c->fd);
    return r;
}
Example #2
0
static int
slotsmgrt_get_socket(redisClient *c, sds host, sds port, int timeout) {
    sds name = sdsempty();
    name = sdscatlen(name, host, sdslen(host));
    name = sdscatlen(name, ":", 1);
    name = sdscatlen(name, port, sdslen(port));

    slotsmgrt_sockfd *pfd = dictFetchValue(server.slotsmgrt_cached_sockfds, name);
    if (pfd != NULL) {
        sdsfree(name);
        pfd->lasttime = server.unixtime;
        return pfd->fd;
    }
    
    int fd = anetTcpNonBlockConnect(server.neterr, host, atoi(port));
    if (fd == -1) {
        redisLog(REDIS_WARNING, "slotsmgrt: connect to target %s:%s, error = '%s'",
                host, port, server.neterr);
        sdsfree(name);
        addReplyErrorFormat(c,"Can't connect to target node: %s", server.neterr);
        return -1;
    }
    anetEnableTcpNoDelay(server.neterr, fd);
    if ((aeWait(fd, AE_WRITABLE, timeout) & AE_WRITABLE) == 0) {
        redisLog(REDIS_WARNING, "slotsmgrt: connect to target %s:%s, aewait error = '%s'",
                host, port, server.neterr);
        sdsfree(name);
        close(fd);
        addReplySds(c, sdsnew("-IOERR error or timeout connecting to the client\r\n"));
        return -1;
    }
    redisLog(REDIS_WARNING, "slotsmgrt: connect to target %s:%s", host, port);

    pfd = zmalloc(sizeof(*pfd));
    pfd->fd = fd;
    pfd->lasttime = server.unixtime;
    dictAdd(server.slotsmgrt_cached_sockfds, name, pfd);
    return fd;
}
Example #3
0
static int dispatch_connect(aeEventLoop *el, long long id, void *data)
{
    char err[ANET_ERR_LEN];

    /* Try to connect to the dispatcher. If it fails, try again 10 seconds
     * later */
    int sock = anetTcpNonBlockConnect(err, host, 4002);

    if (sock == ANET_ERR) {
        Log(WARNING, "failed to connect to data stream server: %s.", err);
        return 10000;
    }

    if (aeCreateFileEvent(el, sock, AE_WRITABLE, check_connect,
                          NULL) == AE_ERR) {
        Log(WARNING, "failed to create data connect event");
        close(sock);
        return 1000;
    }

    return AE_NOMORE;
}
int connectWithMaster(void) {
    int fd;

    fd = anetTcpNonBlockConnect(NULL,server.masterhost,server.masterport);
    if (fd == -1) {
        redisLog(REDIS_WARNING,"Unable to connect to MASTER: %s",
            strerror(errno));
        return REDIS_ERR;
    }

    if (aeCreateFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE,syncWithMaster,NULL) ==
            AE_ERR)
    {
        close(fd);
        redisLog(REDIS_WARNING,"Can't create readable event for SYNC");
        return REDIS_ERR;
    }

    server.repl_transfer_lastio = server.unixtime;
    server.repl_transfer_s = fd;
    server.repl_state = REDIS_REPL_CONNECTING;
    return REDIS_OK;
}
Example #5
0
void  repl_cron(){
	// 检测 与 master 的连接状态, 若需要连接,
	// 则连接到 master, 进行数据的同步
	if(server.repl_state == REPL_CONNECT){
		xlog(LOG_INFO, "slave connect: 正在连接到 master\n");
		int fd;
		// 非阻塞连接到 master
		fd = anetTcpNonBlockConnect(NULL, server.masterhost, server.masterport);
		if(fd == -1){
			xlog(LOG_WARN, "slave connect; 不能连接到 master %s\n", strerror(errno));
		}
		// 检测是否建立连接
		if (multi_createFileEvent(server.el, fd, MULTI_WRITABLE|MULTI_READABLE,
					repl_syncWithMaster, NULL) < 0)
		{
			close(fd);
			xlog(LOG_WARN, "slave connect: 创建 slave 同步事件错误\n");
		}
		// 设置 server 状态为正在于 master 建立连接
		server.repl_transfer_s = fd;
		server.repl_state  = REPL_CONNECTING;
		server.repl_dbsize = -1;
	}
}
Example #6
0
client*tc_create_remote(int c)
{
    client*r=malloc(sizeof(*r));
    r->flags=0;
    int fd=anetTcpNonBlockConnect(error_msg,peer_addr,peer_port);
    if(r==NULL||fd==-1) return NULL;

    anetNonBlock(NULL,fd);
    anetTcpNoDelay(NULL,fd);

    r->fd=fd;
    r->blist=tc_create_blist(3);
    r->remote=c;
    r->on_local_error=tc_remote_donw;
    r->on_peer_error=NULL;

    if(aeCreateFileEvent(el,r->fd,AE_READABLE,tc_readincome,r)==AE_ERR){
	tc_free_client(r);
	return NULL;
    }

    return r;

}