int NetInterface::initInterface( int iMaster, char* strMasterIP, unsigned short usMasterPort, unsigned short uslocalPort ) { unsigned int dwIOKey; if ( 1== iMaster ) { dwIOKey = SLAVE_IOHANDLER_KEY; } else { dwIOKey = MASTER_IOHANDLER_KEY; } IOHANDLER_DESC desc; desc.dwIoHandlerKey = dwIOKey; desc.dwMaxAcceptSession = 1000; desc.dwMaxConnectSession = 1; desc.dwSendBufferSize = 60000; desc.dwRecvBufferSize = 60000; desc.dwTimeOut = 1000 * 60 * 20; desc.dwMaxPacketSize = 4096; desc.dwNumberOfIoThreads = 1; desc.dwNumberOfAcceptThreads = 1; desc.dwNumberOfConnectThreads = 1; desc.fnCreateAcceptedObject = CreateAcceptedObject; desc.fnDestroyAcceptedObject = DestroyAcceptedObject; desc.fnDestroyConnectedObject = DestroyConnectedObject; if( !m_IOCPServer.Init( &desc, 1 ) ) { DISPMSG_ERROR( "IOCP initialize failed!" ); return 0; } if ( 1 != iMaster ) { uslocalPort += 10000; m_IOCPServer.Connect( dwIOKey, JK_NEW(MasterConnector), strMasterIP, usMasterPort,1024 * 1024*8,1024 * 1024 * 8,1024 * 64 ); } if( !m_IOCPServer.StartListen( dwIOKey, NULL, uslocalPort ) ) { DISPMSG_ERROR( "Listen failed! IP:%s Port:%d !", "null", uslocalPort ); return 0; } if( 1 == iMaster ) { DISPMSG_SUCCESS( "Master start success!\n" ); } else { DISPMSG_SUCCESS( "Slave start success!\n" ); } return 1; }
void Appender::HandleCmdLine( char* strLine, bool bOps ) { char* cmdArray[MAX_PARA_CNT]; JK_Utility::jk_str_split( cmdArray, strLine, " "); switch ( atoi(cmdArray[0]) ) { case LOG_CMD_STRING_ADD: { DataSpace::GetInstance().InsertKV( cmdArray[1], strlen(cmdArray[1]), cmdArray[2], strlen(cmdArray[2]), bOps ); } break; case LOG_CMD_STRING_DEL: { DataSpace::GetInstance().RemoveKV( cmdArray[1], bOps ); } break; case LOG_CMD_STRING_UPD: { DataSpace::GetInstance().UpdateKV( cmdArray[1], cmdArray[2], strlen(cmdArray[2]), bOps); } break; case LOG_CMD_LIST_LPUSH: { DataSpace::GetInstance().ListPushLeft( cmdArray[1], strlen(cmdArray[1]), cmdArray[2], strlen(cmdArray[2]), bOps ); } break; case LOG_CMD_LIST_RPUSH: { DataSpace::GetInstance().ListPushRight( cmdArray[1], strlen(cmdArray[1]), cmdArray[2], strlen(cmdArray[2]), bOps ); } break; case LOG_CMD_LIST_LPOP: { DataSpace::GetInstance().ListPopLeft( cmdArray[1], bOps ); } break; case LOG_CMD_LIST_RPOP: { DataSpace::GetInstance().ListPopRight( cmdArray[1], bOps ); } break; default: { DISPMSG_ERROR( "Error command : %s \n", cmdArray[0]); } break; } return ; }
void ClientAgent::OnDisconnect() { switch (m_iAgentType ) { case 1: { DISPMSG_ERROR( "Client[%s] disconnected!\n", GetIP() ); } break; case 2: { DISPMSG_ERROR( "Slave[%s] disconnected!\n", GetIP() ); } break; default: { DISPMSG_ERROR( "Agent[%s] disconnected!\n", GetIP() ); } break; } }
bool DataSpace::UpdateKV( void* key, void* val, int vallen, bool ops /*= true */) { void* pval = JK_MALLOC( vallen+1 ); if ( !pval ) { DISPMSG_ERROR( "malloc memory failed!\n"); return false; } JK_MEMCPY_S(pval,vallen+1,val,vallen+1); if( false == m_normalDict.UpdateElement( key, pval ) ) { JK_FREE( pval ); return false; } if (ops) { Operation(LOG_CMD_STRING_UPD, key, pval); Replication(LOG_CMD_STRING_UPD, key, pval); } return true; }
bool DataSpace::ListPushRight( char* key, int keylen, char* val, int vallen, bool ops /*= true */ ) { void* pkey = JK_MALLOC( keylen+1 ); if ( !pkey ) { DISPMSG_ERROR( "malloc memory failed!\n"); return false; } void* pval = JK_MALLOC( vallen+1 ); if ( !pval ) { DISPMSG_ERROR( "malloc memory failed!\n"); JK_FREE( pkey ); return false; } JK_MEMCPY_S(pkey,keylen+1,key,keylen+1); JK_MEMCPY_S(pval,vallen+1,val,vallen+1); moly_list_type* pDList = (moly_list_type*)m_normalDict.GetElement( pkey ); if ( pDList ) { if ( NULL == pDList->RPush( (char*)pval ) ) { JK_FREE( pkey ); JK_FREE( pval ); return false; } if ( ops ) { Operation ( LOG_CMD_LIST_RPUSH, pkey, pval ); Replication ( LOG_CMD_LIST_RPUSH, key, pval ); } return true; } pDList = JK_NEW(moly_list_type); if ( !pDList ) { DISPMSG_ERROR( "malloc memory failed!\n"); JK_FREE( pkey ); JK_FREE( pval ); return false; } if( NULL == pDList->RPush( (char*)pval ) ) { JK_FREE( pkey ); JK_FREE( pval ); JK_DELETE( moly_list_type, pDList ); return false; } if ( !m_normalDict.AddElement(pkey, pDList ) ) { JK_FREE( pkey ); JK_FREE( pval ); JK_DELETE( moly_list_type, pDList ); return false; } if ( ops ) { Operation ( LOG_CMD_LIST_RPUSH, pkey, pval ); Replication ( LOG_CMD_LIST_RPUSH, key, pval ); } return true; }
void ClientAgent::OnRecv(BYTE *pMsg, WORD wSize) { MSG_BASE* pMsgBase = (MSG_BASE*)pMsg; switch (pMsgBase->m_byCategory) { case emc_CS_CATEGORY: { switch (pMsgBase->m_byProtocol) { case C2S_CLTREGISTER_SYN: { DISPMSG_SUCCESS( "Accept client[%s] success!\n", GetIP() ); m_iAgentType = 1; } break; case C2S_INSERT_ITEM_SYN: { MSG_C2S_INSERT_ITEM_SYN* pInsertMsg = (MSG_C2S_INSERT_ITEM_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } if (DataSpace::GetInstance().InsertKV(pInsertMsg->strKey, pInsertMsg->m_usKeyLen, pInsertMsg->strVal, pInsertMsg->m_usValLen)) { ReplyResult( egr_INSERTSUCCESS ); } else { ReplyResult( egr_INSERTFAILD ); } } break; case C2S_SELECT_ITEM_SYN: { MSG_C2S_SELECT_ITEM_SYN* pInsertMsg = (MSG_C2S_SELECT_ITEM_SYN*)pMsg; char* strVal = (char*)DataSpace::GetInstance().GetValue(pInsertMsg->strKey); if (NULL == strVal) { ReplyResult( egr_CANTFINDVAL ); } else { MSG_S2C_SELECT_ITEM_ACK ackmsg; strcpy_s(ackmsg.strKey, MAX_KEY_LEN, pInsertMsg->strKey); strcpy_s(ackmsg.strVal, 1024, strVal); Send((BYTE*)&ackmsg, sizeof(MSG_S2C_SELECT_ITEM_ACK)); } } break; case C2S_REMOVE_ITEM_SYN: { MSG_C2S_REMOVE_ITEM_SYN* pInsertMsg = (MSG_C2S_REMOVE_ITEM_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } if ( !DataSpace::GetInstance().RemoveKV(pInsertMsg->strKey) ) { ReplyResult( egr_CANTFINDVAL ); } else { ReplyResult( egr_REMOVESUCCESS ); } } break; case C2S_SELECT_KEYS_SYN: { MSG_C2S_SELECT_KEYS_SYN* pKeysMsg = (MSG_C2S_SELECT_KEYS_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } MSG_S2C_SELECT_KEYS_ACK ackmsg; DataSpace::GetInstance().FetchKeys(pKeysMsg->m_szPattern, 0, 100, ackmsg.m_szKeys, ackmsg.m_iKeysCnt ); if ( 0 == ackmsg.m_iKeysCnt ) { ReplyResult( egr_NOSUCHKEYS ); } Send((BYTE*)&ackmsg, ackmsg.GetMsgSize() ); } break; case C2S_EXISTS_KEY_SYN: { MSG_C2S_EXISTS_KEY_SYN* pKeysMsg = (MSG_C2S_EXISTS_KEY_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } if( DataSpace::GetInstance().IsExists(pKeysMsg->strKey ) ) { ReplyResult( egr_KEYEXISTS ); } else { ReplyResult( egr_NOSUCHKEYS ); } } break; case C2S_LPUSH_ITEM_SYN: { MSG_C2S_LPUSH_ITEM_SYN* pInsertMsg = (MSG_C2S_LPUSH_ITEM_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } if (DataSpace::GetInstance().ListPushLeft(pInsertMsg->strKey, pInsertMsg->m_usKeyLen, pInsertMsg->strVal, pInsertMsg->m_usValLen)) { ReplyResult( egr_INSERTSUCCESS ); } else { ReplyResult( egr_INSERTFAILD ); } } break; case C2S_RPUSH_ITEM_SYN: { MSG_C2S_RPUSH_ITEM_SYN* pInsertMsg = (MSG_C2S_RPUSH_ITEM_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } if (DataSpace::GetInstance().ListPushRight(pInsertMsg->strKey, pInsertMsg->m_usKeyLen, pInsertMsg->strVal, pInsertMsg->m_usValLen)) { ReplyResult( egr_INSERTSUCCESS ); } else { ReplyResult( egr_INSERTFAILD ); } } break; case C2S_LPOP_ITEM_SYN: { MSG_C2S_LPOP_ITEM_SYN* pInsertMsg = (MSG_C2S_LPOP_ITEM_SYN*)pMsg; if ( !CheckSvrReady() ) { return; } char* strVal = (char*)( DataSpace::GetInstance().ListPopLeft(pInsertMsg->strKey) ); if (NULL == strVal) { ReplyResult( egr_CANTFINDVAL ); } else { MSG_S2C_SELECT_ITEM_ACK ackmsg; strcpy_s(ackmsg.strKey, MAX_KEY_LEN, pInsertMsg->strKey); strcpy_s(ackmsg.strVal, 1024, strVal); Send((BYTE*)&ackmsg, sizeof(MSG_S2C_SELECT_ITEM_ACK)); } } break; case C2S_RPOP_ITEM_SYN: { if ( !CheckSvrReady() ) { return; } MSG_C2S_RPOP_ITEM_SYN* pInsertMsg = (MSG_C2S_RPOP_ITEM_SYN*)pMsg; char* strVal = (char*)( DataSpace::GetInstance().ListPopRight(pInsertMsg->strKey) ); if (NULL == strVal) { ReplyResult( egr_CANTFINDVAL ); } else { MSG_S2C_SELECT_ITEM_ACK ackmsg; strcpy_s(ackmsg.strKey, MAX_KEY_LEN, pInsertMsg->strKey); strcpy_s(ackmsg.strVal, 1024, strVal); Send((BYTE*)&ackmsg, sizeof(MSG_S2C_SELECT_ITEM_ACK)); } } break; case C2S_LLEN_ITEM_SYN: { if ( !CheckSvrReady() ) { return; } MSG_C2S_LLEN_ITEM_SYN* pllMsg = (MSG_C2S_LLEN_ITEM_SYN*)pMsg; int iLength = DataSpace::GetInstance().GetListLength(pllMsg->strKey); MSG_S2C_SELECT_ITEM_ACK ackmsg; strcpy_s(ackmsg.strKey, MAX_KEY_LEN, pllMsg->strKey); JK_SPRITF_S( ackmsg.strVal, 1024, "%d", iLength ); Send((BYTE*)&ackmsg, sizeof(MSG_S2C_SELECT_ITEM_ACK)); } break; default: { DISPMSG_ERROR("Error protocol type, cat[%d], pro[%d]", pMsgBase->m_byCategory, pMsgBase->m_byProtocol ); } break; } } break; case emc_MS_CATEGORY: { switch (pMsgBase->m_byProtocol) { case S2M_SLVREGISTER_SYN: { DISPMSG_SUCCESS( "Accept slave[%s] success!\n", GetIP() ); m_iAgentType = 2; Appender::ReplicateAppendFile( this ); SlaveMgr::GetInstance().InsertSlave( this ); } break; case S2M_APPENDFILE_SYN: { // sync replication } break; } } break; default: { DISPMSG_ERROR("Error protocol type, cat[%d], pro[%d]", pMsgBase->m_byCategory, pMsgBase->m_byProtocol ); } break; } }
void NetInterface::CloseInterface() { DISPMSG_ERROR( "Server is terminated...\n" ); m_IOCPServer.Shutdown(); }