static skv_status_t Execute( skv_client_conn_manager_if_t * aConnMgrIF, skv_client_server_conn_t* aConn, skv_client_ccb_t* aCCB ) { char* RecvBuff = aCCB->GetRecvBuff(); skv_server_to_client_cmd_hdr_t* Hdr = (skv_server_to_client_cmd_hdr_t *) RecvBuff; skv_client_command_state_t State = aCCB->mState; skv_client_event_t Event = Hdr->mEvent; BegLogLine( SKV_CLIENT_ACTIVE_BCAST_COMMAND_SM_LOG ) << " skv_client_active_bcast_command_sm::Execute(): Entering... " << " State: " << skv_client_command_state_to_string( State ) << " Event: " << skv_client_event_to_string( Event ) << EndLogLine; skv_status_t status = SKV_SUCCESS; switch( State ) { case SKV_CLIENT_COMMAND_STATE_IDLE: case SKV_CLIENT_COMMAND_STATE_DONE: { StrongAssertLogLine( 0 ) << "skv_client_active_bcast_command_sm::Execute(): ERROR: Invalid State: " << " State: " << skv_client_command_state_to_string( State ) << EndLogLine; break; } case SKV_CLIENT_COMMAND_STATE_WAITING_FOR_CMPL: { switch( Event ) { case SKV_CLIENT_EVENT_CMD_COMPLETE: { skv_cmd_active_bcast_resp_t* Resp = (skv_cmd_active_bcast_resp_t *) RecvBuff; skv_c2s_active_broadcast_func_type_t FuncType = aCCB->mCommand.mCommandBundle.mCommandActiveBcast.mFuncType; int NodeId = aCCB->mCommand.mCommandBundle.mCommandActiveBcast.mNodeId; // Extract the handle to the appropriate index/cursor // manager switch( FuncType ) { case SKV_ACTIVE_BCAST_DUMP_PERSISTENCE_IMAGE_FUNC_TYPE: { break; } default: { StrongAssertLogLine( 0 ) << "skv_client_active_bcast_command_sm::Execute(): ERROR: Invalid FuncType: " << " FuncType: " << FuncType << EndLogLine; break; } } BegLogLine( SKV_CLIENT_ACTIVE_BCAST_COMMAND_SM_LOG ) << " skv_client_active_bcast_command_sm::Execute(): " << " NodeId: " << NodeId << " Resp->mServerCursorHandle: " << (void *) Resp->mServerHandle << EndLogLine; aCCB->mStatus = Resp->mStatus; BegLogLine( SKV_CLIENT_ACTIVE_BCAST_COMMAND_SM_LOG ) << "skv_client_active_bcast_command_sm::Execute(): In final action block" << " status: " << skv_status_to_string( aCCB->mStatus ) << EndLogLine; Release( aConn, aCCB ); aCCB->Transit( SKV_CLIENT_COMMAND_STATE_DONE ); break; } case SKV_CLIENT_EVENT_ERROR: { // Server returned an error. skv_cmd_err_resp_t* ErrResp = (skv_cmd_err_resp_t *) RecvBuff; ErrResp->EndianConvert(); BegLogLine( SKV_CLIENT_ACTIVE_BCAST_COMMAND_SM_LOG ) << "skv_client_active_bcast_command_sm::Execute(): ERROR: response from server: " << " status: " << skv_status_to_string( ErrResp->mStatus ) << EndLogLine; aCCB->mStatus = ErrResp->mStatus; // Command is completed, release resources int CommandOrd = aCCB->GetCmdOrd(); aConn->ReleaseCmdOrdinal( CommandOrd ); aCCB->Transit( SKV_CLIENT_COMMAND_STATE_DONE ); break; } default: { StrongAssertLogLine( 0 ) << "skv_client_active_bcast_command_sm::Execute(): ERROR: Invalid Event: " << " Event: " << skv_client_event_to_string( Event ) << EndLogLine; break; } } break; } default: { StrongAssertLogLine( 0 ) << "skv_client_active_bcast_command_sm::Execute(): ERROR: Invalid State: " << " State: " << skv_client_command_state_to_string( State ) << EndLogLine; break; } } BegLogLine( SKV_CLIENT_ACTIVE_BCAST_COMMAND_SM_LOG ) << "skv_client_active_bcast_command_sm::Execute(): Leaving... " << EndLogLine; return status; }
static skv_status_t Execute( skv_client_conn_manager_if_t * aConnMgrIF, skv_client_server_conn_t* aConn, skv_client_ccb_t* aCCB ) { char* RecvBuff = aCCB->GetRecvBuff(); skv_server_to_client_cmd_hdr_t* Hdr = (skv_server_to_client_cmd_hdr_t *) RecvBuff; skv_client_command_state_t State = aCCB->mState; skv_client_event_t Event = Hdr->mEvent; BegLogLine( SKV_CLIENT_RETRIEVE_COMMAND_SM_LOG ) << "skv_client_retrieve_command_sm::Execute:: Entering... " << " State: " << skv_client_command_state_to_string( State ) << " Event: " << skv_client_event_to_string( Event ) << EndLogLine; skv_status_t status = SKV_SUCCESS; switch( State ) { case SKV_CLIENT_COMMAND_STATE_IDLE: case SKV_CLIENT_COMMAND_STATE_DONE: { StrongAssertLogLine( 0 ) << "skv_client_retrieve_command_sm::Execute:: ERROR:: Invalid State: " << " State: " << skv_client_command_state_to_string( State ) << EndLogLine; break; } case SKV_CLIENT_COMMAND_STATE_WAITING_FOR_VALUE_TX_ACK: { switch( Event ) { case SKV_CLIENT_EVENT_RDMA_WRITE_VALUE_ACK: { // Operation has completed. skv_cmd_retrieve_value_rdma_write_ack_t* Ack = (skv_cmd_retrieve_value_rdma_write_ack_t *) RecvBuff; int retrievedSize = Ack->mValue.mValueSize; // if the server indicates that there's more data, then only get the amount that fits into user buffer! if( Ack->mStatus == SKV_ERRNO_VALUE_TOO_LARGE ) { retrievedSize = aCCB->mCommand.mCommandBundle.mCommandRetrieve.mValueRequestedSize; // Ack->mStatus = SKV_SUCCESS; } // get value data out of response if flags indicate that it fit if( aCCB->mCommand.mCommandBundle.mCommandRetrieve.mFlags & SKV_COMMAND_RIU_RETRIEVE_VALUE_FIT_IN_CTL_MSG ) { void* valueBuffer = aCCB->mCommand.mCommandBundle.mCommandRetrieve.mValueBufferRef.mValueAddr; BegLogLine( SKV_CLIENT_RETRIEVE_COMMAND_SM_LOG ) << "skv_client_retrieve_command_sm::Execute(): about to copy retrieved data" << " uBuf: " << (void*)valueBuffer << " rBuf: " << (void*)Ack->mValue.mData << " size: " << retrievedSize << " CCB: " << (void*)aCCB << " value: " << (void*)(*(uint64_t*)(Ack->mValue.mData)) #ifdef SKV_DEBUG_MSG_MARKER << " msg: " << Ack->mHdr.mMarker #endif << EndLogLine; memcpy( valueBuffer, Ack->mValue.mData, retrievedSize ); } aCCB->mStatus = Ack->mStatus; // user wanted to know the actual retrieved size if( aCCB->mCommand.mCommandBundle.mCommandRetrieve.mValueRetrievedSize != NULL ) *aCCB->mCommand.mCommandBundle.mCommandRetrieve.mValueRetrievedSize = Ack->mValue.mValueSize; status = Release( aConn, aCCB ); AssertLogLine( status == SKV_SUCCESS ) << "skv_client_retrieve_command_sm::Execute():: ERROR:: Release failed: " << " status: " << status << EndLogLine; aCCB->Transit( SKV_CLIENT_COMMAND_STATE_DONE ); break; } case SKV_CLIENT_EVENT_ERROR: { // Server returned an error. skv_cmd_err_resp_t* ErrResp = (skv_cmd_err_resp_t *) RecvBuff; BegLogLine( SKV_CLIENT_RETRIEVE_COMMAND_SM_LOG ) << "skv_client_retrieve_command_sm::Execute:: ERROR response from server: " << " status: " << ErrResp->mStatus << EndLogLine; aCCB->mStatus = ErrResp->mStatus; status = Release( aConn, aCCB ); AssertLogLine( status == SKV_SUCCESS ) << "skv_client_retrieve_command_sm::Execute():: ERROR:: Release failed: " << " status: " << status << EndLogLine; aCCB->Transit( SKV_CLIENT_COMMAND_STATE_DONE ); break; } default: { StrongAssertLogLine( 0 ) << "skv_client_retrieve_command_sm::Execute:: ERROR:: Invalid State: " << " State: " << skv_client_command_state_to_string( State ) << " Event: " << skv_client_event_to_string( Event ) << EndLogLine; break; } } break; } default: { StrongAssertLogLine( 0 ) << "skv_client_retrieve_command_sm::ProcessCCB:: ERROR:: Invalid State: " << " State: " << skv_client_command_state_to_string( State ) << EndLogLine; break; } } BegLogLine( SKV_CLIENT_RETRIEVE_COMMAND_SM_LOG ) << "skv_client_retrieve_command_sm::Execute:: Leaving... " << EndLogLine; return status; }