mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-25 23:49:35 -05:00
distant outgoing messages stay in outbox until actually sent
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6661 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
9488a6a33d
commit
4c87eb0781
@ -103,9 +103,10 @@ int p3MsgService::tick()
|
|||||||
if(now > last_management_time + 5)
|
if(now > last_management_time + 5)
|
||||||
{
|
{
|
||||||
manageDistantPeers() ;
|
manageDistantPeers() ;
|
||||||
|
checkOutgoingMessages();
|
||||||
|
|
||||||
last_management_time = now ;
|
last_management_time = now ;
|
||||||
}
|
}
|
||||||
//checkOutgoingMessages();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -306,8 +307,38 @@ int p3MsgService::checkOutgoingMessages()
|
|||||||
|
|
||||||
/* find the certificate */
|
/* find the certificate */
|
||||||
std::string pid = mit->second->PeerId();
|
std::string pid = mit->second->PeerId();
|
||||||
|
bool tunnel_is_ok = false ;
|
||||||
|
|
||||||
if(mit->second->msgFlags & RS_MSG_FLAGS_DISTANT || mLinkMgr->isOnline(pid) || pid == ownId) /* FEEDBACK Msg to Ourselves */
|
if(mit->second->msgFlags & RS_MSG_FLAGS_DISTANT)
|
||||||
|
{
|
||||||
|
// Do we have a tunnel already?
|
||||||
|
//
|
||||||
|
const std::string& hash = mit->second->PeerId() ;
|
||||||
|
std::map<std::string,DistantMessengingContact>::iterator it = _messenging_contacts.find(hash) ;
|
||||||
|
|
||||||
|
if(it != _messenging_contacts.end())
|
||||||
|
{
|
||||||
|
tunnel_is_ok = (it->second.status == RS_DISTANT_MSG_STATUS_TUNNEL_OK) ;
|
||||||
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
|
std::cerr << "checkOutGoingMessages(): distant contact found. tunnel_is_ok = " << tunnel_is_ok << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
|
std::cerr << "checkOutGoingMessages(): distant contact not found. Asking for tunnels for hash " << hash << std::endl;
|
||||||
|
#endif
|
||||||
|
// no. Ask for monitoring tunnels.
|
||||||
|
rsTurtle->monitorTunnels(hash,this) ;
|
||||||
|
tunnel_is_ok = false ;
|
||||||
|
|
||||||
|
DistantMessengingContact& contact( _messenging_contacts[hash] ) ;
|
||||||
|
contact.status = RS_DISTANT_MSG_STATUS_TUNNEL_DN ;
|
||||||
|
contact.pending_messages = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(tunnel_is_ok || mLinkMgr->isOnline(pid) || pid == ownId) /* FEEDBACK Msg to Ourselves */
|
||||||
{
|
{
|
||||||
/* send msg */
|
/* send msg */
|
||||||
pqioutput(PQL_DEBUG_BASIC, msgservicezone,
|
pqioutput(PQL_DEBUG_BASIC, msgservicezone,
|
||||||
@ -350,8 +381,20 @@ int p3MsgService::checkOutgoingMessages()
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(std::list<RsMsgItem*>::const_iterator it(output_queue.begin());it!=output_queue.end();++it)
|
for(std::list<RsMsgItem*>::const_iterator it(output_queue.begin());it!=output_queue.end();++it)
|
||||||
|
{
|
||||||
checkSizeAndSendMessage(*it) ;
|
checkSizeAndSendMessage(*it) ;
|
||||||
|
|
||||||
|
if( (*it)->msgFlags & RS_MSG_FLAGS_DISTANT )
|
||||||
|
{
|
||||||
|
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
||||||
|
|
||||||
|
_messenging_contacts[(*it)->PeerId()].pending_messages = false ;
|
||||||
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
|
std::cerr << "checkOutgoingMessages(): removing pending message flag for hash " << (*it)->PeerId() << "." << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(changed)
|
if(changed)
|
||||||
rsicontrol->getNotify().notifyListChange(NOTIFY_LIST_MESSAGELIST,NOTIFY_TYPE_MOD);
|
rsicontrol->getNotify().notifyListChange(NOTIFY_LIST_MESSAGELIST,NOTIFY_TYPE_MOD);
|
||||||
|
|
||||||
@ -2128,29 +2171,6 @@ void p3MsgService::manageDistantPeers()
|
|||||||
#ifdef DEBUG_DISTANT_MSG
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
std::cerr << "p3MsgService::manageDistantPeers()" << std::endl;
|
std::cerr << "p3MsgService::manageDistantPeers()" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<std::pair<std::string,RsMsgItem*> > to_send ;
|
|
||||||
|
|
||||||
{
|
|
||||||
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
|
||||||
for(std::map<std::string,DistantMessengingContact>::iterator it(_messenging_contacts.begin());it!=_messenging_contacts.end();++it)
|
|
||||||
if(it->second.status == RS_DISTANT_MSG_STATUS_TUNNEL_OK)
|
|
||||||
{
|
|
||||||
for(uint32_t i=0;i<it->second.pending_messages.size();++i)
|
|
||||||
to_send.push_back(std::pair<std::string,RsMsgItem*>(it->first,it->second.pending_messages[i])) ;
|
|
||||||
|
|
||||||
it->second.pending_messages.clear() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(uint32_t i=0;i<to_send.size();++i)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_DISTANT_MSG
|
|
||||||
std::cerr << " Flushing msg " << to_send[i].second->msgId << std::endl;
|
|
||||||
#endif
|
|
||||||
sendTurtleData(to_send[i].first,to_send[i].second) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t now = time(NULL) ;
|
time_t now = time(NULL) ;
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
||||||
@ -2174,7 +2194,7 @@ void p3MsgService::manageDistantPeers()
|
|||||||
// clean dead contacts.
|
// clean dead contacts.
|
||||||
//
|
//
|
||||||
for(std::map<std::string,DistantMessengingContact>::iterator it(_messenging_contacts.begin());it!=_messenging_contacts.end();)
|
for(std::map<std::string,DistantMessengingContact>::iterator it(_messenging_contacts.begin());it!=_messenging_contacts.end();)
|
||||||
if(it->second.pending_messages.empty() && it->second.status == RS_DISTANT_MSG_STATUS_TUNNEL_DN)
|
if((!it->second.pending_messages) && it->second.status == RS_DISTANT_MSG_STATUS_TUNNEL_DN)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_DISTANT_MSG
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
std::cerr << " Removing dead contact with no pending msgs and dead tunnel. hash=" << it->first << std::endl;
|
std::cerr << " Removing dead contact with no pending msgs and dead tunnel. hash=" << it->first << std::endl;
|
||||||
@ -2221,7 +2241,7 @@ void p3MsgService::removeVirtualPeer(const TurtleFileHash& hash, const TurtleVir
|
|||||||
contact.status = RS_DISTANT_MSG_STATUS_TUNNEL_DN ;
|
contact.status = RS_DISTANT_MSG_STATUS_TUNNEL_DN ;
|
||||||
contact.virtual_peer_id.clear() ;
|
contact.virtual_peer_id.clear() ;
|
||||||
|
|
||||||
if(contact.pending_messages.empty())
|
if(!contact.pending_messages)
|
||||||
remove_tunnel = true ;
|
remove_tunnel = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2364,26 +2384,39 @@ void p3MsgService::sendPrivateMsgItem(RsMsgItem *msgitem)
|
|||||||
{
|
{
|
||||||
#ifdef DEBUG_DISTANT_MSG
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
std::cerr << "p3MsgService::sendDistanteMsgItem(): sending distant msg item to peer " << msgitem->PeerId() << std::endl;
|
std::cerr << "p3MsgService::sendDistanteMsgItem(): sending distant msg item to peer " << msgitem->PeerId() << std::endl;
|
||||||
std::cerr << " asking for tunnels" << std::endl;
|
// std::cerr << " asking for tunnels" << std::endl;
|
||||||
std::cerr << " recording msg info" << std::endl;
|
// std::cerr << " recording msg info" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
const std::string& hash = msgitem->PeerId() ;
|
// const std::string& hash = msgitem->PeerId() ;
|
||||||
rsTurtle->monitorTunnels(hash,this) ; // create a tunnel for it, and put the msg on the waiting list.
|
// rsTurtle->monitorTunnels(hash,this) ; // create a tunnel for it, and put the msg on the waiting list.
|
||||||
|
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
||||||
|
|
||||||
// allocate a new contact. If it does not exist, set its tunnel state to DN
|
// allocate a new contact. If it does not exist, set its tunnel state to DN
|
||||||
//
|
//
|
||||||
std::map<std::string,DistantMessengingContact>::iterator it = _messenging_contacts.find(hash) ;
|
std::map<std::string,DistantMessengingContact>::iterator it = _messenging_contacts.find(msgitem->PeerId()) ;
|
||||||
|
|
||||||
DistantMessengingContact& contact( _messenging_contacts[hash] ) ;
|
|
||||||
|
|
||||||
if(it == _messenging_contacts.end())
|
if(it == _messenging_contacts.end())
|
||||||
contact.status = RS_DISTANT_MSG_STATUS_TUNNEL_DN ;
|
{
|
||||||
|
std::cerr << "(EE) p3MsgService::sendPrivateMsgItem(): ERROR: no tunnel for message to send. This should not happen. " << std::endl;
|
||||||
contact.pending_messages.push_back(msgitem) ; // record the msg to be sent.
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(it->second.status != RS_DISTANT_MSG_STATUS_TUNNEL_OK)
|
||||||
|
{
|
||||||
|
std::cerr << "(WW) p3MsgService::sendPrivateMsgItem(): WARNING: no tunnel for message to send. This should not happen. " << std::endl;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!it->second.pending_messages)
|
||||||
|
std::cerr << "(WW) p3MsgService::sendPrivateMsgItem(): WARNING: no pending message flag. This should not happen. " << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_DISTANT_MSG
|
||||||
|
std::cerr << " Flushing msg " << msgitem->msgId << " for peer id " << msgitem->PeerId() << std::endl;
|
||||||
|
#endif
|
||||||
|
sendTurtleData(msgitem->PeerId(),msgitem) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ int checkOutgoingMessages();
|
|||||||
time_t last_hit_time ;
|
time_t last_hit_time ;
|
||||||
std::string virtual_peer_id ;
|
std::string virtual_peer_id ;
|
||||||
uint32_t status ;
|
uint32_t status ;
|
||||||
std::vector<RsMsgItem*> pending_messages ;
|
bool pending_messages ;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool createDistantOfflineMessengingInvite(time_t time_of_validity,TurtleFileHash& hash) ;
|
bool createDistantOfflineMessengingInvite(time_t time_of_validity,TurtleFileHash& hash) ;
|
||||||
|
Loading…
Reference in New Issue
Block a user