コード例 #1
0
void
saftest_daemon_handle_selection_object_request(
    saftest_map_table_entry_t *map_entry,
    saftest_msg_t *request,
    saftest_msg_t **reply)
{
    clm_session_t *clm_session = NULL;
    SaSelectionObjectT *selection_object = NULL;
    SaAisErrorT status;

    saftest_log("Received a select object get request for id %d\n",
                saftest_msg_get_ubit32_value(request, "CLM_SESSION_ID"));
    clm_session = lookup_clm_session_from_request(request);

    if (0 == strcmp("FALSE",
                    saftest_msg_get_str_value(request,
                                              "NULL_SELECTION_OBJECT"))) {
        selection_object = &clm_session->selection_object;
    }
    status = saClmSelectionObjectGet(clm_session->clm_handle, selection_object);
    (*reply) = saftest_reply_msg_create(request, map_entry->reply_op, status);
}
コード例 #2
0
ファイル: clm_agent.c プロジェクト: tthuanst/testapp
int main(int argc, char* argv[])
{
    /* Use syslog for logging (/var/log/messages) */
    openlog(basename(argv[0]), LOG_PID, LOG_USER);
    
    //setenv("CLMSV_TRACE_PATHNAME","/tmp/clma.log",1); //only work if export before run this program

    SaAisErrorT rc;
    SaClmHandleT clmHandle;
    SaClmCallbacksT_4 clmCallbacks = { 0 };
    SaVersionT version = { 'B', 4, 1 };
    clmCallbacks.saClmClusterTrackCallback = clmClusterTrackCallback;
    rc = saClmInitialize_4(&clmHandle, &clmCallbacks, &version);
    if (rc != SA_AIS_OK) {
            syslog(LOG_ERR,"saClmInitialize_4 FAILED %u", rc);
            return 1;
    }
    SaSelectionObjectT clmFd;
    rc = saClmSelectionObjectGet(clmHandle, &clmFd);
    if (rc != SA_AIS_OK) {
        syslog(LOG_ERR,"saClmSelectionObjectGet FAILED %u", rc);
        return 1;
    }
    int clusterSize = 4;
    size_t sizeOfNotificationBuffer = (clusterSize * sizeof(SaClmClusterNotificationT_4));
    SaClmClusterNotificationBufferT_4 clmlusterNotificationBuffer;
    clmlusterNotificationBuffer.viewNumber = 0;
    clmlusterNotificationBuffer.numberOfItems = clusterSize;

    clmlusterNotificationBuffer.notification = (SaClmClusterNotificationT_4*) calloc(1, sizeOfNotificationBuffer);
    if (clmlusterNotificationBuffer.notification == NULL) {
            syslog(LOG_ERR,"FAILED to allocate resources");
            return 1;
    }
    SaUint8T trackFlags = SA_TRACK_CURRENT | SA_TRACK_CHANGES | SA_TRACK_START_STEP; //SA_TRACK_VALIDATE_STEP is supported with PLM only
    rc = saClmClusterTrack_4(clmHandle, trackFlags, &clmlusterNotificationBuffer);
    if (rc != SA_AIS_OK) {
        syslog(LOG_ERR,"saClmClusterTrack_4 FAILED %u", rc);
        if (rc == SA_AIS_ERR_NO_SPACE) {
            syslog(LOG_ERR,"rc = SA_AIS_ERR_NO_SPACE, numberOfItems = %d", clmlusterNotificationBuffer.numberOfItems);
        }
        free(clmlusterNotificationBuffer.notification);
        clmlusterNotificationBuffer.notification = NULL;
        return 1;
    }

    struct pollfd fds;
    fds.fd = clmFd;
    fds.events = POLLIN;
    while(1){
        int res = poll(&fds, 1, -1);
        if (res == -1) {
            if (errno == EINTR)
                continue;
            else {
                syslog(LOG_ERR,"poll FAILED - %s", strerror(errno));
                return 1;
            }
        }
        if (fds.revents & POLLIN) {
            syslog(LOG_INFO,"========= CLM event ===========");
            rc = saClmDispatch(clmHandle, SA_DISPATCH_ONE);
            if (SA_AIS_OK != rc) {
                    syslog(LOG_ERR,"saClmDispatch FAILED %u", rc);
                    return 1;
            }
        }
    }
}
コード例 #3
0
ファイル: clmtest.c プロジェクト: sipwise/heartbeat
int main(void)
{
	SaSelectionObjectT st;
	SaErrorT ret;
	SaClmNodeIdT nid;

	SaClmCallbacksT my_callbacks = {
		.saClmClusterTrackCallback
		=	(SaClmClusterTrackCallbackT)track_callback,
		.saClmClusterNodeGetCallback
		=	(SaClmClusterNodeGetCallbackT)getnode_callback
	};

	if ((ret = saClmInitialize(&hd, &my_callbacks, NULL)) != SA_OK) {
		fprintf(stderr, "saClmInitialize error, errno [%d]\n",ret);
		return 1;
	}
	if ((ret = saClmSelectionObjectGet(&hd, &st)) != SA_OK) {
		fprintf(stderr, "saClmSelectionObjectGet error, errno [%d]\n"
		,	ret);
		return 1;
	}

	nid = 0;

	/* Synchronously get nodeId information */
	printf("-------------------------------------------------\n");
	printf("Get nodeId [%lu] info by SaClmClusterNodeGet\n", nid);
	if ((ret = saClmClusterNodeGet(nid, 10, &cn)) != SA_OK) {
		if (ret == SA_ERR_INVALID_PARAM) {
			fprintf(stderr, "NodeId [%lu] record not found!\n",nid);
		} else {
			fprintf(stderr
			,	"saClmClusterNodeGet error, errno [%d]\n"
			,	ret);
			return 1;
		}
	} else {
		dump_nodeinfo(&cn);
	}

	/* Asynchronously get my nodeId information */
	nid = 1;
	printf("-------------------------------------------------\n");
	printf("Get nodeId [%lu] info by SaClmClusterNodeGetAsync\n", nid);
	if ((ret = saClmClusterNodeGetAsync(&hd, 1234, nid, &cn)) != SA_OK) {
		if (ret == SA_ERR_INVALID_PARAM) {
			fprintf(stderr, "NodeId [%lu] record not found!\n",nid);
		} else {
			fprintf(stderr
			,	"saClmClusterNodeGet error, errno [%d]\n"
			,	ret);
			return 1;
		}
	}

	/* Start to track cluster membership changes events */
	track_start(SIGUSR1);
	signal(SIGUSR2, &track_stop);

	for (;;) {
		fd_set rset;

		FD_ZERO(&rset);
		FD_SET(st, &rset);

		if (select(st + 1, &rset, NULL, NULL, NULL) == -1) {
			/* TODO should we use pselect here? */
			if (errno == EINTR)
				continue;
			else {
				perror("select");
				return 1;
			}
		}
		if ((ret = saClmDispatch(&hd, SA_DISPATCH_ALL)) != SA_OK) {
			if (ret == SA_ERR_LIBRARY) {
				fprintf(stderr, "I am evicted!\n");
				return 1;
			}
			fprintf(stderr, "saClmDispatch error, errno [%d]\n"
			,	ret);
			return 1;
		}
	}

	return 0;
}