Merge lp:~hrvojem/percona-xtradb-cluster/rn-5.5.23 into lp:~percona-core/percona-xtradb-cluster/5.5.23

Proposed by Hrvoje Matijakovic
Status: Merged
Merge reported by: Hrvoje Matijakovic
Merged at revision: not available
Proposed branch: lp:~hrvojem/percona-xtradb-cluster/rn-5.5.23
Merge into: lp:~percona-core/percona-xtradb-cluster/5.5.23
Diff against target: 491 lines (+425/-4)
5 files modified
doc/source/conf.py (+6/-2)
doc/source/ext/psdom.py (+387/-0)
doc/source/index.rst (+3/-2)
doc/source/release-notes/Percona-XtraDB-Cluster-5.5.23.rst (+19/-0)
doc/source/release-notes/release-notes_index.rst (+10/-0)
To merge this branch: bzr merge lp:~hrvojem/percona-xtradb-cluster/rn-5.5.23
Reviewer Review Type Date Requested Status
Percona core Pending
Review via email: mp+106017@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'doc/source/conf.py'
2--- doc/source/conf.py 2012-05-02 15:33:18 +0000
3+++ doc/source/conf.py 2012-05-16 16:48:20 +0000
4@@ -23,12 +23,14 @@
5 # If your documentation needs a minimal Sphinx version, state it here.
6 #needs_sphinx = '1.0'
7
8+sys.path.append(os.path.abspath('ext'))
9+
10 # Add any Sphinx extension module names here, as strings. They can be extensions
11 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
12
13 extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.todo',
14 'sphinx.ext.coverage', 'sphinx.ext.ifconfig',
15- 'sphinx.ext.extlinks']
16+ 'sphinx.ext.extlinks', 'psdom']
17
18 # Add any paths that contain templates here, relative to this directory.
19 templates_path = ['_templates']
20@@ -51,7 +53,7 @@
21 # built documents.
22 #
23 # The short X.Y version.
24-version = '5.5.20'
25+version = '5.5.23'
26 # The full version, including alpha/beta/rc tags.
27 release = '5.5.23-23.4'
28
29@@ -72,6 +74,8 @@
30 # The reST default role (used for this markup: `text`) to use for all documents.
31 #default_role = None
32
33+primary_domain = 'psdom'
34+
35 # If true, '()' will be appended to :func: etc. cross-reference text.
36 #add_function_parentheses = True
37
38
39=== added directory 'doc/source/ext'
40=== added file 'doc/source/ext/psdom.py'
41--- doc/source/ext/psdom.py 1970-01-01 00:00:00 +0000
42+++ doc/source/ext/psdom.py 2012-05-16 16:48:20 +0000
43@@ -0,0 +1,387 @@
44+# -*- coding: utf-8 -*-
45+"""
46+ The Percona Server domain.
47+
48+ :copyright: Copyright 2011 by Percona Inc.
49+ :license: GPL3, see LICENSE for details.
50+"""
51+
52+import re
53+import string
54+
55+from docutils import nodes
56+from docutils.parsers.rst import directives
57+
58+from sphinx import addnodes
59+from sphinx.roles import XRefRole
60+from sphinx.locale import l_, _
61+from sphinx.domains import Domain, ObjType, Index
62+from sphinx.directives import ObjectDescription
63+from sphinx.util.nodes import make_refnode
64+from sphinx.util.compat import Directive
65+from sphinx.util.docfields import Field, GroupedField, TypedField
66+
67+
68+# RE to split at word boundaries
69+wsplit_re = re.compile(r'\W+')
70+tern_re = re.compile(r'.*(\.|\:\:).*(\.).*')
71+
72+class PSschemaObject(ObjectDescription):
73+ """
74+ Description of a general PS object.
75+ """
76+ option_spec = {
77+ 'noindex': directives.flag,
78+ }
79+
80+
81+ def handle_signature(self, sig, signode):
82+ """Transform a PSschema signature into RST nodes."""
83+ # first try the function pointer signature regex, it's more specific
84+
85+ name = sig
86+
87+ signode += addnodes.desc_name('', '')
88+
89+ objectname = self.env.temp_data.get('psdom:object')
90+ ot = self.objtype
91+ ws = wsplit_re.split(sig)
92+
93+ if ot == 'db':
94+ sig_prefix = "database "
95+ else:
96+ sig_prefix = ot + " "
97+
98+ signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
99+
100+ # for part in filter(None, ws):
101+ # tnode = nodes.Text(part, part)
102+ # pnode = addnodes.pending_xref(
103+ # '', refdomain='psdom', reftype='type', reftarget=part,
104+ # modname=None, classname=None)
105+ # pnode = tnode
106+ # signode += pnode
107+
108+ if len(ws) > 2:
109+ dbname, tablename, columnname = ws
110+ name = columnname
111+ fullname = tablename + "." + columnname
112+ elif len(ws) == 2:
113+ if ot == 'table':
114+ dbname, tablename = ws
115+ dbname += "."
116+ name = tablename
117+ signode['table'] = tablename
118+ signode += addnodes.desc_addname(dbname, dbname)
119+ signode += addnodes.desc_name(tablename, tablename)
120+ # fullname = dbname + "." + tablename
121+ fullname = tablename
122+ if ot == 'column':
123+ tablename, columnname = ws
124+ tablename += " "
125+ signode += addnodes.desc_addname(tablename, tablename)
126+ signode += addnodes.desc_name(columnname, columnname)
127+ signode['table'] = tablename
128+ fullname = tablename + "." + columnname
129+ else:
130+ if ot == 'table':
131+ tablename = ws[0]
132+ signode['table'] = tablename
133+ dbname = self.options.get(
134+ 'db', self.env.temp_data.get('psdom:db'))
135+ dbname += "."
136+ self.env.temp_data['psdom:table'] = tablename
137+ signode += addnodes.desc_addname(dbname, dbname)
138+ signode += addnodes.desc_name(tablename, tablename)
139+ signode['table'] = tablename
140+ if ot == 'column':
141+ columnname = ws[0]
142+ signode['column'] = columnname
143+ tablename = self.options.get(
144+ 'table', self.env.temp_data.get('psdom:table'))
145+ tablename += "."
146+ signode += addnodes.desc_addname(tablename, tablename)
147+ signode += addnodes.desc_name(columnname, columnname)
148+ if ot == 'db':
149+ dbname = ws[0]
150+ signode['db'] = dbname
151+ name = dbname
152+ self.env.temp_data['psdom:db'] = dbname
153+ signode += addnodes.desc_name(dbname, dbname)
154+ fullname = ws[0]
155+
156+ signode['fullname'] = fullname
157+
158+ return fullname
159+
160+ def get_index_text(self, name):
161+ if self.objtype == 'db':
162+ return _('%s (database)') % name
163+ elif self.objtype == 'table':
164+ return _('%s (table)') % name
165+ elif self.objtype == 'column':
166+ return _('%s (column)') % name
167+ else:
168+ return ''
169+
170+ def add_target_and_index(self, name, sig, signode):
171+ # note target
172+ if name not in self.state.document.ids:
173+ signode['names'].append(name)
174+ signode['ids'].append(name)
175+ signode['first'] = (not self.names)
176+ self.state.document.note_explicit_target(signode)
177+ inv = self.env.domaindata['psdom']['objects']
178+ if name in inv:
179+ self.env.warn(
180+ self.env.docname,
181+ 'duplicate PSschema object description of %s, ' % name +
182+ 'other instance in ' + self.env.doc2path(inv[name][0]),
183+ self.lineno)
184+ inv[name] = (self.env.docname, self.objtype)
185+
186+ indextext = self.get_index_text(name)
187+ if indextext:
188+ self.indexnode['entries'].append(('single', indextext, name, ''))
189+
190+
191+class PSconfigObject(ObjectDescription):
192+ """
193+ Description of a general PS Config object.
194+ """
195+ option_spec = {
196+ 'noindex': directives.flag,
197+ }
198+
199+ def handle_signature(self, sig, signode):
200+ """Transform a PSconfig signature into RST nodes."""
201+ # first try the function pointer signature regex, it's more specific
202+
203+ name = sig
204+ ot = self.objtype
205+
206+ sig_prefix = ot + " "
207+ signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
208+
209+ signode += addnodes.desc_name(name, name)
210+ signode['fullname'] = name
211+
212+ return name
213+
214+ def get_index_text(self, name):
215+ if self.objtype == 'option':
216+ return _('%s (option)') % name
217+ elif self.objtype == 'variable':
218+ return _('%s (variable)') % name
219+ else:
220+ return ''
221+
222+ def add_target_and_index(self, name, sig, signode):
223+ # note target
224+ if name not in self.state.document.ids:
225+ signode['names'].append(name)
226+ signode['ids'].append(name)
227+ signode['first'] = (not self.names)
228+ self.state.document.note_explicit_target(signode)
229+ inv = self.env.domaindata['psdom']['objects']
230+ if name in inv:
231+ self.env.warn(
232+ self.env.docname,
233+ 'duplicate PSconfig object description of %s, ' % name +
234+ 'other instance in ' + self.env.doc2path(inv[name][0]),
235+ self.lineno)
236+ inv[name] = (self.env.docname, self.objtype)
237+
238+ indextext = self.get_index_text(name)
239+ if indextext:
240+ self.indexnode['entries'].append(('single', indextext, name, ''))
241+
242+
243+class PSTable(PSschemaObject):
244+
245+ doc_field_types = [
246+ TypedField('column', label=l_('Columns'), rolename='obj',
247+ names=('col', 'column', 'cols'),
248+ typerolename='obj', typenames=('paramtype', 'type')),
249+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
250+ names=('inpatch')),
251+ TypedField('versioninfo', label=l_('Version Info'), rolename='obj',
252+ names=('version', 'versioninfo'),
253+ typerolename='obj', typenames=('paramtype', 'type')),
254+ ]
255+
256+class PSDatabase(PSschemaObject):
257+
258+ doc_field_types = [
259+ TypedField('tbl', label=l_('Tables'),
260+ names=('tbl', 'table',),
261+ typerolename='obj', typenames=('paramtype', 'type')),
262+ Field('engine', label=l_('Storage Engine'), has_arg=False,
263+ names=('engine')),
264+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
265+ names=('inpatch')),
266+ ]
267+
268+class PSColumn(PSschemaObject):
269+
270+ doc_field_types = [
271+ TypedField('coltype', label=l_('Type'), rolename='obj',
272+ names=('coltype', 'type'),
273+ typerolename='obj', typenames=('paramtype', 'type')),
274+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
275+ names=('inpatch')),
276+ ]
277+
278+class PSVariable(PSconfigObject):
279+
280+ doc_field_types = [
281+ Field('scope', label=l_('Scope'), has_arg=False,
282+ names=('scope', 'varscope')),
283+ Field('cmdline', label=l_('Command Line'), has_arg=False,
284+ names=('cmdline', 'cline', 'cli')),
285+ Field('configfile', label=l_('Config File'), has_arg=False,
286+ names=('conffile', 'configfile', 'conf', 'cfile')),
287+ Field('dynamic', label=l_('Dynamic'), has_arg=False,
288+ names=('dynvar', 'dyn')),
289+ Field('vartype', label=l_('Variable Type'), has_arg=False,
290+ names=('vartype', 'vtype')),
291+ Field('default', label=l_('Default Value'), has_arg=False,
292+ names=('default', 'df')),
293+ Field('range', label=l_('Range'), has_arg=False,
294+ names=('range', 'range')),
295+ Field('allowed', label=l_('Allowed Values'), has_arg=False,
296+ names=('allowed', 'av')),
297+ Field('unit', label=l_('Units'), has_arg=False,
298+ names=('unit', 'un')),
299+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
300+ names=('inpatch')),
301+ TypedField('versioninfo', label=l_('Version Info'), rolename='obj',
302+ names=('version', 'versioninfo'),
303+ typerolename='obj', typenames=('paramtype', 'type')),
304+ ]
305+
306+class PSOption(PSconfigObject):
307+ pass
308+
309+class PSReleaseNotes(Directive):
310+ """
311+ Directive to mark description of Release Notes.
312+ """
313+
314+ has_content = False
315+ required_arguments = 1
316+ optional_arguments = 0
317+ final_argument_whitespace = False
318+ option_spec = {
319+ 'platform': lambda x: x,
320+ 'noindex': directives.flag,
321+ }
322+
323+ def run(self):
324+ env = self.state.document.settings.env
325+ rnname = self.arguments[0].strip()
326+ noindex = 'noindex' in self.options
327+ env.temp_data['psdome:rn'] = rnname
328+ ret = []
329+ if not noindex:
330+ env.domaindata['psdom']['objects'][rnname] = \
331+ (env.docname, self.options.get('platform', ''))
332+ # make a duplicate entry in 'objects' to facilitate searching for the
333+ # module in PythonDomain.find_obj()
334+ env.domaindata['psdom']['objects'][rnname] = (env.docname, 'rn')
335+ targetnode = nodes.target('', '', ids=['release-' + rnname])
336+ self.state.document.note_explicit_target(targetnode)
337+ # the platform and synopsis aren't printed; in fact, they are only used
338+ # in the modindex currently
339+ ret.append(targetnode)
340+ indextext = _('%s (release notes)') % rnname
341+ inode = addnodes.index(entries=[('single', indextext,
342+ 'module-' + rnname, '')])
343+ ret.append(inode)
344+ return ret
345+
346+class PSXRefRole(XRefRole):
347+ def process_link(self, env, refnode, has_explicit_title, title, target):
348+ if not has_explicit_title:
349+ target = target.lstrip('~') # only has a meaning for the title
350+ # if the first character is a tilde, don't display the module/class
351+ # parts of the contents
352+ if title[0:1] == '~':
353+ title = title[1:]
354+ dot = title.rfind('.')
355+ if dot != -1:
356+ title = title[dot+1:]
357+ return title, target
358+
359+
360+class PerconaServerDomain(Domain):
361+ """Percona Server domain."""
362+ name = 'psdom'
363+ label = 'Percona Server'
364+ object_types = {
365+ 'db': ObjType(l_('db'), 'db'),
366+ 'table': ObjType(l_('table'), 'table'),
367+ 'column': ObjType(l_('column'), 'column'),
368+ 'option': ObjType(l_('option'), 'option'),
369+ 'variable': ObjType(l_('variable'), 'data'),
370+ }
371+
372+ directives = {
373+ 'db': PSDatabase,
374+ 'table': PSTable,
375+ 'column': PSColumn,
376+ 'option': PSVariable,
377+ 'variable': PSVariable,
378+ 'rn': PSReleaseNotes
379+ }
380+ roles = {
381+ 'db' : PSXRefRole(),
382+ 'table': PSXRefRole(),
383+ 'column': PSXRefRole(),
384+ 'option': PSXRefRole(),
385+ 'variable': PSXRefRole(),
386+ 'rn': PSXRefRole(),
387+ }
388+ initial_data = {
389+ 'objects': {}, # fullname -> docname, objtype
390+ }
391+
392+ def clear_doc(self, docname):
393+ for fullname, (fn, _) in self.data['objects'].items():
394+ if fn == docname:
395+ del self.data['objects'][fullname]
396+
397+ def resolve_xref(self, env, fromdocname, builder,
398+ typ, target, node, contnode):
399+ # strip pointer asterisk
400+ target = target.rstrip(' *')
401+ if target not in self.data['objects']:
402+ return None
403+ obj = self.data['objects'][target]
404+ return make_refnode(builder, fromdocname, obj[0], target,
405+ contnode, target)
406+
407+ def get_objects(self):
408+ for refname, (docname, type) in self.data['objects'].iteritems():
409+ yield (refname, refname, type, docname, refname, 1)
410+
411+ def find_obj(self, env, obj, name, typ, searchorder=0):
412+ if name[-2:] == '()':
413+ name = name[:-2]
414+ objects = self.data['objects']
415+ newname = None
416+ if searchorder == 1:
417+ if obj and obj + '.' + name in objects:
418+ newname = obj + '.' + name
419+ else:
420+ newname = name
421+ else:
422+ if name in objects:
423+ newname = name
424+ elif obj and obj + '.' + name in objects:
425+ newname = obj + '.' + name
426+ return newname, objects.get(newname)
427+
428+def setup(app):
429+ app.add_config_value('databases', {}, 'env')
430+ app.add_domain(PerconaServerDomain)
431
432=== modified file 'doc/source/index.rst'
433--- doc/source/index.rst 2012-04-24 13:38:51 +0000
434+++ doc/source/index.rst 2012-05-16 16:48:20 +0000
435@@ -98,13 +98,14 @@
436 `Galera Wiki <http://www.codership.com/wiki/doku.php>`_
437
438
439-Misc
440-====
441+Reference
442+=========
443
444 .. toctree::
445 :maxdepth: 1
446 :glob:
447
448+ release-notes/release-notes_index
449 glossary
450
451 Indices and tables
452
453=== added directory 'doc/source/release-notes'
454=== added file 'doc/source/release-notes/Percona-XtraDB-Cluster-5.5.23.rst'
455--- doc/source/release-notes/Percona-XtraDB-Cluster-5.5.23.rst 1970-01-01 00:00:00 +0000
456+++ doc/source/release-notes/Percona-XtraDB-Cluster-5.5.23.rst 2012-05-16 16:48:20 +0000
457@@ -0,0 +1,19 @@
458+.. rn:: 5.5.23
459+
460+=====================================
461+ |Percona XtraDB Cluster| 5.5.23-23.5
462+=====================================
463+
464+Percona is glad to announce the release of |Percona XtraDB Cluster| on May 14, 2012. Binaries are available from `downloads area <http://www.percona.com/downloads/Percona-XtraDB-Cluster/5.5.23-23.5/>`_ or from our `software repositories <http://www.percona.com/doc/percona-xtradb-cluster/installation.html#using-percona-software-repositories>`_.
465+
466+This is an General Availability release. We did our best to eliminate bugs and problems during alpha and beta testing release, but this is a software, so bugs are expected. If you encounter them, please report them to our `bug tracking system <https://bugs.launchpad.net/percona-xtradb-cluster/+filebug>`_.
467+
468+List of changes:
469+ * Fixes merged from upstream (`Codership-mysql <http://www.codership.com/content/wsrep-patch-235-mysql-5523-released>`_).
470+ * Support for MyISAM, now changes to MyISAM tables are replicated to other nodes.
471+ * Improvements to XtraBackup SST methods, better error handling.
472+ * New SST wsrep_sst_method=skip, useful when you start all nodes from the same sources (i.e. backup).
473+ * Ability to pass list of IP addresses for a new node, it will connect to the first available.
474+
475+Based on `Percona Server 5.5.23-25.3 <http://www.percona.com/doc/percona-server/5.5/release-notes/Percona-Server-5.5.23-25.3.html>`_ including all the bug fixes in it, and the latest `Galera 2.x replicator <https://code.launchpad.net/~codership/galera/2.x>`_, |Percona XtraDB Cluster| 5.5.23-25.3 is now the current stable release. All of |Percona|'s software is open-source and free.
476+
477
478=== added file 'doc/source/release-notes/release-notes_index.rst'
479--- doc/source/release-notes/release-notes_index.rst 1970-01-01 00:00:00 +0000
480+++ doc/source/release-notes/release-notes_index.rst 2012-05-16 16:48:20 +0000
481@@ -0,0 +1,10 @@
482+======================================
483+|Percona XtraDB Cluster| Release notes
484+======================================
485+
486+.. toctree::
487+ :maxdepth: 1
488+ :glob:
489+
490+ Percona-XtraDB-Cluster-5.5.2*
491+

Subscribers

People subscribed via source and target branches