For example, I use three nodes (all forced to be ultrapeer) to form a line topology like this:
A--->B<---C
If I fire a search request from node A (of cource I know some keywords of files in node C), and at node B, the search request can be seen in the search monitor tab, but fail to be found at node C.
I replaced sendDynamicQuery in sendMyQuery with directly forwarding query to ultrapeers and leaves, such as:
if ( HostManager.getInstance().isUltrapeer() )
{
/*return sendDynamicQuery( queryMsg,
DynamicQueryConstants.DESIRED_ULTRAPEER_RESULTS );*/
// only forward to ultrapeers if I'm not a leaf.
if ( queryMsg.getHeader().getTTL() > 0 )
{
msgMgr.forwardQueryToUltrapeers( queryMsg, null );
msgMgr.forwardQueryToLeaves(queryMsg, null);
return null;
}
}
At this time, node C can receive the search request, but node A fail to receive any replies. Another interesting thing is that node B can receive reply from C, but can not forward the reply to node A.
Any suggestions? |