Merge lp:~pbeaman/akiban-persistit/release-notes-3.2.0 into lp:akiban-persistit

Proposed by Peter Beaman
Status: Merged
Approved by: Timothy Wegner
Approved revision: 380
Merged at revision: 380
Proposed branch: lp:~pbeaman/akiban-persistit/release-notes-3.2.0
Merge into: lp:akiban-persistit
Diff against target: 318 lines (+191/-30)
3 files modified
doc/BugList (+86/-0)
doc/ReleaseNotes.rst (+102/-28)
src/main/java/com/persistit/Configuration.java (+3/-2)
To merge this branch: bzr merge lp:~pbeaman/akiban-persistit/release-notes-3.2.0
Reviewer Review Type Date Requested Status
Timothy Wegner (community) Approve
Review via email: mp+129768@code.launchpad.net

Description of the change

Release notes updated for 3.2.0 release.

LBJ: NO_BUILD

To post a comment you must log in.
Revision history for this message
Timothy Wegner (timmwegner) wrote :

Looks great

Revision history for this message
Timothy Wegner (timmwegner) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'doc/BugList'
2--- doc/BugList 2012-09-11 21:34:59 +0000
3+++ doc/BugList 2012-10-15 21:27:24 +0000
4@@ -1,3 +1,89 @@
5+1065677 : 3.2.0
6+
7+`Persistit not recoverable after hard crash`
8+
9+A system experienced a sequence of events, including being killed several times at
10+inopportune times by the OOM Killer, that left its journal in an unrecoverable state.
11+Specifically, there was a journal file that contained lots of updated pages, but no
12+checkpoint record. Due to a bug in the RecoveryManager code, the system timestamp
13+was set incorrectly and led to an out-of-order page update sequence. While this bug
14+would be difficult to recreate by any natural circumstances, it is critical because
15+of potential data loss.
16+
17+1064565 : 3.2.0
18+
19+`Accumulator state sometimes missing from checkpoint`
20+
21+Occasionally the state of an Accumulator was incorrect after normal system restart.
22+The cause was a race in the checkpoint code. This is a critical bug due to potential
23+data loss.
24+
25+1062315 : 3.2.0
26+
27+`Assertion failure in TransactionIndexBucket#allocateTransactionStatus`
28+
29+An assert was observed in an 8-hour stress test run. The underlying cause was
30+a brief race condition and was harmless. The race has been fixed.
31+
32+1058650 : 3.2.0
33+
34+`IllegalStateException due to out-of-order MVVs`
35+
36+Stress tests experienced an occasional occurrence of an IllegalStateException due
37+to out-of-order versions in an MVV value. The condition was transient and did not
38+cause data loss. The underlying cause has been fixed.
39+
40+1058254 : 3.2.0
41+
42+`Join on range delete can change successor keys`
43+
44+A range delete that crosses at least two page boundaries can write an incorrect key
45+when merging records; this causes it and subsequent keys within the page to be wrong
46+and also leads to a discontinuity between the max key in the page and the first key
47+of its right sibling.
48+
49+1056489 : 3.2.0
50+
51+`MVV and step visibility and pruning errors`
52+
53+Transactions using +step+ values (see com.persisit.Transaction#setStep) sometimes resulted
54+in inconsistent states.
55+
56+1053680 : 3.2.0
57+
58+`Page deallocation can permanently lose pages`
59+
60+When removing records causes deallocation of chain of pages configured in a particular way,
61+a garbage page, and possibly many pages linked to it, may be stranded in a volume.
62+The result is irrecoverable loss of space in the volume file.
63+
64+1047973 : 3.2.0
65+
66+`O(N*N) Loop in JournalManager#cleanupPageList`
67+
68+Bad code in this method causes periodic performance degradation in 4-hour TPCC test. The
69+CPU cost of this algorithm scales as the square of the number of pages in the page list,
70+and the work is done within a globally blocking synchronized block.
71+
72+1045971 : 3.2.0
73+
74+`Dynamically loaded volumes not recovered "cleanly"`
75+
76+When a program creates new volumes using VolumeSpecifications, they subsequently
77+cause a "missing volume" warning from the journal copier and prevent the removal
78+of journal files containing the references. The journal files accumulate seemingly
79+without end, and each initialization of the database seems to process more and
80+more of the old transactions.
81+
82+See discussion about regarding the useOldVSpec property.
83+
84+1046049 : 3.2.0
85+
86+`Filtered traverse in LTEQ direction appears not to work`
87+
88+A bug in the com.persistit.KeyFilter caused reverse-direction traversal using
89+a KeyFilter with a range term to return incorrect results.
90+
91 1044513 : 3.1.7
92
93 `AssertionError in IntegrityCheckTest`
94
95=== modified file 'doc/ReleaseNotes.rst'
96--- doc/ReleaseNotes.rst 2012-09-11 21:46:00 +0000
97+++ doc/ReleaseNotes.rst 2012-10-15 21:27:24 +0000
98@@ -1,5 +1,5 @@
99 ************************************
100-Akiban Persistit
101+Akiban Persistit Version 3.2.0
102 ************************************
103
104 Overview
105@@ -50,6 +50,10 @@
106 +---------+--------------------+--------------------------------------------------------------------------+
107 | Version | Release Date | Summary |
108 +=========+====================+==========================================================================+
109+| 3.2.0 | October 15, 2012 | Fix several critical and other bugs, one of which requires a modified |
110+| | | journal file format. This version also significantly improves |
111+| | | performance for I/O-intensive concurrent transaction loads. |
112++---------+--------------------+--------------------------------------------------------------------------+
113 | 3.1.7 | September 11, 2012 | Fix several bugs, add buffer pool preload ("warm-up"), |
114 | | | reformat code base |
115 +---------+--------------------+--------------------------------------------------------------------------+
116@@ -73,50 +77,111 @@
117 Changes and New Features
118 ========================
119
120+Persistit 3.2.0 - Default Journal File Format Changed
121+-----------------------------------------------------
122+
123+Version 3.2.0 fixes problems related to Volumes created and opened by the com.persistit#loadVolume
124+method rather than being specified by the initial system configuration. In previous versions, journal files
125+contained insufficient information to properly recover such volumes, even during normal startup.
126+
127+To solve this problem the format of the IV (identify volume) journal record changed to include
128+the com.persistit.VolumeSpecification rather than the volume name alone. By default, journal
129+files written by earlier versions of Persistit continue to be supported, but once Persistit 3.2.0 has
130+added one or more new journal files to a database, earlier versions of Persistit are unable to
131+open the database.
132+
133+In most cases it is never necessary to revert to an earlier version, but to support sites where
134+backward-compatibility may be important, it is possible to specify a new configuration parameter
135+(see com.persistit.Configuration#setUseOldVSpec). When this property is +true+, Persistit writes
136+journal files that are backward-compatible, but incapable of supporting dynamically created volumes.
137+
138+Persistit 3.2.0 - Performance Improvements
139+------------------------------------------
140+
141+Version 3.2.0 significantly improves I/O performance for concurrent transactions and
142+better controls the number of journal files created during by very aggressive loads. A new attribute
143+in the com.persistit.mxbeans.JournalManagerMXBean class called urgentFileCountThreshold controls the
144+maximum number of journal files Persistit will create before ramping the up the urgency of copying pages to
145+allow purging old files. Several other issues related to I/O scheduling and management of
146+dirty pages were resolved.
147+
148+Version 3.2.0 significantly improves scheduling of version pruning operations. Pruning is the process by
149+which obsolete versions are removed from multi-version values (MVVs). Better scheduling results in a
150+significant reduction in the amount of space consumed by obsolete version and also results in better
151+transaction throughput.
152+
153 Persistit 3.1.7 - Code Base Reformatted
154 ---------------------------------------
155
156-To simplify diffs and improve legibility, the entire code base was reformatted and "cleaned up" by the Eclipse code formatting tool. The maven build now automatically formats all
157-source to ensure coherent diffs in the future. The settings for formatting and code style cleanup by Eclipse are found in the ``src/etc`` directory.
158+To simplify diffs and improve legibility, the entire code base was reformatted and "cleaned up"
159+by the Eclipse code formatting tool. The maven build now automatically formats all
160+source to ensure coherent diffs in the future. The settings for formatting and code style
161+cleanup by Eclipse are found in the ``src/etc`` directory.
162
163 Persistit 3.1.7 - Buffer Pool Preload
164 -------------------------------------
165
166-On a server with a large buffer pool (many gigabytes), a Persistit instance can run for a long time before the buffer pool becomes populated with a suitable working set of database pages. Until then performance is degraded due to a potentially large number of random reads. For a production server the result may be poor performance for minutes to hours after restart.
167-
168-The preload facility periodically records an inventory of the pages currently in the buffer pool(s) and optionally reloads the same set of pages when Persistit is restarted. During the preload process Persistit attempts to read pages in approximate file-address order to accelerate reads. In one of our experiments Persistit preloads a buffer pool with over 800,000 16Kbyte buffers in about a minute, which is orders of magnitude faster than the same process would take with reads performed incrementally at random.
169-
170-Two new configuration properties com.persistit.Configuration#setBufferInventoryEnabled and com.persistit.Configuration#setBufferPreloadEnabled control this behavior. These settings are turned off by default in version 3.1.7.
171+On a server with a large buffer pool (many gigabytes), a Persistit instance can run for a long
172+time before the buffer pool becomes populated with a suitable working set of database pages.
173+Until then performance is degraded due to a potentially large number of random reads.
174+For a production server the result may be poor performance for minutes to hours after restart.
175+
176+The preload facility periodically records an inventory of the pages currently in the buffer
177+pool(s) and optionally reloads the same set of pages when Persistit is restarted. During the
178+preload process Persistit attempts to read pages in approximate file-address order to
179+accelerate reads. In one of our experiments Persistit preloads a buffer pool with over
180+800,000 16Kbyte buffers in about a minute, which is orders of magnitude faster than the
181+same process would take with reads performed incrementally at random.
182+
183+Two new configuration properties com.persistit.Configuration#setBufferInventoryEnabled and
184+com.persistit.Configuration#setBufferPreloadEnabled control this behavior. These settings
185+are turned off by default in version 3.1.7.
186
187 Persistit 3.1.4 - Detecting and Ignoring Missing Volumes
188 --------------------------------------------------------
189
190-Every time Persistit writes a modified page to disk, it does so first to the journal. During recovery processing, the page images from the journal are analyzed and reinserted into volumes in such a way that all B+Trees are restored to a consistent state. The issue addressed in this change is how Persistit behaves during recovery if it discovers that a volume referred to by a page in the journal no longer exists.
191+Every time Persistit writes a modified page to disk, it does so first to the journal.
192+During recovery processing, the page images from the journal are analyzed and reinserted
193+into volumes in such a way that all B+Trees are restored to a consistent state. The issue
194+addressed in this change is how Persistit behaves during recovery if it discovers that a
195+volume referred to by a page in the journal no longer exists.
196
197-Recognizing that under some circumstances an administrator may indeed wish to remove a volume from an existing Database, this change provides a configurable switch to optionally allow pages from missing volumes to be skipped (with logged warning messages) during recovery processing. The switch can be enabled by setting the configuration parameter com.persistit.Configuration#setIgnoreMissingViolumes to true.
198+Recognizing that under some circumstances an administrator may indeed wish to remove a
199+volume from an existing Database, this change provides a configurable switch to optionally
200+allow pages from missing volumes to be skipped (with logged warning messages) during recovery
201+processing. The switch can be enabled by setting the configuration parameter
202+com.persistit.Configuration#setIgnoreMissingViolumes to true.
203
204
205 Persistit 3.1.4 - Reduce KeyCoder Serialized Object Size
206 --------------------------------------------------------
207
208 .. note::
209- Any Database containing objects serialized by a custom KeyCoder from a previous version of Persistit is incompatible with this change
210-
211-Minimize the per-instance overhead for application objects written into Persistit Keys by reducing the size of the internal identifier.
212-
213-Persistit has rich support for serializing standard Java primitive and object types into a Key. Additionally, the KeyCoder class allows for any application level object to also be appended to a Key right next to any other type. This is tagged internally with per-class handles. This change lowers the initial offset to reduce and in many cases halve the serialized size.
214+ Any Database containing objects serialized by a custom KeyCoder from a previous version
215+ of Persistit is incompatible with this change
216+
217+Minimize the per-instance overhead for application objects written into Persistit Keys by
218+reducing the size of the internal identifier.
219+
220+Persistit has rich support for serializing standard Java primitive and object types into a
221+Key. Additionally, the KeyCoder class allows for any application level object to also be
222+appended to a Key right next to any other type. This is tagged internally with per-class
223+handles. This change lowers the initial offset to reduce and in many cases halve the serialized size.
224
225 Persistit 3.1.4 - Maven POM Changes For Eclipse Juno
226 ----------------------------------------------------
227
228-The latest version of Eclipse, code named Juno, features a wide array of changes, including a new release of the m2eclipse plugin. In an effort to make getting started with Persistit as easy as possible, we have included the required m2e configuration sections in our pom.
229+The latest version of Eclipse, code named Juno, features a wide array of changes, including a
230+new release of the m2eclipse plugin. In an effort to make getting started with Persistit as
231+easy as possible, we have included the required m2e configuration sections in our pom.
232
233 Please contact Akiban if you have encounter any issues getting up and running with Persistit.
234
235 Persistit 3.1.2 - Asserts Added to Check for Correct Exchange Thread Behavior
236 -----------------------------------------------------------------------------
237
238-A bug in the Akiban Server code caused an Exchange to be used concurrently by two Threads, causing serious and seemingly unrelated failures in Persistit including instances of IllegalMonitorException and IllegalStateException. To guard against future occurrences, asserts were added to catch such concurrent use by multiple threads. Applications should be tested with asserts enabled to verify correct thread usage.
239+A bug in the Akiban Server code caused an Exchange to be used concurrently by two Threads,
240+causing serious and seemingly unrelated failures in Persistit including instances of IllegalMonitorException and IllegalStateException. To guard against future occurrences, asserts were added to catch such concurrent use by multiple threads. Applications should be tested with asserts enabled to verify correct thread usage.
241
242
243
244@@ -126,21 +191,23 @@
245 Transactional Tree Management
246 -----------------------------
247
248-All operations within Trees such as store, fetch, remove and traverse are correctly supported within transactions. However, the operations to create and delete Tree instances currently do not respect transaction boundaries. For example, if a transaction creates a new Tree, it is immediately visible within other Transactions and will continue to exist even if the original transaction aborts. (However, records inserted or modified by the original transaction will not be visible until the transaction commits.) Prior to creating/removing trees, transaction processing should be quiesced and allowed to complete.
249-
250-Problems with Disk Full
251-------------------------------------
252-
253-https://bugs.launchpad.net/akiban-persistit/+bug/916071
254-
255-There are rare cases where Persistit will generate exceptions other than java.io.IOException: No space left on device when a disk volume containing the journal or volume file fills up. The database will be intact upon recovery, but the application may receive unexpected exceptions.
256+All operations within Trees such as store, fetch, remove and traverse are correctly supported
257+within transactions. However, the operations to create and delete Tree instances currently do
258+not respect transaction boundaries. For example, if a transaction creates a new Tree, it is
259+immediately visible within other Transactions and will continue to exist even if the original
260+transaction aborts. (However, records inserted or modified by the original transaction will
261+not be visible until the transaction commits.) Prior to creating/removing trees, transaction
262+processing should be quiesced and allowed to complete.
263+
264
265 Out of Memory Error, Direct Memory Buffer
266 ------------------------------------------------------
267
268 https://bugs.launchpad.net/akiban-persistit/+bug/985117
269
270-Out of Memory Error, Direct Memory Buffer. Can cause failed transactions under extreme load conditions as a result of threads getting backed up writing to the journal file. However, this error is transient and recoverable by by retrying the failed transaction.
271+Out of Memory Error, Direct Memory Buffer. Can cause failed transactions under extreme load
272+conditions as a result of threads getting backed up writing to the journal file. However,
273+this error is transient and recoverable by by retrying the failed transaction.
274
275 * Workaround: Ensure your application has the ability to retry failed transactions
276
277@@ -149,16 +216,23 @@
278
279 https://bugs.launchpad.net/akiban-persistit/+bug/986465
280
281-The getChangeCount method may return inaccurate results as its not currently transactional. The primary consumer is the PersistitMap. As a result of this bug Persistit may not generate java.util.ConcurrentModiciationException when it is supposed to.
282+The getChangeCount method may return inaccurate results as its not currently transactional.
283+The primary consumer is the PersistitMap. As a result of this bug Persistit may not generate
284+java.util.ConcurrentModificationException when it is supposed to.
285
286 Multi-Version-Values sometimes not fully pruned
287 -------------------------------------------------------------
288
289 https://bugs.launchpad.net/akiban-persistit/+bug/1000331
290
291-Multi-version values are not always pruned properly causing volume growth. The number of MVV records and their overhead size can be obtaining by running the IntegrityCheck task.
292+Multi-version values are not always pruned properly causing volume growth. The number of
293+MVV records and their overhead size can be obtaining by running the IntegrityCheck task.
294
295 * Workaround 1: Run the IntegrityCheck task (CLI command icheck) with the -P option which will prune the MVVs. This will remove obsolete MVV instances and in many cases free up pages in which new data can be stored. However, it will not reduce the actual size of the volume file.
296
297 * Workaround 2: To reduce the size of the volume you can use the CLI commands ``save`` and ``load`` to reload the data into a newly created volume file. See http://www.akiban.com/ak-docs/admin/persistit/Management.html#management for more information about these operations.
298
299+Note: although the methods described here may be helpful in reducing MVV clutter, Persistit Version 3.2.0 significantly improves the algorithms used to prune obsolete versions and the
300+techniques described here are unlikely to be necessary.
301+
302+
303
304=== modified file 'src/main/java/com/persistit/Configuration.java'
305--- src/main/java/com/persistit/Configuration.java 2012-10-03 17:21:10 +0000
306+++ src/main/java/com/persistit/Configuration.java 2012-10-15 21:27:24 +0000
307@@ -1936,8 +1936,9 @@
308 * Journal files created by version 3.1.8 with this mode enabled can be used
309 * by earlier versions of Persistit. However, doing so prevents volumes
310 * created dynamically using
311- * {@link Persistit#loadVolume(VolumeSpecification))} from being recovered
312- * properly. (See https://bugs.launchpad.net/akiban-persistit/+bug/1045971)
313+ * {@link Persistit#loadVolume(com.persistit.VolumeSpecification)} from
314+ * being recovered properly. (See
315+ * https://bugs.launchpad.net/akiban-persistit/+bug/1045971)
316 * </p>
317 * <p>
318 * This method and configuration parameter is deprecated and will be removed

Subscribers

People subscribed via source and target branches