TCP protocol stack won't mergeview with initial hosts specified as IP addresses
-------------------------------------------------------------------------------

         Key: JGRP-14
         URL: http://jira.jboss.com/jira/browse/JGRP-14
     Project: JGroups
        Type: Bug
    Versions: 2.2.8    
 Environment: Linux and JGroups 2.2.7
    Reporter: Zac Hansen
 Assigned to: Bela Ban 


When I use a TCP protocol stack with TCPPING having initial members as ip 
addresses: initial_members=192.168.1.200[4000], no merges will occur when 2 
instances are started simultaneously.  The same thing with 
initial_members=localhost[4000] merges fine when 2 instances are started 
simultaneously.

The following code reproduces the problem when started with a command line 
parameter of 1, and works when run with a parameter of 0.

belacode.java follows:
--------------------------------

import java.sql.*;
import java.util.*;
import java.util.regex.*;
import java.net.*;

import org.jgroups.*;
import org.jgroups.stack.GossipServer;

// Helper class for JGroups stuff
class JGroupsManager {


    static String fillInProtocolString ( String protocol, Map vars )
    {

        String variableRegexString = "[$]([A-Z]+)";
        Pattern variablePattern;
        try {
            variablePattern = Pattern.compile ( variableRegexString );
        } catch ( Exception e ) {
            throw new RuntimeException ( "Couldn't compile into regex: " + 
variableRegexString );
        }

        Matcher matcher = variablePattern.matcher ( protocol );

        while ( matcher.find ( ) ) {

            String variable = matcher.group ( 1 );
            String variableLowerCase = variable.toLowerCase ( );
            // System.err.println ( "Found variable for interpolation: " + 
variable );
            if ( vars.get ( variableLowerCase ) == null ) {
                throw new RuntimeException ( "Couldn't find value for " + 
variableLowerCase + " in value map" );
            }
            protocol = protocol.replaceFirst ( "[$]" + variable, (String) 
vars.get ( variableLowerCase ) );

        }

        // System.err.println ( "Returning: " + protocol );
        return protocol;

    }

    static Channel createChannel ( String protocol )
    {
        
        Channel channel;
        try {
            channel = new JChannel ( protocol );
        } catch ( Exception e ) {
            System.err.println ( "##########");
            e.printStackTrace ( );
            throw new RuntimeException ( "Couldn't create channel with 
protocol: " + protocol );
        }

        System.err.println ( "Created channel with protocol: " + protocol );

        return channel;

    }

}

class belacode {

    static String localIpAddress_ = "";
    static String localHostname_ = "";

    static
    {
        try {
            java.net.InetAddress localMachine =
                java.net.InetAddress.getLocalHost();    

            // put the text version of the address into localIpAddress_
            localIpAddress_ = localMachine.getHostAddress ( );
            
            localHostname_ = localMachine.getHostName ( );

        } catch ( java.net.UnknownHostException uhe ) {
            //handle exception
        } finally {
            // System.err.println ( "I think I'm running on: " + 
localIpAddress_ + " / " + localHostname_ );
        }



    }
              
          
    public static void main ( String [ ] args ) 
    {
        
        if ( args.length != 1 || (!args [ 0 ].equals ( "0" ) && !args [ 0 
].equals ( "1" ) ) ) {
            System.err.println ( "Usage: java belacode [0/1]\n0 for localhost 
(works)\n1 for ip address (doesn't work)\n" );
            System.exit ( 1 );
        }


        int port = 20043;
        String host;
        try {
            host = InetAddress.getLocalHost ( ).getHostAddress ( );
            System.err.println (            host = InetAddress.getLocalHost ( 
).getHostAddress ( ) );
        } catch ( UnknownHostException e ) {
            throw new RuntimeException ( "Couldn't determine localhost.  This 
shouldn't happen" );

        }

        if ( args [ 0 ].equals ( "0" ) ) {
            System.err.println ( "Setting localhost" );
            host = "localhost";
        }

        
        String prot = "TCP(start_port=" + port + "):TCPPING(initial_hosts=" + 
host + "[" + port + 
"];port_range=5;timeout=3000;num_initial_members=2):FD(timeout=3000;max_tries=4):MERGE2(min_interval=5000;max_interval=10000):VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):pbcast.NAKACK(gc_lag=100):pbcast.STABLE(stability_delay=1000;desired_avg_gossip=20000;down_thread=false;up_thread=false;max_bytes=0):UNICAST(timeout=5000):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=true;print_local_addr=true)";
                
        System.err.println ( "Using protocol string:\n" + prot );


        Channel channel = JGroupsManager.createChannel ( prot );
                                       
        String groupName = "mygroup";
        try {
            

            System.err.println ( "Connecting with groupname: " + groupName );
            channel.connect ( groupName );
            
        } catch ( Exception e ) {
            System.err.println ( "Couldn't connect to group: " + groupName );
        }
        
        
        // new ChannelSenderThread ( channel, new Integer ( port ).toString ( ) 
).start ( );
        
        // let's look at the current view
        View view = channel.getView ( );
        
        
        while ( true ) {
            
            // let's block waiting for a message
            Object message;
            try {
                message = channel.receive ( 10000 );
            } catch ( ChannelNotConnectedException e ) {
                throw new RuntimeException ( "Tried to receive on a channel 
that wasn't connected" );
            } catch ( ChannelClosedException e ) {
                throw new RuntimeException ( "Tried to receive on a channel 
that was closed" );
            } catch ( TimeoutException e ) {
                System.err.println ( "Timed out on receive" );
                continue;
            }

            System.err.println ( "######### Received object: " + message );

            if ( message instanceof View ) {
                System.err.println ( "###\n###\n###\nGot a view with " + 
((View)message).size ( ) + " element(s)" );
                for ( Iterator j = ((View)message).getMembers ( ).iterator ( );
                      j.hasNext ( ); ) {

                    System.err.println ( j.next ( ) );

                }

                if ( message instanceof MergeView ) {
                    System.err.println ( "BTW, this view is a mergeview" );
                }

                        
            } else if ( message instanceof Message ) {
                System.err.println ( "Got a message: " + message + 
(((Message)message).getObject ( ) ) );
            } else if ( message instanceof SuspectEvent ) {
                System.err.println ( "Got a Suspect Event: " + message );
            } else if ( message instanceof BlockEvent ) {
                System.err.println ( "Got a Block Event: " + message );
            } else if ( message instanceof GetStateEvent ) {
                System.err.println ( "Got a Get State Event: " + message );
            } else if ( message instanceof SetStateEvent ) {
                System.err.println ( "Got a Set State Event: " + message );
            }

        }

    }
    
}





-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.jboss.com/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira



-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues
Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
_______________________________________________
JBoss-Development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to