private void prep(String t) throws Exception {
	try {
	    /* SEND sub-tran param */
	    out.println(t);

	    /* check tID to avoid re-ordering */
	    String[] tokens = t.split(Setting.theSplit);
	    String s_tid = tokens[0];

	    /* GET voting result */
	    String vret = in.readLine();

	    /* peer socket is closed */
	    if (vret == null)
		throw new IOException(name + " rmt svr down");

	    tokens = vret.split(Setting.theSplit);

	    /* treat as peer socket is closed */
	    if (tokens == null || tokens.length != 2)
		throw new IOException(name + " unknown voting");

	    String r_tid = tokens[0];
	    System.out.println("snd tid " + s_tid 
		    + " rcv tid " + r_tid);

	    /* treat as peer socket is closed */
	    if (! s_tid.trim().equals(r_tid.trim())) {
		throw new IOException(name + " packets re-ordered");
	    }

	    /* update the voting result */
	    if (tokens[1].equals(Setting.SEND_YES))
		vr.addYes(this);
	    else 
		vr.addNo(this, Setting.REASON_VOTE_NO);

	    vr = null;

	} catch (SocketTimeoutException e) {
	    vr.addNo(this, Setting.REASON_TIMEOUT);

	    /* to close this client thread to require 
	     * reconnect explictedly */
	    throw new Exception("socket time out");

	} catch (IOException e) {
	    vr.addNo(this, Setting.REASON_SVR_DOWN);

	    /* to close this client thread to require 
	     * reconnect explictedly */
	    throw e;
	}
    }