| 3910 | } |
| 3911 | |
| 3912 | void initServer(void) { |
| 3913 | signal(SIGHUP, SIG_IGN); |
| 3914 | signal(SIGPIPE, SIG_IGN); |
| 3915 | setupSignalHandlers(); |
| 3916 | makeThreadKillable(); |
| 3917 | |
| 3918 | zfree(g_pserver->db); // initServerConfig created a dummy array, free that now |
| 3919 | g_pserver->db = (redisDb**)zmalloc(sizeof(redisDb*)*cserver.dbnum, MALLOC_LOCAL); |
| 3920 | |
| 3921 | /* Create the Redis databases, and initialize other internal state. */ |
| 3922 | if (g_pserver->m_pstorageFactory == nullptr) { |
| 3923 | for (int j = 0; j < cserver.dbnum; j++) { |
| 3924 | g_pserver->db[j] = new (MALLOC_LOCAL) redisDb(); |
| 3925 | g_pserver->db[j]->initialize(j); |
| 3926 | } |
| 3927 | } else { |
| 3928 | // Read FLASH metadata and load the appropriate dbid into each databse index, as each DB index can have different dbid mapped due to the swapdb command. |
| 3929 | g_pserver->metadataDb = g_pserver->m_pstorageFactory->createMetadataDb(); |
| 3930 | for (int idb = 0; idb < cserver.dbnum; ++idb) |
| 3931 | { |
| 3932 | int dbid = idb; |
| 3933 | std::string dbid_key = "db-" + std::to_string(idb); |
| 3934 | g_pserver->metadataDb->retrieve(dbid_key.c_str(), dbid_key.length(), [&](const char *, size_t, const void *data, size_t){ |
| 3935 | dbid = *(int*)data; |
| 3936 | }); |
| 3937 | |
| 3938 | g_pserver->db[idb] = new (MALLOC_LOCAL) redisDb(); |
| 3939 | g_pserver->db[idb]->initialize(dbid); |
| 3940 | } |
| 3941 | } |
| 3942 | |
| 3943 | for (int i = 0; i < MAX_EVENT_LOOPS; ++i) |
| 3944 | { |
| 3945 | g_pserver->rgthreadvar[i].rgdbSnapshot = (const redisDbPersistentDataSnapshot**)zcalloc(sizeof(redisDbPersistentDataSnapshot*)*cserver.dbnum, MALLOC_LOCAL); |
| 3946 | serverAssert(g_pserver->rgthreadvar[i].rgdbSnapshot != nullptr); |
| 3947 | } |
| 3948 | g_pserver->modulethreadvar.rgdbSnapshot = (const redisDbPersistentDataSnapshot**)zcalloc(sizeof(redisDbPersistentDataSnapshot*)*cserver.dbnum, MALLOC_LOCAL); |
| 3949 | serverAssert(g_pserver->modulethreadvar.rgdbSnapshot != nullptr); |
| 3950 | |
| 3951 | serverAssert(g_pserver->rgthreadvar[0].rgdbSnapshot != nullptr); |
| 3952 | |
| 3953 | /* Fixup Master Client Database */ |
| 3954 | listIter li; |
| 3955 | listNode *ln; |
| 3956 | listRewind(g_pserver->masters, &li); |
| 3957 | while ((ln = listNext(&li))) |
| 3958 | { |
| 3959 | redisMaster *mi = (redisMaster*)listNodeValue(ln); |
| 3960 | serverAssert(mi->master == nullptr); |
| 3961 | if (mi->cached_master != nullptr) |
| 3962 | selectDb(mi->cached_master, 0); |
| 3963 | } |
| 3964 | |
| 3965 | g_pserver->aof_state = g_pserver->aof_enabled ? AOF_ON : AOF_OFF; |
| 3966 | g_pserver->hz = g_pserver->config_hz; |
| 3967 | cserver.pid = getpid(); |
| 3968 | g_pserver->in_fork_child = CHILD_TYPE_NONE; |
| 3969 | cserver.main_thread_id = pthread_self(); |
no test coverage detected