Exemple #1
0
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;
}
Exemple #2
0
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 ;
}
Exemple #3
0
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;
	}

}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
	}
}
Exemple #7
0
void NetInterface::CloseInterface()
{
	DISPMSG_ERROR( "Server is terminated...\n" );
	m_IOCPServer.Shutdown();
}