Program: 48666
Project: 48666
Buggy source:
private void startJoin(){
  logger.finest("String_Node_Str");
  lock.lock();
  try {
    joinInProgress=true;
    node.getPartitionService().pauseMigration();
    final Collection<MemberImpl> members=getMemberList();
    final Collection<MemberInfo> memberInfos=createMemberInfos(members);
    for (    MemberInfo memberJoining : setJoins) {
      memberInfos.add(memberJoining);
    }
    final long time=getClusterTime();
    final Operation[] postJoinOps=nodeEngine.getPostJoinOperations();
    final PostJoinOperation postJoinOp=postJoinOps != null && postJoinOps.length > 0 ? new PostJoinOperation(postJoinOps) : null;
    final int count=members.size() - 1 + setJoins.size();
    final List<Future> calls=new ArrayList<Future>(count);
    for (    MemberInfo member : setJoins) {
      calls.add(invokeClusterOperation(new FinalizeJoinOperation(memberInfos,postJoinOp,time),member.getAddress()));
    }
    for (    MemberImpl member : members) {
      if (!member.getAddress().equals(thisAddress)) {
        calls.add(invokeClusterOperation(new MemberInfoUpdateOperation(memberInfos,time,true),member.getAddress()));
      }
    }
    updateMembers(memberInfos);
    for (    Future future : calls) {
      try {
        future.get(10,TimeUnit.SECONDS);
      }
 catch (      TimeoutException ignored) {
        if (logger.isFinestEnabled()) {
          logger.finest("String_Node_Str" + future);
        }
      }
catch (      Exception e) {
        logger.warning("String_Node_Str",e);
      }
    }
  }
  finally {
    node.getPartitionService().resumeMigration();
    lock.unlock();
  }
}

Fixed version (ground truth):
private void startJoin(){
  logger.finest("String_Node_Str");
  lock.lock();
  try {
    try {
      joinInProgress=true;
      node.getPartitionService().pauseMigration();
      final Collection<MemberImpl> members=getMemberList();
      final Collection<MemberInfo> memberInfos=createMemberInfos(members);
      for (      MemberInfo memberJoining : setJoins) {
        memberInfos.add(memberJoining);
      }
      final long time=getClusterTime();
      final Operation[] postJoinOps=nodeEngine.getPostJoinOperations();
      final PostJoinOperation postJoinOp=postJoinOps != null && postJoinOps.length > 0 ? new PostJoinOperation(postJoinOps) : null;
      final int count=members.size() - 1 + setJoins.size();
      final List<Future> calls=new ArrayList<Future>(count);
      for (      MemberInfo member : setJoins) {
        calls.add(invokeClusterOperation(new FinalizeJoinOperation(memberInfos,postJoinOp,time),member.getAddress()));
      }
      for (      MemberImpl member : members) {
        if (!member.getAddress().equals(thisAddress)) {
          calls.add(invokeClusterOperation(new MemberInfoUpdateOperation(memberInfos,time,true),member.getAddress()));
        }
      }
      updateMembers(memberInfos);
      for (      Future future : calls) {
        try {
          future.get(10,TimeUnit.SECONDS);
        }
 catch (        TimeoutException ignored) {
          if (logger.isFinestEnabled()) {
            logger.finest("String_Node_Str" + future);
          }
        }
catch (        Exception e) {
          logger.warning("String_Node_Str",e);
        }
      }
    }
  finally {
      node.getPartitionService().resumeMigration();
    }
  }
  finally {
    lock.unlock();
  }
}