示例#1
0
static void ConfchgCallback (
	cpg_handle_t handle,
	const struct cpg_name *groupName,
	const struct cpg_address *member_list, size_t member_list_entries,
	const struct cpg_address *left_list, size_t left_list_entries,
	const struct cpg_address *joined_list, size_t joined_list_entries)
{
	int i;

	printf("\nConfchgCallback: group '");
	print_cpgname(groupName);
	printf("'\n");
	for (i=0; i<joined_list_entries; i++) {
		printf("joined %s reason: %d\n",
				node_pid_format(joined_list[i].nodeid, joined_list[i].pid),
				joined_list[i].reason);
	}

	for (i=0; i<left_list_entries; i++) {
		printf("left %s reason: %d\n",
				node_pid_format(left_list[i].nodeid, left_list[i].pid),
				left_list[i].reason);
	}

	printf("nodes in group now %lu\n",
	       (unsigned long int) member_list_entries);
	for (i=0; i<member_list_entries; i++) {
		printf("%s\n",
				node_pid_format(member_list[i].nodeid, member_list[i].pid));
	}

	/* Is it us??
	   NOTE: in reality we should also check the nodeid */
	if (left_list_entries && left_list[0].pid == getpid()) {
		printf("We have left the building\n");
		quit = 1;
	}
}
void ConfchgCallback (
	cpg_handle_t handle,
	struct cpg_name *groupName,
	struct cpg_address *member_list, int member_list_entries,
	struct cpg_address *left_list, int left_list_entries,
	struct cpg_address *joined_list, int joined_list_entries)
{
	int i;
	struct in_addr saddr;

	printf("\nConfchgCallback: group '");
	print_cpgname(groupName);
	printf("'\n");
	for (i=0; i<joined_list_entries; i++) {
		if (show_ip) {
			saddr.s_addr = joined_list[i].nodeid;
			printf("joined node/pid: %s/%d reason: %d\n",
			       inet_ntoa (saddr), joined_list[i].pid,
			       joined_list[i].reason);
		}
		else {
			printf("joined node/pid: %d/%d reason: %d\n",
			       joined_list[i].nodeid, joined_list[i].pid,
			       joined_list[i].reason);
		}
	}

	for (i=0; i<left_list_entries; i++) {
		if (show_ip) {
			saddr.s_addr = left_list[i].nodeid;
			printf("left node/pid: %s/%d reason: %d\n",
			       inet_ntoa (saddr), left_list[i].pid,
			       left_list[i].reason);
		}
		else {
			printf("left node/pid: %d/%d reason: %d\n",
			       left_list[i].nodeid, left_list[i].pid,
			       left_list[i].reason);
		}
	}

	printf("nodes in group now %d\n", member_list_entries);
	for (i=0; i<member_list_entries; i++) {
		if (show_ip) {
			saddr.s_addr = member_list[i].nodeid;
			printf("node/pid: %s/%d\n",
			       inet_ntoa (saddr), member_list[i].pid);
		}
		else {
			printf("node/pid: %d/%d\n",
			       member_list[i].nodeid, member_list[i].pid);
		}
	}

	/* Is it us??
	   NOTE: in reality we should also check the nodeid */
	if (left_list_entries && left_list[0].pid == getpid()) {
		printf("We have left the building\n");
		quit = 1;
	}
}
示例#3
0
static void ConfchgCallback (
	cpg_handle_t handle,
	const struct cpg_name *groupName,
	const struct cpg_address *member_list, size_t member_list_entries,
	const struct cpg_address *left_list, size_t left_list_entries,
	const struct cpg_address *joined_list, size_t joined_list_entries)
{
	unsigned int i;
	int result;
	uint32_t nodeid;

	print_time();
	printf("ConfchgCallback: group '");
	print_cpgname(groupName);
	printf("'\n");
	print_localnodeid(handle);

	for (i=0; i<joined_list_entries; i++) {
		printf("joined %s reason: %d\n",
				node_pid_format(joined_list[i].nodeid, joined_list[i].pid),
				joined_list[i].reason);
	}

	for (i=0; i<left_list_entries; i++) {
		printf("left %s reason: %d\n",
				node_pid_format(left_list[i].nodeid, left_list[i].pid),
				left_list[i].reason);
	}

	printf("nodes in group now %lu\n",
	       (unsigned long int) member_list_entries);
	for (i=0; i<member_list_entries; i++) {
		printf("%s\n",
				node_pid_format(member_list[i].nodeid, member_list[i].pid));
	}

	result = cpg_local_get(handle, &nodeid);
	if(result != CS_OK) {
		printf("failed to get local nodeid %d\n", result);
		nodeid = 0;
	}
	/* Is it us??
	   NOTE: in reality we should also check the nodeid */
	if (left_list_entries && (pid_t)left_list[0].pid == getpid()) {
		printf("We might have left the building pid %d\n", left_list[0].pid);
		/* can only use nodeidStart as a reliable check (version <= 1.4.2) */
		if(nodeidStart) {
			/* report dynamic nature of nodeid returned from local_get */
			/*  local get of nodeid might change identity from original! */
			if(htonl((uint32_t)nodeid) == INADDR_LOOPBACK) {
				printf("We probably left the building switched identity? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
			} else if(htonl((uint32_t)left_list[0].nodeid) == INADDR_LOOPBACK) {
				printf("We probably left the building started alone? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
			}
			/* a possibly reliable way to check is based on original address */
			if(left_list[0].nodeid == nodeidStart) {
				printf("We have left the building direct match start nodeid %d nodeid %d local get current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
				// quit = 1;
				restart = 1;
			} else {
				printf("Probably another node with matching pid start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid);
			}
		}
	}
}