Skip to content

Commit 297eb12

Browse files
committed
add init_node, drop_node, status and nodes functions
1 parent e6095de commit 297eb12

File tree

5 files changed

+275
-67
lines changed

5 files changed

+275
-67
lines changed

Cluster.pm

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -167,26 +167,31 @@ sub configure
167167
sub start
168168
{
169169
my ($self) = @_;
170+
my $node1 = $self->{nodes}->[0];
170171
my $nodes = $self->{nodes};
171172
my $node_id = 1;
172-
173-
my $connstrs = $self->all_connstrs();
174-
$connstrs =~ s/'/''/gms;
173+
my $my_connstr;
174+
my $peers_connstrs = '';
175175

176176
foreach my $node (@$nodes)
177177
{
178178
$node->start();
179-
note( "Starting node with connstr 'port=@{[ $node->port() ]} host=@{[ $node->host() ]}'");
179+
if ($node_id == 1)
180+
{
181+
$my_connstr = $node->connstr($node->{dbname});
182+
}
183+
else
184+
{
185+
$peers_connstrs .= '"' . $node->connstr($node->{dbname}) . '",';
186+
}
187+
$node_id += 1;
180188
}
189+
$peers_connstrs =~ s/.{1}$//gms;
181190

191+
note( "Starting cluster with nodes: |$my_connstr|$peers_connstrs|");
182192
$self->await_nodes( (0..$self->{nodenum}-1) );
183-
184-
foreach my $node (@$nodes)
185-
{
186-
$node->safe_psql($node->{dbname}, "create extension multimaster;");
187-
$node->safe_psql($node->{dbname}, "select mtm.init_node($node_id, '{$connstrs}');");
188-
$node_id = $node_id + 1;
189-
}
193+
$node1->safe_psql($node1->{dbname}, "create extension multimaster;");
194+
$node1->safe_psql($node1->{dbname}, "select mtm.init_cluster(\$\$$my_connstr\$\$, \$\${$peers_connstrs}\$\$);");
190195
}
191196

192197
sub stopnode

multimaster--1.0.sql

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ LANGUAGE C;
2121
--- functions.
2222
---
2323

24-
CREATE TABLE mtm.nodes(
24+
CREATE TABLE mtm.cluster_nodes(
2525
id int primary key not null,
2626
conninfo text not null,
2727
is_self bool not null,
@@ -34,7 +34,7 @@ AS 'MODULE_PATHNAME','mtm_after_node_create'
3434
LANGUAGE C;
3535

3636
CREATE TRIGGER on_node_create
37-
AFTER INSERT ON mtm.nodes
37+
AFTER INSERT ON mtm.cluster_nodes
3838
FOR EACH ROW
3939
EXECUTE FUNCTION mtm.after_node_create();
4040

@@ -44,59 +44,77 @@ AS 'MODULE_PATHNAME','mtm_after_node_drop'
4444
LANGUAGE C;
4545

4646
CREATE TRIGGER on_node_drop
47-
AFTER DELETE ON mtm.nodes
47+
AFTER DELETE ON mtm.cluster_nodes
4848
FOR EACH ROW
4949
EXECUTE FUNCTION mtm.after_node_drop();
5050

51-
CREATE FUNCTION mtm.join_node(node_id int)
52-
RETURNS VOID
53-
AS 'MODULE_PATHNAME','mtm_join_node'
51+
CREATE FUNCTION mtm.node_info(id int)
52+
RETURNS mtm.node_info
53+
AS 'MODULE_PATHNAME','mtm_node_info'
5454
LANGUAGE C;
5555

56+
CREATE TYPE mtm.node_info AS (
57+
"enabled" bool,
58+
"connected" bool,
59+
"sender_pid" int,
60+
"receiver_pid" int,
61+
"n_workers" int,
62+
"receiver_status" text
63+
);
64+
5665
---
57-
--- User facing API for node management.
66+
--- User facing API for node info and management.
5867
---
5968

60-
CREATE OR REPLACE FUNCTION mtm.init_node(node_id integer, connstrs text[]) RETURNS void AS
61-
$$
62-
BEGIN
63-
IF node_id <= 0 OR node_id > least(16, array_length(connstrs, 1)) THEN
64-
RAISE EXCEPTION 'node_id should be in range [1 .. length(connstrs)]';
65-
END IF;
66-
-- XXX
67-
EXECUTE 'SET mtm.emerging_node_id = ' || node_id || ';';
68-
INSERT INTO mtm.nodes SELECT
69-
ordinality::int as id,
70-
unnest as conninfo,
71-
ordinality = current_setting('mtm.emerging_node_id')::int as is_self
72-
FROM
73-
unnest(connstrs)
74-
WITH ORDINALITY;
75-
END
76-
$$
77-
LANGUAGE plpgsql;
69+
CREATE OR REPLACE FUNCTION mtm.init_cluster(my_conninfo text, peers_conninfo text[])
70+
RETURNS VOID
71+
AS 'MODULE_PATHNAME','mtm_init_cluster'
72+
LANGUAGE C;
73+
74+
CREATE TYPE mtm.cluster_status AS (
75+
"my_node_id" int,
76+
"status" text,
77+
"n_nodes" int,
78+
"n_connected" int,
79+
"n_enabled" int
80+
);
81+
82+
CREATE FUNCTION mtm.status()
83+
RETURNS mtm.cluster_status
84+
AS 'MODULE_PATHNAME','mtm_status'
85+
LANGUAGE C;
86+
87+
CREATE VIEW mtm.nodes AS
88+
SELECT id, conninfo, is_self, (mtm.node_info(id)).* FROM mtm.cluster_nodes;
7889

7990
CREATE OR REPLACE FUNCTION mtm.add_node(connstr text) RETURNS void AS
8091
$$
8192
DECLARE
8293
new_node_id int;
8394
BEGIN
84-
-- XXX: add only to a configured mm?
85-
86-
INSERT INTO mtm.nodes SELECT
87-
min(unused_ids.id), connstr, 'false'
95+
INSERT INTO mtm.cluster_nodes SELECT
96+
min(unused_ids.id), connstr, 'false', 'false'
8897
FROM (
8998
SELECT id FROM generate_series(1,16) id
9099
EXCEPT
91-
SELECT id FROM mtm.nodes
100+
SELECT id FROM mtm.cluster_nodes
92101
) unused_ids
93102
RETURNING id INTO new_node_id;
94-
95-
-- SELECT mtm.node_join(new_node_id, connstr);
96103
END
97104
$$
98105
LANGUAGE plpgsql;
99106

107+
CREATE OR REPLACE FUNCTION mtm.drop_node(node_id int) RETURNS void AS
108+
$$
109+
DELETE FROM mtm.cluster_nodes WHERE id = $1;
110+
$$
111+
LANGUAGE sql;
112+
113+
CREATE FUNCTION mtm.join_node(node_id int)
114+
RETURNS VOID
115+
AS 'MODULE_PATHNAME','mtm_join_node'
116+
LANGUAGE C;
117+
100118
---
101119
--- Various
102120
---

src/include/multimaster.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,36 @@ typedef uint64 nodemask_t;
5454

5555

5656
/*
57-
* Definitions for the "mtm.nodes" table.
57+
* Definitions for the "mtm.cluster_nodes" table.
5858
*/
59-
#define MTM_NODES "mtm.nodes"
60-
#define Natts_mtm_nodes 3
59+
#define MTM_NODES "mtm.cluster_nodes"
60+
#define Natts_mtm_nodes 4
6161
#define Anum_mtm_nodes_id 1 /* node_id, same accross cluster */
6262
#define Anum_mtm_nodes_connifo 2 /* connection string */
6363
#define Anum_mtm_nodes_is_self 3 /* is that tuple for our node? */
6464
#define Anum_mtm_nodes_init_done 4 /* did monitor already create slots? */
6565

66+
/*
67+
* Definitions for the "mtm.cluster_status" type.
68+
*/
69+
#define Natts_mtm_status 5
70+
#define Anum_mtm_status_node_id 1
71+
#define Anum_mtm_status_status 2
72+
#define Anum_mtm_status_n_nodes 3
73+
#define Anum_mtm_status_n_connected 4
74+
#define Anum_mtm_status_n_enabled 5
75+
76+
/*
77+
* Definitions for the "mtm.node_info" type.
78+
*/
79+
#define Natts_mtm_node_info 6
80+
#define Anum_mtm_node_info_enabled 1
81+
#define Anum_mtm_node_info_connected 2
82+
#define Anum_mtm_node_info_sender_pid 3
83+
#define Anum_mtm_node_info_receiver_pid 4
84+
#define Anum_mtm_node_info_n_workers 5
85+
#define Anum_mtm_node_info_receiver_status 6
86+
6687

6788
/* Identifier of global transaction */
6889
typedef struct

0 commit comments

Comments
 (0)