int main(int argc, char** argv) {
    signal(SIGABRT, &sighandler);
    signal(SIGTERM, &sighandler);
    signal(SIGINT, &sighandler);

    initServer();

    aeEventLoop* eventLoop = aeCreateEventLoop(server.max_process_client + SHTTPSVR_EVENTLOOP_FDSET_INCR);
    server.el = eventLoop;

    int listen_socket = anetTcpServer(NULL, 80, NULL, server.tcp_backlog);
    anetNonBlock(NULL, listen_socket);

    if (listen_socket > 0
        && AE_ERR == aeCreateFileEvent(eventLoop, listen_socket, AE_READABLE, tAcceptProc, NULL)) {
        ERRLOG("aeCreateFileEvent error!");
        exit(1);
    }

    aeSetBeforeSleepProc(eventLoop, tBeforeSleepProc);
    initTimeEvent(eventLoop);
    aeMain(eventLoop);
    aeDeleteEventLoop(eventLoop);
    return 0;
}
Beispiel #2
0
aeServer* aeServerCreate( char* ip,int port )
{
    aeServer* serv = (aeServer*)zmalloc( sizeof(aeServer ));
    serv->runForever = startServer;
	serv->send =  sendMessageToReactor;
    serv->close = sendCloseEventToReactor;
	serv->sendToClient = anetWrite;
	serv->closeClient = freeClient;
    serv->listen_ip = ip;
    serv->port = port;
	serv->connectNum = 0;
    serv->reactorNum = 2;
    serv->workerNum = 3;
	serv->maxConnect = 1024;
	
    serv->connlist = shm_calloc( serv->maxConnect , sizeof( aeConnection ));
    serv->reactorThreads = zmalloc( serv->reactorNum * sizeof( aeReactorThread  ));
    serv->workers = zmalloc( serv->workerNum * sizeof(aeWorkerProcess));
    serv->mainReactor = zmalloc( sizeof( aeReactor ));
    
    serv->mainReactor->eventLoop = aeCreateEventLoop( 10 );
    aeSetBeforeSleepProc( serv->mainReactor->eventLoop ,initOnLoopStart );
    
    //安装信号装置
    installMasterSignal( serv  );
    servG = serv;
    
    return serv;
}
Beispiel #3
0
void *reactorThreadRun(void *arg)
{
    reactorThreadParam* param = (reactorThreadParam*)arg;
    aeServer* serv = param->serv;
    int thid = param->thid;
    aeEventLoop* el = aeCreateEventLoop( 1024 );
    serv->reactorThreads[thid].reactor.eventLoop = el;
 
    int ret,i;
	//每个线程都有workerNum个worker pipe
    for(  i = 0; i < serv->workerNum; i++ )
    {
        if ( aeCreateFileEvent( el,serv->workers[i].pipefd[0],
                     AE_READABLE,onMasterPipeReadable, thid  ) == -1 )
        {
            printf( "CreateFileEvent error fd "  );
            close(serv->workers[i].pipefd[0]);
        }
    }
    
    aeSetBeforeSleepProc( el ,initThreadOnLoopStart );
    aeMain( el );
	
    aeDeleteEventLoop( el );
    el = NULL;
}
Beispiel #4
0
void *reactorThreadRun( void *arg )
{
	reactorThreadParam *param = (reactorThreadParam *) arg;
	appnetServer *serv = param->serv;
	int thid = param->thid;
	aeEventLoop *el = aeCreateEventLoop( MAX_EVENT );
	serv->reactor_threads[thid].reactor.event_loop = el;
	serv->reactor_threads[thid].hh = (httpHeader *) malloc( sizeof(httpHeader) );
	serv->reactor_threads[thid].hs = (handshake *) malloc( sizeof(handshake) );
	
	int ret,i,index;
	for (i = 0; i < serv->worker_num + serv->task_worker_num; i++)
	{
		index = i * serv->reactor_num + thid;
		
		if (aeCreateFileEvent( el , serv->worker_pipes[index].pipefd[0] , AE_READABLE ,
				onMasterPipeReadable , thid ) == -1)
		{
			
			printf( "CreateFileEvent error fd " );
			close( serv->worker_pipes[index].pipefd[0] );
		}
	}
	
	aeSetBeforeSleepProc( el , initThreadOnLoopStart );
	aeMain( el );
	aeDeleteEventLoop( el );
	
	free( serv->reactor_threads[thid].hh );
	free( serv->reactor_threads[thid].hs );
	el = NULL;
}
Beispiel #5
0
int main(int argc, char **argv) {
    time_t start;

    initServerConfig();
    if (argc == 2) {
        resetServerSaveParams();
        loadServerConfig(argv[1]);
    } 

    if (server.daemonize) daemonize();
    initServer();
   
    linuxOvercommitMemoryWarning();
    start = time(NULL);
    if (server.appendonly) {
        loadAppendOnlyFile(server.appendfilename);
    } else {
        rdbLoad(server.dbfilename);
    }

    aeSetBeforeSleepProc(server.el,beforeSleep);
    aeMain(server.el);
    aeDeleteEventLoop(server.el);
   
    return 0;
}
Beispiel #6
0
int run_storage_service()
{
	aeSetBeforeSleepProc(g_storage_service.eventLoop,NULL);
	aeMain(g_storage_service.eventLoop);
	aeDeleteEventLoop(g_storage_service.eventLoop);
	
	close(g_storage_service.sockfd);
	return 0;
}
Beispiel #7
0
/* 启动网络
*/
static void* _NTInit(void* _v) {
    pthread_mutex_lock(&g_rootThreadMutex);

    int listenPort;
    struct configOption *confOpt;
    char tmpstr[TMPSTR_SIZE] = {""};

    confOpt = configGet(g_conf, "net_server", "port");

    if (NULL != confOpt) {

        if (confOpt->valueLen > TMPSTR_SIZE) {
            trvExit(0, "监听端口太大");
        }

        memcpy(tmpstr, confOpt->value, confOpt->valueLen);
        tmpstr[confOpt->valueLen] = 0;
        listenPort = atoi(tmpstr);
    }
    else listenPort = -1; /* 输入一个不正常的监听端口,意味着不监听 */


    if (ERRNO_ERR == NTInit(listenPort)) {
        trvExit(0, "初始化网络失败");
    }

    /*
    if(aeCreateTimeEvent(g_server.el, 1, serverCron, NULL, NULL) == AE_ERR) {
        trvLogE("Can't create the serverCron time event.");
        exit(1);
    }
    */


    aeSetBeforeSleepProc(g_server.el, beforeSleep);

    pthread_mutex_unlock(&g_rootThreadMutex);

    pthread_cond_signal(&g_rootThreadCond);

    aeMain(g_server.el);
    aeDeleteEventLoop(g_server.el);

    return NULL;
}
Beispiel #8
0
void initServer( appnetServer *serv )
{
	
	serv->connlist = shm_calloc( serv->connect_max , sizeof(appnetConnection) );
	
	serv->reactor_threads =
			zmalloc( serv->reactor_num * sizeof(appnetReactorThread) );
	
	serv->workers = zmalloc( ( serv->worker_num + serv->task_worker_num ) *
			sizeof(appnetWorkerProcess) );
	
	serv->worker_pipes = zmalloc( ( serv->worker_num + serv->task_worker_num ) *
			serv->reactor_num * sizeof(appnetWorkerPipes) );
	
	srand( (unsigned) time( NULL ) );
	serv->main_reactor = zmalloc( sizeof(appnetReactor) );
	serv->main_reactor->event_loop = aeCreateEventLoop( 10 );
	
	aeSetBeforeSleepProc( serv->main_reactor->event_loop , initOnLoopStart );
	installMasterSignal( serv );
}
Beispiel #9
0
/* Main */
int
clusterMain (int argc, char **argv)
{
  long long teid;
  redisLog (REDIS_WARNING, "Server started, Redis version " REDIS_VERSION);
#ifdef __linux__
  linuxOvercommitMemoryWarning ();
#endif
  loadDataFromDisk ();
  server.last_bgsave_seqnum = server.smr_seqnum;

  /* Warning the user about suspicious maxmemory setting. */
  if (server.maxmemory > 0 && server.maxmemory < 1024 * 1024)
    {
      redisLog (REDIS_WARNING,
		"WARNING: You specified a maxmemory value that is less than 1MB (current value is %llu bytes). Are you sure this is what you really want?",
		server.maxmemory);
    }

  smrConnect ();

  /* initializeCron for handling sigterm */
  teid = aeCreateTimeEvent (server.el, 1, initializeCron, NULL, NULL);
  aeMain (server.el);
  aeDeleteTimeEvent (server.el, teid);

  if (server.need_rckpt)
    {
      redisLog (REDIS_NOTICE,
		"Need more checkpoint from %s:%d", server.ckpt_host,
		server.ckpt_port);
      smrDisconnect ();
      server.smr_init_flags = SMR_INIT_RCKPT;
      if (getdump
	  (server.ckpt_host, server.ckpt_port, server.rdb_filename,
	   "0-8191", REDIS_GETDUMP_DEFAULT_NET_LIMIT_MB) != REDIS_OK)
	{
	  exit (1);
	}

      emptyDb (NULL);
      loadDataFromDisk ();
      server.last_bgsave_seqnum = server.smr_seqnum;

      smrConnect ();
      aeMain (server.el);
    }

  if (!server.is_ready)
    {
      redisLog (REDIS_WARNING, "Invalid initialization state");
      exit (1);
    }

  if (server.last_bgsave_seqnum)
    {
      if (smr_seq_ckpted (server.smr_conn, server.last_bgsave_seqnum) != 0)
	{
	  redisLog (REDIS_WARNING,
		    "Failed to notify checkpointed sequence to smr");
	  exit (1);
	}
      else
	{
	  redisLog (REDIS_NOTICE,
		    "Checkpointed sequence is sent to SMR, seqnum:%lld",
		    server.last_bgsave_seqnum);
	}
    }

  server.smr_seqnum_reset = 0;
  server.last_catchup_check_mstime = mstime ();
  server.smr_init_flags = SMR_INIT_CATCHUP_PHASE1;
  if (smr_catchup (server.smr_conn) == -1)
    {
      redisLog (REDIS_WARNING, "Failed to catchup errno(%d)", errno);
      exit (1);
    }
  server.smr_init_flags = SMR_INIT_CATCHUP_PHASE2;
  checkSmrCatchup ();
  aeSetBeforeSleepProc (server.el, beforeSleep);
  aeMain (server.el);
  aeDeleteEventLoop (server.el);
  exit (0);
}