asRecPtr huge *readmemory (asHeadPtr *hdr,void (* func)(double)) /*********** * Describe : Функция чтения памяти высокого уровня * Params : asHeadPtr *hdr - указ. на указ. на asHeader * : void (* func)(double) - функция для отображения считывания, ей * : передаем процент считанной информации * Return : asRecPtr * - массив указателей на записи в памяти * Call : getdump,numrec,addr ***********/ { /* */ uint last,j,i,n,off; /* */ long size; /* */ byte huge *f_s,huge *s_s; asRecPtr huge *rec = NULL; /* массив указ. */ static byte tmp[2048]; /* на запись */ *hdr = (asHeadPtr) getdump (&size,func); /* принимаем */ if (*hdr==NULL) { printf ("\n Error in readmemory 1: No enough memory! "); abort (); } rec = (asRecPtr huge *) farcalloc ((*hdr)->numrec-1,sizeof(asRecPtr)); if (rec==NULL) { printf ("\n Error in readmemory 2: No enough memory! "); abort (); } reportmemory(getmaxx(),getmaxy()-textheight("X")-5); f_s = (byte huge *) (*hdr); /* 1 половина */ s_s = (byte huge *) (*hdr)+65536L; /* 2 половина по */ for (i=0;i<((*hdr)->numrec)-1;i++) /* 64 Кбайта */ { drawprogress ( (double) i / (((*hdr)->numrec) - 1) ); off = (uint)((*hdr)->addr)[i]; /* смещение */ if ((uint)off>(uint)65534) /* нереальный адрес записи */ { rec[i] = (asRecPtr) ((byte huge *)NULL); continue; } if ((uint)off>(uint)32767) /* во 2 пол. */ rec[i] = (asRecPtr) ((byte huge *)s_s+((uint)off-32768)*2);/* */ else /* в 1 пол. */ rec[i] = (asRecPtr) ((byte huge *)f_s+(uint)off*2); /* */ if (rec[i]->number > 2048) rec[i]->number = 2048; if ((issignal(rec[i]))&&(rec[i]!=NULL)) { rec[i]->number = rec[i]->dimfft; for (n=0;n<(rec[i])->number;n+=2) /* четные номера */ tmp[n] = ((byte *)rec[i]->y)[n/2]; for (n=1;n<(rec[i])->number;n+=2) /* нечетные номера */ tmp[n] = ((byte *)rec[i]->y)[(uint)((rec[i])->number+n)/2]; memcpy ((byte *)rec[i]->y,(byte *)tmp,(size_t)(rec[i])->number); } else if (rec[i]!=NULL) rec[i]->mnoj-=3; rec[i]->res1 = 0; /* нулевые байты после имени */ for (last=7;((last>0)&&((rec[i]->name)[last]==' '));last--) ; /* нашли последнюю букву - не пробел */ for (;((last>0)&&((rec[i]->name)[last]!=' '));last--) ; /* нашли последний пробел */ if (last!=0) /* если все же нашли */ for (j=last;(rec[i]->name)[j]!=0;j++) switch ((rec[i]->name)[j]) { case 'a': case 'A': ((rec[i]->name)[j])='x'; break; case 'b': case 'B': ((rec[i]->name)[j])='y'; break; case 'w': case 'W': ((rec[i]->name)[j])='z'; break; default : break; } } drawprogress ((double)1.00); return ((asRecPtr huge *)rec); /* */ } /* */
/* 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); }