Merge lp:~negronjl/charms/precise/zookeeper/trunk into lp:charms/zookeeper

Proposed by Juan L. Negron
Status: Merged
Merged at revision: 8
Proposed branch: lp:~negronjl/charms/precise/zookeeper/trunk
Merge into: lp:charms/zookeeper
Diff against target: 177 lines (+97/-8)
2 files modified
config.yaml (+16/-0)
hooks/zookeeper-common (+81/-8)
To merge this branch: bzr merge lp:~negronjl/charms/precise/zookeeper/trunk
Reviewer Review Type Date Requested Status
James Page Needs Fixing
Review via email: mp+132992@code.launchpad.net

Description of the change

Added config option to be able to include an external zookeeper into the quorum.
Added weight and group directives in zoo.cfg for better integration and control of leader.

-Juan

To post a comment you must log in.
Revision history for this message
James Page (james-page) wrote :

Hi Juan

Had a quick review and test - couple of issues:

1) Line 49: + default_group=`config-get default_weight`

Incorrect - should pick the default_group config - as a result generated wacky config and charms fail to upgrade.

2) config-changed hook

Fails - missing symlink to zookeeper-common

3) existing peers/quorum.

I tested this by deploying a zookeeper cluster of three nodes (which formed correctly) and then setting the external server - at which point all three existing unit lost track of each other.

configure_zookeeper is purging all server.* entries from the file - but not then re-adding them based on members of the peer relation.

Cheers

James

review: Needs Fixing
Revision history for this message
Juan L. Negron (negronjl) wrote :

Hi James:

Thanks for the review ... I have fixed the issues mentioned in the review ... would you mind reviewing this again ( latest revision atm is revno: 9 ).

Thanks,

Juan

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'config.yaml'
2--- config.yaml 2012-02-14 12:21:25 +0000
3+++ config.yaml 2012-11-21 21:47:21 +0000
4@@ -21,3 +21,19 @@
5 The packages provides in the hadoop-ubuntu team PPA's are based
6 directly on upstream ZooKeeper releases but are not fully built from
7 source.
8+ default_weight:
9+ type: int
10+ default: 1
11+ description: default weight
12+ default_group:
13+ type: int
14+ default: 0
15+ description: default group
16+ external_server:
17+ type: string
18+ default: ""
19+ description: |
20+ Extra servers ( external to juju ) to add
21+ to zoo.cnf. Format should be id:group:weight:host:port:port
22+ group can be defined as "default" as opposed to a number to use
23+ the default_group defined above
24
25=== modified file 'hooks/zookeeper-common'
26--- hooks/zookeeper-common 2012-02-20 14:00:16 +0000
27+++ hooks/zookeeper-common 2012-11-21 21:47:21 +0000
28@@ -1,6 +1,6 @@
29 #!/bin/bash
30
31-set -e
32+set -eux
33
34 # By default we install from the main Ubuntu archive.
35 source=`config-get source`
36@@ -55,16 +55,21 @@
37
38 configure_zookeeper () {
39 juju-log "Purging any standalone configuration..."
40- # This is found in the bigtop default configuration
41- sed -i "/^server.0/d" $zk_conf
42+ # Purge
43+ sed -i "/^server./d" $zk_conf
44+ sed -i "/^weight./d" $zk_conf
45+ sed -i "/^group./d" $zk_conf
46 juju-log "Generating unique ID for this instance..."
47 unit_no=`echo $JUJU_UNIT_NAME | cut -d / -f 2`
48+ default_weight=`config-get default_weight`
49+ default_group=`config-get default_group`
50 echo $unit_no > $zk_myid
51 juju-log "Adding this unit to the quorum..."
52 hostname=`unit-get private-address`
53- # Purge and re-add as required
54- sed -i "/^server.${unit_no}/d" $zk_conf
55+ # Add the config
56 echo "server.${unit_no}=${hostname}:2888:3888" >> $zk_conf
57+ echo "group.${default_group}=${unit_no}" >> $zk_conf
58+ echo "weight.${unit_no}=${default_weight}" >> $zk_conf
59 # Expose port as required
60 open-port $zk_port
61 }
62@@ -85,23 +90,84 @@
63 service $zk_service stop || :
64 }
65
66+update_group() {
67+ member_id=$1
68+ [ -z ${member_id} ] && return 0
69+ default_group=`config-get default_group`
70+ group_arr=( $(grep "group.${default_group}" ${zk_conf} | awk -F'=' '{ print $2 }' | tr ":" "\n") )
71+ member_found="no"
72+ for member in "${group_arr[@]}"
73+ do
74+ [ "${member_id}" == "${member}" ] && member_found="yes"
75+ done
76+ [ "${member_found}" == "no" ] && group_arr=("${group_arr[@]}" "${member_id}")
77+ retVal="group.${default_group}=${group_arr[@]}"
78+ retVal=`echo ${retVal} | tr " " ":"`
79+ sed -i "s/^group.${default_group}.*/${retVal}/" ${zk_conf}
80+ sed -i "s/^group.${default_group}=:/group.${default_group}=/" ${zk_conf}
81+}
82+
83+update_external_server() {
84+ # Add extra server ( if configured )
85+ external_server=`config-get external_server`
86+ if [[ "${external_server}" != "" ]]; then
87+ external_id=`echo ${external_server} | cut -d : -f 1`
88+ external_group=`echo ${external_server} | cut -d : -f 2`
89+ if [[ "${external_group}" == "default" ]]; then
90+ external_group=`config-get default_group`
91+ fi
92+ external_weight=`echo ${external_server} | cut -d : -f 3`
93+ external_host=`echo ${external_server} | cut -d : -f 4`
94+ external_port1=`echo ${external_server} | cut -d : -f 5`
95+ external_port2=`echo ${external_server} | cut -d : -f 6`
96+ sed -i "/^server.${external_id}/d" $zk_conf
97+ sed -i "/^weight.${external_id}/d" $zk_conf
98+ echo "server.${external_id}=${external_host}:${external_port1}:${external_port2}" >> $zk_conf
99+ update_group ${external_id}
100+ echo "weight.${external_id}=${external_weight}" >> $zk_conf
101+ open-port ${external_port1}
102+ open-port ${external_port2}
103+ fi
104+}
105+
106 update_quorum() {
107+ default_group=`config-get default_group`
108+ default_weight=`config-get default_weight`
109 # Purge out existing quorum config to deal with departure of
110 # ZK nodes
111 sed -i "/^server./d" $zk_conf
112+ sed -i "/^weight./d" $zk_conf
113+ sed -i "/^group./d" $zk_conf
114 # Add this node back into the list
115 juju-log "Adding this unit to the quorum..."
116 unit_no=`echo $JUJU_UNIT_NAME | cut -d / -f 2`
117 hostname=`unit-get private-address`
118- echo "server.${unit_no}=${hostname}:2888:3888" >> $zk_conf
119+ server_arr[0]="server.${unit_no}=${hostname}:2888:3888"
120+ weight_arr[0]="weight.${unit_no}=${default_weight}"
121+ group_arr[0]=${unit_no}
122 # Re-create based on current relations
123 for member in `relation-list`
124 do
125 juju-log "Adding $member to quorum"
126 member_id=`echo ${member} | cut -d / -f 2`
127 member_hostname=`relation-get private-address ${member}`
128- echo "server.${member_id}=${member_hostname}:2888:3888" >> $zk_conf
129- done
130+ server_arr=("${server_arr[@]}" "server.${member_id}=${member_hostname}:2888:3888")
131+ weight_arr=("${weight_arr[@]}" "weight.${member_id}=${default_weight}")
132+ group_arr=("${group_arr[@]}" "${member_id}")
133+ done
134+ # Dump the new config
135+ # servers
136+ for server_line in "${server_arr[@]}"
137+ do
138+ echo "${server_line}" >> ${zk_conf}
139+ done
140+ # weight
141+ for member_line in "${weight_arr[@]}"
142+ do
143+ echo "${member_line}" >> $zk_conf
144+ done
145+ # group
146+ echo "group.${default_group}=${group_arr[@]}" | tr " " ":" >> $zk_conf
147 }
148
149 setup_zk_interface() {
150@@ -116,6 +182,11 @@
151 configure_sources
152 install_zookeeper
153 configure_zookeeper
154+ update_external_server
155+ restart_zookeeper
156+ ;;
157+ config-changed)
158+ update_external_server
159 restart_zookeeper
160 ;;
161 start)
162@@ -128,6 +199,7 @@
163 ;;
164 quorum-relation-changed|quorum-relation-departed)
165 update_quorum
166+ update_external_server
167 restart_zookeeper
168 ;;
169 zookeeper-relation-joined)
170@@ -135,6 +207,7 @@
171 ;;
172 upgrade-charm)
173 configure_zookeeper
174+ update_external_server
175 restart_zookeeper
176 ;;
177 *)

Subscribers

People subscribed via source and target branches

to all changes: