summaryrefslogtreecommitdiffstats
path: root/source3/include/ctdbd_conn.h
blob: 0618d07b9a84ebf5739da37de3410a6135d3d236 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/* 
   Unix SMB/CIFS implementation.
   Samba3 ctdb connection handling
   Copyright (C) Volker Lendecke 2007

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _CTDBD_CONN_H
#define _CTDBD_CONN_H

#include "replace.h"
#include "system/filesys.h"
#include "system/network.h"
#include "lib/dbwrap/dbwrap.h"
#include <tdb.h>
#include <tevent.h>

struct ctdbd_connection;
struct messaging_context;
struct messaging_rec;

int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
			  const char *sockname, int timeout,
			  struct ctdbd_connection **pconn);
int ctdbd_init_async_connection(
	TALLOC_CTX *mem_ctx,
	const char *sockname,
	int timeout,
	struct ctdbd_connection **pconn);
int ctdbd_reinit_connection(TALLOC_CTX *mem_ctx,
			    const char *sockname, int timeout,
			    struct ctdbd_connection *conn);

uint32_t ctdbd_vnn(const struct ctdbd_connection *conn);

int ctdbd_conn_get_fd(struct ctdbd_connection *conn);
void ctdbd_socket_readable(struct tevent_context *ev,
			   struct ctdbd_connection *conn);

int ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
			     uint32_t dst_vnn, uint64_t dst_srvid,
			     const struct iovec *iov, int iovlen);

bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32_t vnn,
			  pid_t pid, uint64_t unique_id);

char *ctdbd_dbpath(struct ctdbd_connection *conn,
		   TALLOC_CTX *mem_ctx, uint32_t db_id);

int ctdbd_db_attach(struct ctdbd_connection *conn, const char *name,
		    uint32_t *db_id, bool persistent);

int ctdbd_migrate(struct ctdbd_connection *conn, uint32_t db_id, TDB_DATA key);

int ctdbd_parse(struct ctdbd_connection *conn, uint32_t db_id,
		TDB_DATA key, bool local_copy,
		void (*parser)(TDB_DATA key, TDB_DATA data,
			       void *private_data),
		void *private_data);

int ctdbd_traverse(struct ctdbd_connection *master, uint32_t db_id,
		   void (*fn)(TDB_DATA key, TDB_DATA data,
			      void *private_data),
		   void *private_data);

int ctdbd_register_ips(struct ctdbd_connection *conn,
		       const struct sockaddr_storage *server,
		       const struct sockaddr_storage *client,
		       int (*cb)(struct tevent_context *ev,
				 uint32_t src_vnn, uint32_t dst_vnn,
				 uint64_t dst_srvid,
				 const uint8_t *msg, size_t msglen,
				 void *private_data),
		       void *private_data);
void ctdbd_unregister_ips(struct ctdbd_connection *conn,
			  const struct sockaddr_storage *_server,
			  const struct sockaddr_storage *_client,
			  int (*cb)(struct tevent_context *ev,
				    uint32_t src_vnn,
				    uint32_t dst_vnn,
				    uint64_t dst_srvid,
				    const uint8_t *msg,
				    size_t msglen,
				    void *private_data),
			  void *private_data);
void ctdbd_passed_ips(struct ctdbd_connection *conn,
		      const struct sockaddr_storage *_server,
		      const struct sockaddr_storage *_client,
		      int (*cb)(struct tevent_context *ev,
				uint32_t src_vnn,
				uint32_t dst_vnn,
				uint64_t dst_srvid,
				const uint8_t *msg,
				size_t msglen,
				void *private_data),
		      void *private_data);

/*
 * call @cb for each public IP. If @cb returns non-zero, then break the loop
 * and propagate the return value upwards.
 * @returns: 0 on success, where all @cb invocations also returned zero
 *	     ENOMEM on memory allocation failure
 *	     EIO on ctdbd connection failure
 *	     @cb() return value if non-zero
 */
int ctdbd_public_ip_foreach(struct ctdbd_connection *conn,
			    int (*cb)(uint32_t total_ip_count,
				      const struct sockaddr_storage *ip,
				      bool is_movable_ip,
				      void *private_data),
			    void *private_data);
int ctdbd_all_ip_foreach(struct ctdbd_connection *conn,
			 bool include_node_ips,
			 bool include_public_ips,
			 int (*cb)(uint32_t total_ip_count,
				   const struct sockaddr_storage *ip,
				   uint32_t pinned_pnn,
				   uint32_t current_pnn,
				   void *private_data),
			 void *private_data);

int ctdbd_control_local(struct ctdbd_connection *conn, uint32_t opcode,
			uint64_t srvid, uint32_t flags, TDB_DATA data,
			TALLOC_CTX *mem_ctx, TDB_DATA *outdata,
			int32_t *cstatus);
int ctdb_watch_us(struct ctdbd_connection *conn);
int ctdb_unwatch(struct ctdbd_connection *conn);

struct ctdb_req_message_old;

int register_with_ctdbd(struct ctdbd_connection *conn, uint64_t srvid,
			int (*cb)(struct tevent_context *ev,
				  uint32_t src_vnn, uint32_t dst_vnn,
				  uint64_t dst_srvid,
				  const uint8_t *msg, size_t msglen,
				  void *private_data),
			void *private_data);
void deregister_from_ctdbd(struct ctdbd_connection *conn,
			   uint64_t srvid,
			   int (*cb)(struct tevent_context *ev,
				     uint32_t src_vnn,
				     uint32_t dst_vnn,
				     uint64_t dst_srvid,
				     const uint8_t *msg,
				     size_t msglen,
				     void *private_data),
			   void *private_data);
int ctdbd_probe(const char *sockname, int timeout);

struct ctdb_req_header;
void ctdbd_prep_hdr_next_reqid(
	struct ctdbd_connection *conn, struct ctdb_req_header *hdr);

/*
 * Async ctdb_request. iov[0] must start with an initialized
 * struct ctdb_req_header
 */
struct tevent_req *ctdbd_req_send(
	TALLOC_CTX *mem_ctx,
	struct tevent_context *ev,
	struct ctdbd_connection *conn,
	struct iovec *iov,
	size_t num_iov);
int ctdbd_req_recv(
	struct tevent_req *req,
	TALLOC_CTX *mem_ctx,
	struct ctdb_req_header **reply);

struct tevent_req *ctdbd_parse_send(TALLOC_CTX *mem_ctx,
				    struct tevent_context *ev,
				    struct ctdbd_connection *conn,
				    uint32_t db_id,
				    TDB_DATA key,
				    bool local_copy,
				    void (*parser)(TDB_DATA key,
						   TDB_DATA data,
						   void *private_data),
				    void *private_data,
				    enum dbwrap_req_state *req_state);
int ctdbd_parse_recv(struct tevent_req *req);

#endif /* _CTDBD_CONN_H */