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; }
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; }
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; }
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; } }
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; }