Merge lp:~pbeaman/akiban-persistit/release-notes-3.2.0 into lp:akiban-persistit
- release-notes-3.2.0
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Timothy Wegner (community) | Approve | ||
Review via email: mp+129768@code.launchpad.net |
Commit message
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 : | # |
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 |
Looks great