Frequently Asked Questions

  1. Does JChannel have a limit on the size of messages sent over it ?
  2. Is it time consuming to port all of our code from JChannel to EnsChannel?
  3. I receive an error message when starting EnsChannel 'Some IO garbage at ensemble outboard startup'. What does it mean ?
  4. When 2 EnsChannels start up, they do not seem to 'find' each other (they don't form a process group).
  5. How can I tunnel I firewall ?

Q: Does JChannel have a limit on the size of messages sent over it ?

A:

Currently (Nov 98) JChannel uses UDP to send/receive messages. UDP has a size limitation which is the cause for the problem encountered. I intend to write a FRAG layer which fragments larger messages into smaller ones and defragments them at the receiver side. That layer can then just be used on top of the UDP layer. There are 2 ways to overcome this problem:
  1. Use EnsChannel or IbusChannel instead of JChannel when using packets larger than 8KB in size. Both have fragmentation layers.
  2. Write a FRAG layer yourself. This should not be very difficult. I'm currently writing a paper that describes how to write protocol layers and use them with JavaGroups. We welcome useful layers and will integrate and distribute them together with JavaGroups.

Q: Is it time consuming to port all of our code from JChannel to EnsChannel?

A:

Absolutely not. Applications should be written against the Channel abstract class. An actual implementation might for example be JChannel, EnsChannel or IbusChannel. You can parameterize an application to choose the desired stack subclass when started. Applications may also use instances of each type of stack in the same application.

Q: I receive an error message when starting EnsChannel 'Some IO garbage at ensemble outboard startup'. What does it mean ?

The exact error message is:
Waiting for the outboard process to start
java.net.ConnectException: Connection refused
Some IO garbage at ensemble outboard startup.

A:

Q: When EnsChannel starts up, it spawns the outboard executable and then tries to connect to it via a socket. To ensure that outboard has enough time to start and initialize, EnsChannel waits 2.5 seconds before it tries to connect. There are 2 main problems that cause the above error message:
  1. The outboard executable cannot be found. Make sure it is in the PATH.
  2. 2.5 seconds may be too short for outboard to start up. Therefore EnsChannel cannot connect correctly to outboard via socket. The timeout can be increased by changing file JavaGroups/Ensemble/Hot_Ensemble.java (look for sleep(2500)).

Q: When 2 EnsChannels start up, they do not seem to 'find' each other (they don't form a process group).

A:

There is probably no gossip daemon running. Refer to the Ensemble documentation on how to start it. Also, check that the ENS_* environment variables have been set correctly.

Q: How can I tunnel a firewall ?

A:

Okay, there are 2 things: a gossip deamon and a router.
  1. The gossip daemon is used to register channels, and keep track of channels and groups. Channels periodically register with the gossip daemon. When a registration from a channel hasn't been received for a certain period of time (10 secs), the channel is dropped. New channels query the gossip daemon for initial membership. The gossip daemon is used when IP multicast is disabled. Otherwise, IP multicast would ping to a well-known IP mcast address to find the initial membership.
  2. The router is used to tunnel traffic through a firewall using TCP. Your stack has to contain a TUNNEL layer at the bottom, instead of a UDP layer. TUNNEL establishes a TCP connection with JRouter, and sends outgoing packets over that connection, and receives incoming packets.
In your case, I would use both the gossip daemon and the router. You would start the components in the following order: 1. Start gossip daemon: JavaGroups/JavaStack/GossipServer (starts on port 12001 by default) 2. Start JRouter: JavaGroups/JavaStack/JRouter (starts on port 12002 by default) 3. Create your channel: new JChannel The channel properties in this case have to be defined as follows: "TUNNEL(router_host=janet.cs.cornell.edu;router_port=12002):" + "PING(gossip_host=janet.cs.cornell.edu;gossip_port=12001):FD:GMS"; 'janet.cs.cornell.edu' would have to be replaced by the hostname on which you run gossip and JRouter. When starting a new channel, you would see messages in both the gossip server's window, and the JRouter. These messages would tell you what happens.