00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "BroadcastRequestHandler.h"
00019 #include "BroadcastRequestEvent.h"
00020 #include "ServerState.h"
00021
00022 #include "ServerExceptions.h"
00023
00024 #include <sys/time.h>
00025
00026 using namespace CODEX_Server;
00027
00029 bool
00030 BroadcastRequestHandler::handler( BroadcastRequestEvent& event )
00031 {
00032
00033
00034 CODEX_Quorum::QuorumSystem* qs = ServerState::instance()->quorumSystem();
00035 if ( NULL == qs )
00036 {
00037 throw NoQuorumSystemException( __FILE__ , __LINE__ );
00038 }
00039 try
00040 {
00041 struct timeval tv;
00042 gettimeofday(&tv,0);
00043 if ( ( tv.tv_sec - event.time() ) < 3 )
00044 {
00045 return false;
00046 }
00047 event.updateTime( tv.tv_sec );
00048 if ( ! event.bcast() )
00049 {
00050 event.setBcast();
00051 bool bVal = qs->broadcastMessage( event.message(),
00052 event.retVals(),
00053 event.cb() );
00054 bool retVal = false;
00055 CODEX_Quorum::ReturnVector::const_iterator itr =
00056 event.retVals().begin();
00057 CODEX_Quorum::ReturnVector::const_iterator end =
00058 event.retVals().end();
00059 unsigned int nGood = 0;
00060 for ( ; itr != end ; ++itr )
00061 {
00062 if ( itr->returnCode() ==
00063 CODEX_Quorum::RemoteServerReturn::kSuccess )
00064 {
00065 ++nGood;
00066 }
00067 }
00068 if ( nGood >= qs->quorumSize() )
00069 {
00070 retVal = true;
00071 }
00072 if ( retVal )
00073 {
00074 sendEvent( 0, event.source() );
00075 }
00076 return retVal;
00077 }
00078 else
00079 {
00080
00081
00082 if ( ( 0 != event.cb() ) &&
00083 ( ! qs->keyRegistered(event.message().buffer() +
00084 ServerState::nSID) ) )
00085 {
00086 sendEvent( 0, event.source() );
00087 return true;
00088 }
00089 bool bVal = qs->broadcastMessage( event.message(),
00090 event.retVals(),
00091 NULL );
00092 bool retVal = false;
00093 CODEX_Quorum::ReturnVector::const_iterator itr =
00094 event.retVals().begin();
00095 CODEX_Quorum::ReturnVector::const_iterator end =
00096 event.retVals().end();
00097 unsigned int nGood = 0;
00098 for ( ; itr != end ; ++itr )
00099 {
00100 if ( itr->returnCode() ==
00101 CODEX_Quorum::RemoteServerReturn::kSuccess )
00102 {
00103 ++nGood;
00104 }
00105 }
00106 if ( nGood >= qs->quorumSize() )
00107 {
00108 retVal = true;
00109 }
00110 if ( retVal )
00111 {
00112 sendEvent( 0, event.source() );
00113 }
00114 return retVal;
00115 }
00116 }
00117 catch ( ... )
00118 {
00119 return false;
00120 }
00121 }