public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: master - cman: Add missing new libcman.h
@ 2009-01-08  8:49 Christine Caulfield
  0 siblings, 0 replies; only message in thread
From: Christine Caulfield @ 2009-01-08  8:49 UTC (permalink / raw)
  To: cluster-cvs-relay

Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=d93b636fded43196b9da257ae6bbfa67c42ea162
Commit:        d93b636fded43196b9da257ae6bbfa67c42ea162
Parent:        e4b32ad9fd4354f7a2015666ef182bf0ce76c343
Author:        Christine Caulfield <ccaulfie@redhat.com>
AuthorDate:    Thu Jan 8 08:48:12 2009 +0000
Committer:     Christine Caulfield <ccaulfie@redhat.com>
CommitterDate: Thu Jan 8 08:48:12 2009 +0000

cman: Add missing new libcman.h

Sorry for the confusion.

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
---
 cman/services/cman/lib/libcman.h |  423 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 423 insertions(+), 0 deletions(-)

diff --git a/cman/services/cman/lib/libcman.h b/cman/services/cman/lib/libcman.h
new file mode 100644
index 0000000..f746629
--- /dev/null
+++ b/cman/services/cman/lib/libcman.h
@@ -0,0 +1,423 @@
+#ifndef _LIBCMAN_H_
+#define _LIBCMAN_H_
+
+#include <netinet/in.h>
+
+#define LIBCMAN_VERSION 3
+
+/*
+ * Some maxima
+ */
+#define CMAN_MAX_ADDR_LEN             sizeof(struct sockaddr_in6)
+#define CMAN_MAX_NODENAME_LEN         255
+#define MAX_CLUSTER_NAME_LEN           16
+#define CMAN_MAX_FENCE_AGENT_NAME_LEN 255
+
+/*
+ * Pass this into cman_get_node() as the nodeid to get local node information
+ */
+#define CMAN_NODEID_US     0
+
+/*
+ * Pass this into cman_get_node() as the nodeid to get quorum device information
+ */
+#define CMAN_NODEID_QDISK -1
+
+
+/* Pass this into cman_send_data to send a message to all nodes */
+#define CMAN_NODEID_ALL 0
+
+/*
+ * Hang onto this, it's your key into the library. get one from cman_init() or
+ * cman_admin_init()
+ */
+typedef void *cman_handle_t;
+
+/*
+ * Reasons we get an event callback.
+ * PORTOPENED & TRY_SHUTDOWN only exist when LIBCMAN_VERSION >= 2
+ *
+ * The 'arg' parameter varies depending on the callback type.
+ * for PORTCLOSED/PORTOPENED  arg == the port opened/closed
+ * for STATECHANGE            arg is quorum state (1=quorate, 0=not)
+ * for TRY_SHUTDOWN           arg == 1 for ANYWAY, otherwise 0 (ie if arg == 1 
+ * 			      then cman WILL shutdown regardless
+ *                            of your response, think of this as advance warning)
+ * for CONFIG_UPDATE          arg will be the new config version
+ */
+typedef enum {CMAN_REASON_PORTCLOSED,
+	      CMAN_REASON_STATECHANGE,
+              CMAN_REASON_PORTOPENED,
+              CMAN_REASON_TRY_SHUTDOWN,
+              CMAN_REASON_CONFIG_UPDATE} cman_call_reason_t;
+
+/*
+ * Reason flags for cman_leave
+ */
+#define CMAN_LEAVEFLAG_DOWN    0
+#define CMAN_LEAVEFLAG_REMOVED 3
+#define CMAN_LEAVEFLAG_FORCE   0x10
+
+/*
+ * Flags for cman_shutdown
+ *    ANYWAY   -  cman will shutdown regardless of clients' responses (but they
+ *    		   will still get told)
+ *    REMOVED  -  the rest of the cluster will adjust quorum to stay quorate
+ */
+#define CMAN_SHUTDOWN_ANYWAY   1
+#define CMAN_SHUTDOWN_REMOVED  2
+
+/*
+ * Flags passed to cman_dispatch():
+ * CMAN_DISPATCH_ONE dispatches a single message then returns,
+ * CMAN_DISPATCH_ALL dispatches all outstanding messages (ie till EAGAIN) then 
+ *                   returns,
+ * CMAN_DISPATCH_BLOCKING forces it to wait for a message (clears MSG_DONTWAIT 
+ * 			  in recvmsg)
+ * CMAN_DISPATCH_IGNORE_* allows the caller to select which messages to process.
+ */
+#define CMAN_DISPATCH_ONE           0
+#define CMAN_DISPATCH_ALL           1
+#define CMAN_DISPATCH_BLOCKING      2
+#define CMAN_DISPATCH_IGNORE_REPLY  4
+#define CMAN_DISPATCH_IGNORE_DATA   8
+#define CMAN_DISPATCH_IGNORE_EVENT 16
+#define CMAN_DISPATCH_TYPE_MASK     3
+#define CMAN_DISPATCH_IGNORE_MASK  46
+
+/*
+ * A node address. This is a complete sockaddr_in[6]
+ * To explain:
+ *  If you cast cna_address to a 'struct sockaddr', the sa_family field
+ *  will be AF_INET or AF_INET6. Armed with that knowledge you can then
+ *  cast it to a sockaddr_in or sockaddr_in6 and pull out the address.
+ *  No other sockaddr fields are valid.
+ *  Also, you must ignore any part of the sockaddr beyond the length supplied
+ */
+typedef struct cman_node_address
+{
+	int  cna_addrlen;
+	char cna_address[CMAN_MAX_ADDR_LEN];
+} cman_node_address_t;
+
+/*
+ * Return from cman_get_node()
+ */
+typedef struct cman_node
+{
+	int cn_nodeid;
+	cman_node_address_t cn_address;
+	char cn_name[CMAN_MAX_NODENAME_LEN+1];
+	int cn_member;
+	int cn_incarnation;
+	struct timeval cn_jointime;
+} cman_node_t;
+
+/*
+ * Returned from cman_get_version(),
+ * input to cman_set_version(), though only cv_config can be changed
+ */
+typedef struct cman_version
+{
+	unsigned int cv_major;
+	unsigned int cv_minor;
+	unsigned int cv_patch;
+	unsigned int cv_config;
+} cman_version_t;
+
+/*
+ * Return from cman_get_cluster()
+ */
+typedef struct cman_cluster
+{
+	char     ci_name[MAX_CLUSTER_NAME_LEN+1];
+	uint16_t ci_number;
+	uint32_t ci_generation;
+} cman_cluster_t;
+
+/*
+ * This is returned from cman_get_extra_info - it's really
+ * only for use by cman_tool, don't depend on this not changing
+ */
+
+/* Flags in ei_flags
+   NOTE: These have changed from Cluster2/3! */
+#define CMAN_EXTRA_FLAG_DIRTY      1
+#define CMAN_EXTRA_FLAG_DISALLOWED 2
+#define CMAN_EXTRA_FLAG_2NODE      4
+#define CMAN_EXTRA_FLAG_QUORATE    8
+
+typedef struct cman_extra_info {
+	int           ei_node_state;
+	int           ei_flags;
+	int           ei_node_votes;
+	int           ei_total_votes;
+	int           ei_expected_votes;
+	int           ei_quorum;
+	int           ei_members;
+	char          ei_ports[32];
+	int           ei_num_addresses;
+	char          ei_addresses[1]; /* Array of num_addresses*sockaddr_storage*2
+					  First batch is the multicast address list */
+} cman_extra_info_t;
+
+/* Quorum device info, returned from cman_get_quorum_device() */
+typedef struct cman_qdev_info {
+	char qi_name[CMAN_MAX_NODENAME_LEN+1];
+	int  qi_state;
+	int  qi_votes;
+} cman_qdev_info_t;
+
+/*
+ * NOTE: Apart from cman_replyto_shutdown(), you must not
+ * call other cman_* functions while in these two callbacks:
+ */
+
+/* Callback routine for a membership or other event */
+typedef void (*cman_callback_t)(cman_handle_t handle, void *privdata, int reason, int arg);
+
+/* Callback routine for data received */
+typedef void (*cman_datacallback_t)(cman_handle_t handle, void *privdata,
+				    char *buf, int len, uint8_t port, int nodeid);
+
+/* Callback for nodes joining/leaving */
+typedef void (*cman_confchgcallback_t)(cman_handle_t handle, void *privdata,
+				       unsigned int *member_list, int member_list_entries,
+				       unsigned int *left_list, int left_list_entries,
+				       unsigned int *joined_list, int joined_list_entries);
+
+/*
+ * cman_init        returns the handle you need to pass to the other API calls.
+ * cman_admin_init  opens admin socket for privileged operations.
+ * cman_finish      destroys that handle.
+ *
+ * Note that admin sockets can't send data messages or receive callbacks.
+ */
+cman_handle_t cman_init(void *privdata);
+cman_handle_t cman_admin_init(void *privdata);
+int cman_finish(cman_handle_t handle);
+
+/* Update/retrieve the private data */
+int cman_setprivdata(cman_handle_t h, void *privdata);
+int cman_getprivdata(cman_handle_t h, void **privdata);
+
+/*
+ * Notification of membership change events. Note that these are sent after
+ * a transition, so multiple nodes may have left or joined the cluster.
+ */
+int cman_start_notification(cman_handle_t handle, cman_callback_t callback);
+int cman_stop_notification(cman_handle_t handle);
+
+/*
+ * Start/stop AIS-style confchg callbacks. These are less racy than the
+ * old cman callbacks in that the caller will get one for each AIS
+ * confchg message and it will contain all of the nodes that joined &
+ * left in that transition.
+ */
+int cman_start_confchg(cman_handle_t handle, cman_confchgcallback_t callback);
+int cman_stop_confchg(cman_handle_t handle);
+
+/* Call this if you get a TRY_SHUTDOWN event to signal whether you
+ * will let cman shutdown or not.
+ * Note that getting this callback does not mean that cman WILL shutdown,
+ * only that it might. To detect a cman shutdown see cman_dispatch() below.
+ */
+int cman_replyto_shutdown(cman_handle_t, int yesno);
+
+
+/*
+ * Get the internal CMAN fd so you can pass it into poll() or select().
+ * When it's active then call cman_dispatch() on the handle to process the event
+ * NOTE: This fd can change between calls to cman_dispatch() so always call this
+ * routine to get the latest one. (This is mainly due to message caching).
+ * One upshot of this is that you must never read or write this FD (it may on 
+ * occasion point to /dev/zero if you have messages cached!)
+ */
+int cman_get_fd(cman_handle_t handle);
+
+/*
+ * cman_dispatch() will return -1 with errno == EHOSTDOWN if the cluster is
+ * shut down, 0 if nothing was read, or a positive number if something was 
+ * dispatched.
+ */
+
+int cman_dispatch(cman_handle_t handle, int flags);
+
+
+/*
+ * -----------------------------------------------------------------------------
+ * Get info calls.
+ */
+
+/* Return the number of nodes we know about. This will normally
+ *  be the number of nodes in CCS 
+ */
+int cman_get_node_count(cman_handle_t handle);
+
+/* Returns the number of connected clients. This isn't as useful as a it used to
+ * be as a count >1 does not automatically mean cman won't shut down. Subsystems
+ * can decide for themselves whether a clean shutdown is possible. 
+ */
+int cman_get_subsys_count(cman_handle_t handle);
+
+/* Returns an array of node info structures. Call cman_get_node_count() first
+ * to determine how big your array needs to be 
+ */
+int cman_get_nodes(cman_handle_t handle, int maxnodes, int *retnodes, cman_node_t *nodes);
+
+/* Returns a list of nodes that are known to AIS but blocked from joining the
+ * CMAN cluster because they rejoined with cluster without a cman_tool join 
+ */
+int cman_get_disallowed_nodes(cman_handle_t handle, int maxnodes, int *retnodes, cman_node_t *nodes);
+
+/*
+ * cman_get_node() can get node info by nodeid OR by name. If the first
+ * char of node->cn_name is zero then the nodeid will be used, otherwise
+ * the name will be used. I'll say this differently: If you want to look
+ * up a node by nodeid, you MUST clear out the cman_node_t structure passed
+ * into cman_get_node(). nodeid can be CMAN_NODEID_US.
+ */
+int cman_get_node(cman_handle_t handle, int nodeid, cman_node_t *node);
+
+/* cman_get_node() only returns the first address of a node (whatever /that/
+ * may mean). If you want to know all of them you need to call this.
+ * max_addrs is the size of the 'addrs' array. num_addrs will be filled in by 
+ * the number of addresses the node has, regardless of the size of max_addrs. 
+ * So if you don't allocate enough space for the first call, you should know how
+ * much is needed for a second!
+ */
+int cman_get_node_addrs(cman_handle_t handle, int nodeid, int max_addrs, int *num_addrs, struct cman_node_address *addrs);
+
+/* Returns 1 if cman has completed initialisation and aisexec is running */
+int cman_is_active(cman_handle_t handle);
+
+/*
+ * Returns 1 if a client is registered for data callbacks on a particular
+ * port on a particular node. if cman returns -1 (errno==EBUSY) then it
+ * doesn't currently know the status but has requested it, so try again
+ * later or wait for a PORTOPENED notification.
+ * nodeid can be CMAN_NODEID_US
+ */
+int cman_is_listening(cman_handle_t handle, int nodeid, uint8_t port);
+
+/* Do we have quorum? */
+int cman_is_quorate(cman_handle_t handle);
+
+/* Return software & config (cluster.conf file) version */
+int cman_get_version(cman_handle_t handle, cman_version_t *version);
+
+/* Get cluster name and number */
+int cman_get_cluster(cman_handle_t handle, cman_cluster_t *clinfo);
+
+/* Get fence information for a node.
+ * 'int *fenced' is only valid if the node is down, it is set to
+ * 1 if the node has been fenced since it left the cluster.
+ * agent should be CMAN_MAX_FENCE_AGENT_NAME_LEN
+ */
+int cman_get_fenceinfo(cman_handle_t handle, int nodeid, uint64_t *fence_time, int *fenced, char *agent);
+
+/* Get stuff for cman_tool. Nobody else should use this */
+int cman_get_extra_info(cman_handle_t handle, cman_extra_info_t *info, int maxlen);
+
+/* Dump the objdb contents (only works if compiled with DEBUG enabled) */
+int cman_dump_objdb(cman_handle_t handle, char *filename);
+
+/*
+ * -----------------------------------------------------------------------------
+ * Admin functions. You will need privileges and have a handle created by 
+ * cman_admin_init() to use them.
+ */
+
+/* Change the config file version. This should be needed much less now, as 
+ * cman will re-read the config file if a new node joins with a new config 
+ * version */
+int cman_set_version(cman_handle_t handle, const cman_version_t *version);
+
+/* Deprecated in favour of cman_shutdown(). Use cman_tool anyway please. */
+int cman_leave_cluster(cman_handle_t handle, int reason);
+
+/* Change the number of votes for this node. NOTE: a CCS update will
+   overwrite this, so make sure you change both. Or, better, change CCS
+   and call set_version() */
+int cman_set_votes(cman_handle_t handle, int votes, int nodeid);
+
+/* As above, for expected_votes */
+int cman_set_expected_votes(cman_handle_t handle, int expected_votes);
+
+/* Tell a particular node to leave the cluster NOW */
+int cman_kill_node(cman_handle_t handle, int nodeid);
+
+/* Tell CMAN a node has been fenced, when and by what means. */
+int cman_node_fenced(cman_handle_t handle, int nodeid, uint64_t fence_time, char *agent);
+
+/*
+ * cman_shutdown() will send a REASON_TRY_SHUTDOWN event to all
+ * clients registered for notifications. They should respond by calling
+ * cman_replyto_shutdown() to indicate whether they will allow
+ * cman to close down or not. If cman gets >=1 "no" (0) replies or the
+ * request times out (default 5 seconds) then shutdown will be
+ * cancelled and cman_shutdown() will return -1 with errno == EBUSY.
+ *
+ * Set flags to CMAN_SHUTDOWN_ANYWAY to force shutdown. Clients will still
+ * be notified /and/ they will know you want a forced shutdown.
+ *
+ * Setting flags to CMAN_SHUTDOWN_REMOVED will tell the rest of the
+ * cluster to adjust quorum to keep running with this node has left
+ */
+int cman_shutdown(cman_handle_t, int flags);
+
+/* -----------------------------------------------------------------------------
+ * Data transmission API. Uses the same FD as the rest of the calls.
+ * If the nodeid passed to cman_send_data() is zero then it will be
+ * broadcast to all nodes in the cluster.
+ * cman_start_recv_data() is like a bind(), and marks the port
+ * as "listening". See cman_is_listening() above.
+ */
+int cman_send_data(cman_handle_t handle, const void *buf, int len, int flags, uint8_t port, int nodeid);
+int cman_start_recv_data(cman_handle_t handle, cman_datacallback_t, uint8_t port);
+int cman_end_recv_data(cman_handle_t handle);
+
+/*
+ * Barrier API.
+ * Here for backwards compatibility. Most of the things you would achieve
+ * with this can now be better done using openAIS services or just messaging.
+ */
+int cman_barrier_register(cman_handle_t handle, const char *name, int flags, int nodes);
+int cman_barrier_change(cman_handle_t handle, const char *name, int flags, int arg);
+int cman_barrier_wait(cman_handle_t handle, const char *name);
+int cman_barrier_delete(cman_handle_t handle, const char *name);
+
+/*
+ * Add your own quorum device here, needs an admin socket
+ *
+ * After creating a quorum device you will need to call 'poll_quorum_device'
+ * at least once every (default) 10 seconds (this can be changed in CCS)
+ * otherwise it will time-out and the cluster will lose its vote.
+ */
+int cman_register_quorum_device(cman_handle_t handle, char *name, int votes);
+int cman_unregister_quorum_device(cman_handle_t handle);
+int cman_poll_quorum_device(cman_handle_t handle, int isavailable);
+int cman_get_quorum_device(cman_handle_t handle, struct cman_qdev_info *info);
+
+/*
+ * Sets the dirty bit inside cman. This indicates that the node has
+ * some internal 'state' (eg in a daemon, filesystem or lock manager)
+ * and cannot merge with another cluster that already has state.
+ * This needs an admin socket. It cannot be reset. 
+ */
+int cman_set_dirty(cman_handle_t handle);
+
+
+/*
+ * Changes the debug logging level inside cman.
+ * subsystems is a bitmask of:
+ */
+#define CMAN_DEBUGLOG_NONE       0
+#define CMAN_DEBUGLOG_BARRIER    2
+#define CMAN_DEBUGLOG_MEMBERSHIP 4
+#define CMAN_DEBUGLOG_DAEMON     8
+#define CMAN_DEBUGLOG_AIS       16
+
+int cman_set_debuglog(cman_handle_t handle, int subsystems);
+
+#endif


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-01-08  8:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-08  8:49 cluster: master - cman: Add missing new libcman.h Christine Caulfield

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).