~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to database/replication/generate_migration.py

  • Committer: Stuart Bishop
  • Date: 2011-10-11 06:25:04 UTC
  • mto: (7675.1212.22 pending-db-changes)
  • mto: This revision was merged to the branch mainline in revision 14138.
  • Revision ID: stuart.bishop@canonical.com-20111011062504-84u0oa2u1ei71hc8
Slony 2.0 migration script for testing

Show diffs side-by-side

added added

removed removed

Lines of Context:
43
43
    return os.path.join(options.outdir, filename)
44
44
 
45
45
 
 
46
def message(outf, msg):
 
47
    assert "'" not in msg
 
48
    print >> outf, "echo '%s';" % msg
 
49
 
 
50
 
46
51
def generate_preamble():
47
52
    outf = open(outpath('mig_preamble.sk'), 'w')
48
53
    print >> outf, replication.helpers.preamble(con)
77
82
                """).strip() % (node.node_id, node.node_id, node.node_id)
78
83
 
79
84
    for node in nodes:
 
85
        message(outf, "Uninstall node %d" % node.node_id)
80
86
        print >> outf, "uninstall node (id=%d);" % node.node_id
81
87
    outf.close()
82
88
 
83
89
 
84
90
def generate_sync():
85
91
    outf = open(outpath('mig_sync.sk'), 'w')
86
 
    print >> outf, "sync (id=1);"
87
 
    print >> outf, "wait for event (origin=1, confirmed=all, wait on=1);"
 
92
    message(outf, "Waiting for sync")
 
93
    print >> outf, "sync (id=@master_node);"
 
94
    print >> outf, dedent("""\
 
95
        wait for event (
 
96
                origin=@master_node, confirmed=all, wait on=@master_node);
 
97
            """).strip()
88
98
    outf.close()
89
99
 
90
100
 
98
108
    remaining_nodes = nodes[1:]
99
109
 
100
110
    # Initialize the cluster
 
111
    message(outf, "Initializing cluster (node %d)" % first_node.node_id)
101
112
    print >> outf, "init cluster (id=%d);" % first_node.node_id
102
113
 
103
114
    # Create all the other nodes
104
115
    for node in remaining_nodes:
 
116
        message(outf, "Initializing node %d" % node.node_id)
105
117
        print >> outf, "store node (id=%d, event node=%d);" % (
106
118
            node.node_id, first_node.node_id)
107
119
 
108
120
    # Create paths so they can communicate.
 
121
    message(outf, "Storing %d paths" % pow(len(nodes),2))
109
122
    for client_node in nodes:
110
123
        for server_node in nodes:
111
124
            print >> outf, (
131
144
 
132
145
def generate_initialize_set(set_id, set_name, outf):
133
146
    origin_node = get_master_node(con, set_id)
134
 
    print >> outf, "create set (id=%d, origin=%d, comment='%s');" % (
135
 
        set_id, origin_node.node_id, set_name)
 
147
    message(outf, "Creating %s origin %d" % (set_name, origin_node.node_id))
 
148
    print >> outf, "create set (id=%d, origin=@%s_origin, comment='%s');" % (
 
149
        set_id, set_name, set_name)
136
150
    cur = con.cursor()
137
151
    cur.execute("""
138
152
        SELECT tab_id, tab_nspname, tab_relname, tab_comment
139
153
        FROM _sl.sl_table WHERE tab_set=%s
140
154
        """, (set_id,))
141
 
    for tab_id, tab_nspname, tab_relname, tab_comment in cur.fetchall():
 
155
    results = cur.fetchall()
 
156
    message(outf, "Adding %d tables to %s" % (len(results), set_name))
 
157
    for tab_id, tab_nspname, tab_relname, tab_comment in results:
142
158
        if not tab_comment:
143
159
            tab_comment=''
144
160
        print >> outf, dedent("""\
145
161
                set add table (
146
 
                    set id=%d, origin=%d, id=%d,
 
162
                    set id=@%s, origin=@%s_origin, id=%d,
147
163
                    fully qualified name='%s.%s',
148
164
                    comment='%s');
149
165
                """).strip() % (
150
 
                    set_id, origin_node.node_id, tab_id,
 
166
                    set_name, set_name, tab_id,
151
167
                    tab_nspname, tab_relname, tab_comment)
152
168
    cur.execute("""
153
169
        SELECT seq_id, seq_nspname, seq_relname, seq_comment
154
170
        FROM _sl.sl_sequence WHERE seq_set=%s
155
171
        """, (set_id,))
156
 
    for seq_id, seq_nspname, seq_relname, seq_comment in cur.fetchall():
 
172
    results = cur.fetchall()
 
173
    message(outf, "Adding %d sequences to %s" % (len(results), set_name))
 
174
    for seq_id, seq_nspname, seq_relname, seq_comment in results:
157
175
        if not seq_comment:
158
176
            seq_comment=''
159
177
        print >> outf, dedent("""\
160
178
                set add sequence (
161
 
                    set id=%d, origin=%d, id=%d,
 
179
                    set id=@%s, origin=@%s_origin, id=%d,
162
180
                    fully qualified name='%s.%s',
163
181
                    comment='%s');
164
182
                """).strip() % (
165
 
                    set_id, origin_node.node_id, seq_id,
 
183
                    set_name, set_name, seq_id,
166
184
                    seq_nspname, seq_relname, seq_comment)
167
185
 
168
186
 
174
192
        WHERE sub_set=%s and sub_active is true
175
193
        """, (set_id,))
176
194
    for receiver_id, in cur.fetchall():
 
195
        message(outf, "Subscribing node %d to %s" % (receiver_id, set_name))
177
196
        print >> outf, dedent("""\
178
197
                subscribe set (
179
 
                    id=%d, provider=%d, receiver=%d,
 
198
                    id=%d, provider=@%s_origin, receiver=%d,
180
199
                    forward=true, omit copy=true);
181
200
                wait for event (
182
 
                    origin=%d, confirmed=all, wait on=%d);
 
201
                    origin=@%s_origin, confirmed=all, wait on=@%s_origin);
183
202
                """).strip() % (
184
 
                    set_id, origin_node.node_id, receiver_id,
185
 
                    origin_node.node_id, origin_node.node_id)
 
203
                    set_id, set_name, receiver_id,
 
204
                    set_name, set_name)
186
205
        print >> outf, "include <mig_sync.sk>;"
187
206
 
188
207