void saClmClusterTrackStop_01(void)
{
        trackFlags = SA_TRACK_CURRENT;
        nodeId = 131343;
        invocation = 600;
        safassert(saClmInitialize(&clmHandle, &clmCallback11, &clmVersion_1), SA_AIS_OK);
        rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
        rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
	rc = saClmClusterNodeGetAsync(clmHandle, invocation, nodeId);
        rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
	rc = saClmClusterNodeGetAsync(clmHandle, invocation, nodeId);
	rc = saClmClusterNodeGetAsync(clmHandle, invocation, nodeId);
        rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
        safassert(saClmClusterTrackStop(clmHandle), SA_AIS_OK);
        safassert(saClmDispatch(clmHandle,SA_DISPATCH_ALL), SA_AIS_OK);
        rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
        safassert(saClmClusterTrackStop(clmHandle), SA_AIS_OK);
        safassert(saClmFinalize(clmHandle), SA_AIS_OK);
        test_validate(rc, SA_AIS_OK);
}
Example #2
0
static void
track_stop(int sig)
{
	int ret;

	signal(SIGUSR2, &track_start);
	fprintf(stderr,	"Stop to Track Cluster Membership\n");
	if ((ret = saClmClusterTrackStop(&hd)) != SA_OK) {
		fprintf(stderr, "saClmClusterTrackStop error, errno [%d]\n"
		,	ret);
		exit(1);
	}
}
void
saftest_daemon_handle_cluster_track_stop_request(
    saftest_map_table_entry_t *map_entry,
    saftest_msg_t *request,
    saftest_msg_t **reply)
{
    clm_session_t *clm_session = NULL;
    SaAisErrorT status;

    saftest_log("Received a cluster track stop request for id %d\n",
                saftest_msg_get_ubit32_value(request, "CLM_SESSION_ID"));
    clm_session = lookup_clm_session_from_request(request);

    status = saClmClusterTrackStop(clm_session->clm_handle);
    (*reply) = saftest_reply_msg_create(request, map_entry->reply_op, status);
}
Example #4
0
static void test_clm_during_cpg_test(void)
{
	SaClmHandleT clmHandle = { 0 };
	SaAisErrorT err;
	SaClmCallbacksT callbacks =
		{
			.saClmClusterNodeGetCallback = _clm_nodeget_callback,
			.saClmClusterTrackCallback = _clm_nodetrack_callback,
		};
	SaVersionT version = { .releaseCode = 'B', .majorVersion = 1, .minorVersion = 1 };
	SaClmClusterNodeT node;
	int status = 0;
	pid_t r;

	while ( (err = saClmInitialize(&clmHandle, &callbacks, &version)) == SA_AIS_ERR_TRY_AGAIN );
	if ( err != SA_AIS_OK )
		DIE("saClmInitialize(): %d", err);

	if ( (err = saClmClusterNodeGet(clmHandle, SA_CLM_LOCAL_NODE_ID, 1000000, &node)) != SA_AIS_OK )
		DIE("saClmNodeGet(): %d", err);

	test_data.node_id = node.nodeId;
	DPRINTF("We are '%.*s', ID: %d", node.nodeName.length, node.nodeName.value, node.nodeId);

	if ( (err = saClmClusterTrack(clmHandle, SA_TRACK_CURRENT | SA_TRACK_CHANGES, NULL)) != SA_AIS_OK )
		DIE("saClmClusterTrack(): %d", err);

	r = 0;
	status = 0;
	/* Note: The man pages of FreeBSD says that waitpid() should return 0 if no process has ended
	 * but I get 1 instead. Weird.
	 * TODO(Jflesch): Figure out what I did wrong.
	 */
	while ( test_data.keep_dispatching && (test_data.test_cpg_pid == -1
			|| ( (r = waitpid(test_data.test_cpg_pid, &status, WNOHANG) != -1)
				&& (r == 0 || r == 1 || (!WIFEXITED(status) && !WIFSIGNALED(status))) ) ) )
	{
		if ( (err = saClmDispatch(clmHandle, SA_DISPATCH_ALL)) != SA_AIS_OK )
			DIE("saClmDispatch(): %d", err);

		if ( test_data.nmb_peers == test_data.max_nmb_peers )
		{
			if ( test_data.master_id != test_data.node_id )
			{
				DPRINTF("Synchronized.");
				/* -> we are a slave, the only thing we have to do is run CPG tests again */
				test_data.keep_dispatching = 0;
				test_data.run_cpg_test = 1;
			}
			else if ( test_data.test_cpg_pid == -1 )
			{
				DPRINTF("Synchronized.");
				test_data.nmb_clm_notifications = 0;
				DPRINTF("(master) Running CPG tests ...");
				test_data.test_cpg_pid = start_cpg_tests(); /* // */
				DPRINTF("(master) CPG tests started");
			}
		}

		usleep(10 * 1000); /* 10ms */
	}

	if ( test_data.keep_dispatching ) /* => end of test */
	{
		if ( test_data.test_cpg_pid < 0 )
			DIE("CPG tests not even started");
		if ( r <= -1 )
			DIE("waitpid() failed: %d, %s", errno, strerror(errno));
		if ( WIFSIGNALED(status) )
			DIE("CPG tests died because of signal %d", WTERMSIG(status));
		if ( WEXITSTATUS(status) != 0 )
			DIE("CPG tests died returning the value %d", WEXITSTATUS(status));
	}

#ifdef BE_NICE
	if ( (err = saClmClusterTrackStop(clmHandle)) != SA_AIS_OK )
		DIE("saClmTrackStop(): %d", err);
#endif

	if ( (err = saClmFinalize(clmHandle)) != SA_AIS_OK )
		DIE("saClmFinalize(): %d", err);

	if ( test_data.nmb_clm_notifications <= 0 )
		DIE("Got no CLM notifications");

	if ( test_data.run_cpg_test )
	{
		DPRINTF("(slave) Running CPG tests ...");
		test_cpg_multiplayer(test_data.max_nmb_peers);
		DPRINTF("(slave) CPG test finished");
	}
}

void test_clm(int nmb_peers)
{
	if ( nmb_peers <= 1 )
		DIE("Not enought peers");

	test_data = TEST_DATA_START_VALUE;
	test_data.max_nmb_peers = nmb_peers;

	DPRINTF("   - Rerun of the CPG multiplayer test, keeping an eye on CLM behavior");
	test_clm_during_cpg_test();
	/* 	DPRINTF("   - Misuse of the API"); ? */
}
void saClmClusterTrackStop_02(void)
{
	rc = saClmClusterTrackStop(clmHandle);
	test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
}