Merge lp:~pbeaman/akiban-persistit/release-3.1.7-prep into lp:akiban-persistit
- release-3.1.7-prep
- Merge into trunk
Proposed by
Peter Beaman
Status: | Merged |
---|---|
Approved by: | Peter Beaman |
Approved revision: | 368 |
Merged at revision: | 365 |
Proposed branch: | lp:~pbeaman/akiban-persistit/release-3.1.7-prep |
Merge into: | lp:akiban-persistit |
Diff against target: |
775 lines (+368/-209) 11 files modified
doc/BugList (+145/-0) doc/Configuration.rst (+20/-3) doc/ReleaseNotes.rst (+63/-188) doc/build/src/SphinxDocPrep.java (+127/-3) src/main/java/com/persistit/IntegrityCheck.java (+2/-2) src/main/java/com/persistit/JournalManager.java (+0/-1) src/main/java/com/persistit/JournalManagerBench.java (+4/-4) src/main/java/com/persistit/Persistit.java (+1/-1) src/test/java/com/persistit/Bug1041293Test.java (+1/-1) src/test/java/com/persistit/TrackingFileChannel.java (+3/-4) src/test/java/com/persistit/stress/unit/CommitBench.java (+2/-2) |
To merge this branch: | bzr merge lp:~pbeaman/akiban-persistit/release-3.1.7-prep |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Peter Beaman | Approve | ||
Review via email: mp+123836@code.launchpad.net |
Commit message
Description of the change
Updated release notes:
- reformatted to be more concise and readable
- added new bugs and changes for version 3.1.7.
- added code in documentation preparation classes to create the bug list table
Applied code-cleanup rules (mostly adding "final" to a number of declarations) for consistency.
LBJ: NO_BUILD
To post a comment you must log in.
- 367. By Peter Beaman
-
Typo in SphinxDocPrep.java
- 368. By Peter Beaman
-
Add the BugList file
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'doc/BugList' | |||
2 | --- doc/BugList 1970-01-01 00:00:00 +0000 | |||
3 | +++ doc/BugList 2012-09-11 21:38:18 +0000 | |||
4 | @@ -0,0 +1,145 @@ | |||
5 | 1 | 1044513 : 3.1.7 | ||
6 | 2 | |||
7 | 3 | `AssertionError in IntegrityCheckTest` | ||
8 | 4 | |||
9 | 5 | A bug in unit test code caused spurious assertion errors. | ||
10 | 6 | |||
11 | 7 | 1044397 : 3.1.7 | ||
12 | 8 | |||
13 | 9 | `IntegrityCheck throws ArrayIndexOutOfBoundsException` | ||
14 | 10 | |||
15 | 11 | IntegrityCheck and the CLI ``pview`` command were not immune to | ||
16 | 12 | certain inconsistent byte patterns in a corrupt page, making them | ||
17 | 13 | inadequate for diagnosing a severely corrupted database. | ||
18 | 14 | |||
19 | 15 | 1041293 : 3.1.7 | ||
20 | 16 | |||
21 | 17 | `Mismatched buffer pool sizes and volume page size results in NPE` | ||
22 | 18 | |||
23 | 19 | Attempting to open a Volume with a valid page size S resulted in a | ||
24 | 20 | NullPointerException if there was no buffer pool having page size | ||
25 | 21 | S specified. This same condition how throws an IllegalStateException. | ||
26 | 22 | |||
27 | 23 | 1043536 : 3.1.7 | ||
28 | 24 | |||
29 | 25 | `Build fails: persistit-coverage hangs with deadlock` | ||
30 | 26 | |||
31 | 27 | A bug in a unit test left a deadlock condition under certain race | ||
32 | 28 | conditions. Speed variations caused by clover instrumentation | ||
33 | 29 | triggered frequent occurrences. | ||
34 | 30 | |||
35 | 31 | 1036422 : 3.1.6 | ||
36 | 32 | |||
37 | 33 | `CommitPolicy HARD can soak CPU` | ||
38 | 34 | |||
39 | 35 | With CommitPolicy HARD we observed a CPU-soaking loop in the commit | ||
40 | 36 | logic. | ||
41 | 37 | |||
42 | 38 | 1032701 : 3.1.5 | ||
43 | 39 | |||
44 | 40 | `Interrupt causes Thread to exit without releasing claims` | ||
45 | 41 | |||
46 | 42 | If a thread was interrupted at an inopportune time (for example, | ||
47 | 43 | by query cancellation in Akiban Server), a page in the buffer pool | ||
48 | 44 | could be left in a locked state blocking all further progress. The | ||
49 | 45 | only remedy was to stop and restart the JVM. | ||
50 | 46 | |||
51 | 47 | 1028016 : 3.1.4 | ||
52 | 48 | |||
53 | 49 | `Old Journal Files Not Being Deleted` | ||
54 | 50 | |||
55 | 51 | If a volume was removed from the configuration and Persistit was | ||
56 | 52 | then restarted, the associated journal files would not be removed | ||
57 | 53 | due to internal safety checks. To support intentional removal of a | ||
58 | 54 | volume, a new configuration option was added. | ||
59 | 55 | |||
60 | 56 | See the ``Detecting and Ignoring Missing Volumes`` feature description | ||
61 | 57 | for more details. | ||
62 | 58 | |||
63 | 59 | |||
64 | 60 | 1024857,1026207 : 3.1.4 | ||
65 | 61 | |||
66 | 62 | `Class Index Updates Causing Write-Write Dependencies` | ||
67 | 63 | |||
68 | 64 | Custom classes that are serialized into keys or values through a | ||
69 | 65 | custom KeyCoder or ValueCoder are given a unique identifier. The | ||
70 | 66 | identifier was determined within an application transaction the | ||
71 | 67 | first time a class was written and stored in an internal tree. This | ||
72 | 68 | would cause seemingly spurious aborts if multiple application threads | ||
73 | 69 | simultaneously attempted to store the first instance of a given | ||
74 | 70 | class. The identifier is now committed within an independent | ||
75 | 71 | transaction. | ||
76 | 72 | |||
77 | 73 | 1028050,1028134 : 3.1.4 | ||
78 | 74 | |||
79 | 75 | `Accumulator Memory Usage and Transaction Step Policy` | ||
80 | 76 | |||
81 | 77 | Each individual change to an Accumulator was previously stored as | ||
82 | 78 | an individual Delta object. For long running transactions that | ||
83 | 79 | heavily utilized Accumulators, this would cause excessive memory | ||
84 | 80 | usage. These unique instances are now eliminated in most scenarios, | ||
85 | 81 | resulting in stable memory utilization in all but pathological | ||
86 | 82 | cases. | ||
87 | 83 | |||
88 | 84 | Additionally, the Accumulator handling of the Transaction step value | ||
89 | 85 | was inconsistent with how it was treated through an Exchange. Now, | ||
90 | 86 | both classes allow a transaction at a given step N to see any update | ||
91 | 87 | created by that transaction at a step less N. | ||
92 | 88 | |||
93 | 89 | |||
94 | 90 | 1005206 : 3.1.2 | ||
95 | 91 | |||
96 | 92 | `Infinite Loop When Repacking Buffer` | ||
97 | 93 | |||
98 | 94 | This could occur if a buffer required restructuring during pruning | ||
99 | 95 | of a long value that was previously stored under a transaction. | ||
100 | 96 | Upon the next save of this buffer to disk (e.g. shutdown), an | ||
101 | 97 | infinite loop would occur. | ||
102 | 98 | |||
103 | 99 | |||
104 | 100 | 1010079 : 3.1.2 | ||
105 | 101 | |||
106 | 102 | `Corruption Exceptions During Various Operations` | ||
107 | 103 | |||
108 | 104 | NOTE: Only the message indicates a database corruption. The data | ||
109 | 105 | volume is actually correct and intact. | ||
110 | 106 | |||
111 | 107 | This could occur if pruning a buffer containing a long record | ||
112 | 108 | previously stored under a transaction required removal of keys and | ||
113 | 109 | then that buffer was reused without further modification. A parallel | ||
114 | 110 | structure associated with the every Buffer, the FastIndex, was not | ||
115 | 111 | maintained during this operation. | ||
116 | 112 | |||
117 | 113 | 1012856 : 3.1.2 | ||
118 | 114 | |||
119 | 115 | `Slow Accumulator Operations` | ||
120 | 116 | |||
121 | 117 | If a thread starting a new transaction was interrupted during the | ||
122 | 118 | call to begin(), there was a chance for an internal object to wind | ||
123 | 119 | up in an invalid state. This invalid state caused no visible | ||
124 | 120 | consequences other than slower than expected Accumulator actions | ||
125 | 121 | if this had occurred many times. | ||
126 | 122 | |||
127 | 123 | |||
128 | 124 | 1017957 : 3.1.2 | ||
129 | 125 | |||
130 | 126 | `B+Tree Corruption in Stress Test` | ||
131 | 127 | |||
132 | 128 | An extremely rare combination of events corrupted memory structures | ||
133 | 129 | causing an incorrect key-pointer pair to be inserted while deleting | ||
134 | 130 | records in a key range. The bug was detected in an 8-hour stress | ||
135 | 131 | test run. | ||
136 | 132 | |||
137 | 133 | 1018526 : 3.1.2 | ||
138 | 134 | |||
139 | 135 | `Very long recovery time due to many temporary tree IT records` | ||
140 | 136 | |||
141 | 137 | Every Tree created in a temporary volume was being assigned a tree | ||
142 | 138 | handle recorded permanently in the journal. In one case the result | ||
143 | 139 | was a journal containing millions of IT (Identify Tree) records, | ||
144 | 140 | and these caused normal recovery to take a very long time. The fix | ||
145 | 141 | keeps temporary trees out of the journal and removes IT records | ||
146 | 142 | which may have been added previously. | ||
147 | 143 | |||
148 | 144 | |||
149 | 145 | |||
150 | 0 | 146 | ||
151 | === modified file 'doc/Configuration.rst' | |||
152 | --- doc/Configuration.rst 2012-08-23 21:10:56 +0000 | |||
153 | +++ doc/Configuration.rst 2012-09-11 21:38:18 +0000 | |||
154 | @@ -185,7 +185,24 @@ | |||
155 | 185 | 185 | ||
156 | 186 | The journal is written by appending records to the end of the highest-numbered file. Read operations occur while copying page images from the journal to their home volume files. While copying, Persistit attempts to perform large sequential read operations from the journal. Read operations also occur at random when Persistit needs to reload the image of a previously evicted page. | 186 | The journal is written by appending records to the end of the highest-numbered file. Read operations occur while copying page images from the journal to their home volume files. While copying, Persistit attempts to perform large sequential read operations from the journal. Read operations also occur at random when Persistit needs to reload the image of a previously evicted page. |
157 | 187 | 187 | ||
159 | 188 | Because of these characteristics a modern SSD (solid disk drive) is ideally suited for maintaining the journal. If no SSD is available in the server, placing the journal on a different physical disk drive than the volume file(s) can significantly improve performance. | 188 | Because of these characteristics a modern enterprise SSD (solid disk drive) is ideally suited for maintaining the journal. If no SSD is available in the server, placing the journal on a different physical disk drive than the volume file(s) can significantly improve performance. |
160 | 189 | |||
161 | 190 | However, beware of consumer-grade SSDs. Some may cache writes and record them on non-volatile storage much later. In a power failure event, committed transactions recorded only in the write cache can be lost. The durability of committed transactions can only be guaranteed if the hardware stack cooperates in making sure all writes are durable. | ||
162 | 191 | |||
163 | 192 | Buffer Pool Preload | ||
164 | 193 | ------------------- | ||
165 | 194 | |||
166 | 195 | Persistit includes an optional facility to record periodically an inventory of pages in the buffer pool. When Persistit starts up it attempts to re-read the same pages that were previously in the buffer pool so that performance after restart on a similar workload (e.g., queries that exhibit a moderate or strong degree of locality-of-reference) will run at full speed. This facility can be especially important in large buffer pool configurations in which under normal workloads a server may otherwise require minutes to hours to reach optimal speed due to a large number of random reads. Re-reading the inventory at startup can be much faster since pages are read in approximate physical order. | ||
167 | 196 | |||
168 | 197 | This facility is controlled by two configuration parameters: | ||
169 | 198 | |||
170 | 199 | - ``com.persistit.Configuration#setBufferInventoryEnabled`` controls whether Persistit records the inventory. If enabled, the recording happens once per Checkpoint and once at normal shutdown. The inventory is stored in the system volume. | ||
171 | 200 | |||
172 | 201 | - ``com.persistit.Configuration#setBufferPreloadEnabled`` controls whether Persistit attempts to preload the buffer pool during startup. If there is a recorded inventory Persistit attempts to re-read the pages that were previously present; otherwise it silently continues the startup. | ||
173 | 202 | |||
174 | 203 | If upon restart the buffer pool has become smaller so that the inventory is larger than the current buffer pool, Persistit only loads as many pages as there currently are buffers. | ||
175 | 204 | |||
176 | 205 | Although by default these configuration properties are false, we recommend enabling them for production servers because the inventory process takes very little time, and buffer preload can restore the buffer pool to a useful working set orders of magnitude faster than warming it up through normal load. | ||
177 | 189 | 206 | ||
178 | 190 | Other Configuration Parameters | 207 | Other Configuration Parameters |
179 | 191 | ------------------------------ | 208 | ------------------------------ |
180 | @@ -232,14 +249,14 @@ | |||
181 | 232 | only when no adapter has been installed. | 249 | only when no adapter has been installed. |
182 | 233 | 250 | ||
183 | 234 | ``bufferinventory``: (``com.persistit.Configuration#setBufferInventoryEnabled``), True or False (default). | 251 | ``bufferinventory``: (``com.persistit.Configuration#setBufferInventoryEnabled``), True or False (default). |
185 | 235 | If true, Persistit periodically records an inventory of all the buffes in the buffers pools to the System Volume. The inventory | 252 | If true, Persistit periodically records an inventory of all the pages in the buffers pools to the System Volume. The inventory |
186 | 236 | enables Persistit to preload the buffer pools then next time it starts up with approximately the same pages that were present | 253 | enables Persistit to preload the buffer pools then next time it starts up with approximately the same pages that were present |
187 | 237 | before shutdown. To enable buffer preloading, the bufferpreload property must also be true. | 254 | before shutdown. To enable buffer preloading, the bufferpreload property must also be true. |
188 | 238 | 255 | ||
189 | 239 | ``bufferpreload``: (``com.persistit.Configuration#setBufferPreloadEnabled``), True or False (default). | 256 | ``bufferpreload``: (``com.persistit.Configuration#setBufferPreloadEnabled``), True or False (default). |
190 | 240 | If true, and if a buffer pool inventory was previously recorded, Persistit attempts to "warm up" the buffer pool | 257 | If true, and if a buffer pool inventory was previously recorded, Persistit attempts to "warm up" the buffer pool |
191 | 241 | by preloading pages that were present in the buffer pool when Persistit last shut down. This may allow a freshly started | 258 | by preloading pages that were present in the buffer pool when Persistit last shut down. This may allow a freshly started |
193 | 242 | Persistit instance to begin service a workload similar to what it had previously been processing without incurring the | 259 | Persistit instance to begin servicing a workload similar to what it had previously been handling without incurring the |
194 | 243 | cost of many random disk reads to load pages. | 260 | cost of many random disk reads to load pages. |
195 | 244 | 261 | ||
196 | 245 | 262 | ||
197 | 246 | 263 | ||
198 | === modified file 'doc/ReleaseNotes.rst' | |||
199 | --- doc/ReleaseNotes.rst 2012-08-24 18:16:21 +0000 | |||
200 | +++ doc/ReleaseNotes.rst 2012-09-11 21:38:18 +0000 | |||
201 | @@ -44,207 +44,81 @@ | |||
202 | 44 | | | 44 | | |
203 | 45 | | | 45 | | |
204 | 46 | 46 | ||
274 | 47 | 47 | Version History | |
275 | 48 | ************************************ | 48 | =============== |
276 | 49 | 3.1.6 | 49 | |
277 | 50 | ************************************ | 50 | +---------+--------------------+--------------------------------------------------------------------------+ |
278 | 51 | 51 | | Version | Release Date | Summary | | |
279 | 52 | Release Date | 52 | +=========+====================+==========================================================================+ |
280 | 53 | ============ | 53 | | 3.1.7 | September 11, 2012 | Fix several bugs, add buffer pool preload ("warm-up"), | |
281 | 54 | August 24, 2012 | 54 | | | | reformat code base | |
282 | 55 | 55 | +---------+--------------------+--------------------------------------------------------------------------+ | |
283 | 56 | Overview | 56 | | 3.1.6 | August 24, 2012 | Fix bug 1036422 | |
284 | 57 | ======== | 57 | +---------+--------------------+--------------------------------------------------------------------------+ |
285 | 58 | This version of Persistit fixes one bug. | 58 | | 3.1.5 | August 6, 2012 | Fix bug 1032701, modify pom.xml for Eclipse Juno | |
286 | 59 | 59 | +---------+--------------------+--------------------------------------------------------------------------+ | |
287 | 60 | Fixed Issues | 60 | | 3.1.4 | August 3, 2012 | License changed to Eclipse Public License, various other enhancements | |
288 | 61 | ============ | 61 | +---------+--------------------+--------------------------------------------------------------------------+ |
289 | 62 | 62 | | 3.1.2 | July 13, 2012 | Fix several bugs | | |
290 | 63 | https://bugs.launchpad.net/akiban-persistit/+bug/1036422 | 63 | +---------+--------------------+--------------------------------------------------------------------------+ |
291 | 64 | 64 | | 3.1.1 | May 31, 2012 | First open source release of Akiban Persistit | | |
292 | 65 | With CommitPolicy HARD we observed a CPU-soaking loop in the commit logic. | 65 | +---------+--------------------+--------------------------------------------------------------------------+ |
293 | 66 | 66 | ||
294 | 67 | ************************************ | 67 | |
295 | 68 | 3.1.5 | 68 | Resolved Issues |
296 | 69 | ************************************ | 69 | =============== |
297 | 70 | 70 | ||
298 | 71 | Release Date | 71 | {{bug-list}} |
299 | 72 | ============ | 72 | |
300 | 73 | August 6, 2012 | 73 | Changes and New Features |
301 | 74 | 74 | ======================== | |
302 | 75 | Overview | 75 | |
303 | 76 | ======== | 76 | Persistit 3.1.7 - Code Base Reformatted |
304 | 77 | This version of Persistit changes the pom.xml to a form compatible with the Maven central repository and includes one bug fix. | 77 | --------------------------------------- |
305 | 78 | 78 | ||
306 | 79 | Fixed Issue | 79 | 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 |
307 | 80 | =========== | 80 | 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. |
308 | 81 | 81 | ||
309 | 82 | https://launchpad.net/akiban-persistit/+bug/1032701 | 82 | Persistit 3.1.7 - Buffer Pool Preload |
310 | 83 | 83 | ------------------------------------- | |
311 | 84 | If a thread was interrupted at an inopportune time (for example, by query cancellation in Akiban Server), a page in the buffer pool could be left in a locked state blocking all further progress. The only remedy was to stop and restart the JVM. | 84 | |
312 | 85 | 85 | 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. | |
313 | 86 | | | 86 | |
314 | 87 | | | 87 | 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. |
315 | 88 | 88 | ||
316 | 89 | ************************************ | 89 | Two new configuration properties com.persistit.Configuration#setBufferInventoryEnabled and com.persistit#setBufferPreloadEnabled control this behavior. These settings are turned off by default in version 3.1.7. |
317 | 90 | 3.1.4 | 90 | |
318 | 91 | ************************************ | 91 | Persistit 3.1.4 - Detecting and Ignoring Missing Volumes |
319 | 92 | 92 | -------------------------------------------------------- | |
320 | 93 | Release Date | 93 | |
321 | 94 | ============ | 94 | 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. |
322 | 95 | August 3, 2012 | 95 | |
323 | 96 | 96 | 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. | |
324 | 97 | Overview | 97 | |
325 | 98 | ======== | 98 | |
326 | 99 | This version of Persistit changes the licensing to Eclipse Public License (EPL) and includes minor enhancements and bug fixes. | 99 | Persistit 3.1.4 - Reduce KeyCoder Serialized Object Size |
327 | 100 | 100 | -------------------------------------------------------- | |
259 | 101 | New Features | ||
260 | 102 | ============ | ||
261 | 103 | |||
262 | 104 | Detection and Ignoring of Missing Volumes | ||
263 | 105 | ----------------------------------------- | ||
264 | 106 | |||
265 | 107 | Warnings are now issues when a previously existing volume is missing, and an option to allow a system to continue by ignoring pages and transactions in the journal from missing volumes. | ||
266 | 108 | |||
267 | 109 | 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. | ||
268 | 110 | |||
269 | 111 | 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 ignoreMissingVolumes to true, see com.persistit.Configuration#setIgnoreMissingViolumes. | ||
270 | 112 | |||
271 | 113 | |||
272 | 114 | Reduce KeyCoder Serialized Object Size | ||
273 | 115 | -------------------------------------- | ||
328 | 116 | 101 | ||
329 | 117 | .. note:: | 102 | .. note:: |
330 | 118 | Any Database containing objects serialized by a custom KeyCoder from a previous version of Persistit is incompatible with this change | 103 | Any Database containing objects serialized by a custom KeyCoder from a previous version of Persistit is incompatible with this change |
331 | 119 | 104 | ||
332 | 120 | Minimize the per-instance overhead for application objects written into Persistit Keys by reducing the size of the internal identifier. | 105 | Minimize the per-instance overhead for application objects written into Persistit Keys by reducing the size of the internal identifier. |
333 | 121 | 106 | ||
335 | 122 | 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, in many cases, halve the serialized size. | 107 | 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. |
336 | 123 | 108 | ||
339 | 124 | Maven POM Changes For Eclipse Juno | 109 | Persistit 3.1.4 - Maven POM Changes For Eclipse Juno |
340 | 125 | ---------------------------------- | 110 | ---------------------------------------------------- |
341 | 126 | 111 | ||
342 | 127 | 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. | 112 | 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. |
343 | 128 | 113 | ||
344 | 129 | Please contact Akiban if you have encounter any issues getting up and running with Persistit. | 114 | Please contact Akiban if you have encounter any issues getting up and running with Persistit. |
345 | 130 | 115 | ||
441 | 131 | Fixed Issues | 116 | Persistit 3.1.2 - Asserts Added to Check for Correct Exchange Thread Behavior |
442 | 132 | ============ | 117 | ----------------------------------------------------------------------------- |
348 | 133 | |||
349 | 134 | Old Journal Files Not Being Deleted | ||
350 | 135 | ----------------------------------- | ||
351 | 136 | |||
352 | 137 | https://launchpad.net/akiban-persistit/+bug/1028016 | ||
353 | 138 | |||
354 | 139 | If a volume was removed from the configuration and Persistit was restarted the associated journal files would not be removed due to internal safety checks. In the event that the missing volume is intended behavior, a new configuration option was added. See the ``Detection and Ignoring of Missing Volumes`` feature description for more details. | ||
355 | 140 | |||
356 | 141 | Class Index Updates Causing Write-Write Dependencies | ||
357 | 142 | ---------------------------------------------------- | ||
358 | 143 | |||
359 | 144 | https://launchpad.net/akiban-persistit/+bug/1024857 | ||
360 | 145 | |||
361 | 146 | https://launchpad.net/akiban-persistit/+bug/1026207 | ||
362 | 147 | |||
363 | 148 | Custom classes that are serialized into keys or values, through a custom KeyCoder or ValueCoder, are given a unique identifier. The identifier is determined transactionally the first time a class is written and stored in an internal tree. This would cause seemingly spurious aborts if more than one application threads simultaneously attempt to store the first instance of a given class. | ||
364 | 149 | |||
365 | 150 | Accumulator Memory Usage and Transaction Step Policy | ||
366 | 151 | ---------------------------------------------------- | ||
367 | 152 | |||
368 | 153 | https://launchpad.net/akiban-persistit/+bug/1028050 | ||
369 | 154 | |||
370 | 155 | https://launchpad.net/akiban-persistit/+bug/1028134 | ||
371 | 156 | |||
372 | 157 | Changes to Accumulators are stored were previously stored as individual Delta objects. For long running transactions that heavily utilized Accumulators, this would cause excessive memory usage. These unique instances are no eliminated in most scenarios, resulting in no memory growth in all but pathological cases. | ||
373 | 158 | |||
374 | 159 | Additionally, the Accumulator handling of the Transaction step value was inconsistent with how it was treated through an Exchange. Now, both classes allow a given step x to see any change that occurred at a step less than or equal to itself. | ||
375 | 160 | |||
376 | 161 | |||
377 | 162 | Known Issues | ||
378 | 163 | ============ | ||
379 | 164 | As described in the *3.1.1 Known Issues*. | ||
380 | 165 | |||
381 | 166 | | | ||
382 | 167 | | | ||
383 | 168 | |||
384 | 169 | ************************************ | ||
385 | 170 | 3.1.2 | ||
386 | 171 | ************************************ | ||
387 | 172 | |||
388 | 173 | Release Date | ||
389 | 174 | ============ | ||
390 | 175 | July 13, 2012 | ||
391 | 176 | |||
392 | 177 | Overview | ||
393 | 178 | ======== | ||
394 | 179 | This is a bug fix release of the Persistit project (https://launchpad.net/akiban-persistit). | ||
395 | 180 | |||
396 | 181 | Fixed Issues | ||
397 | 182 | ============ | ||
398 | 183 | |||
399 | 184 | Infinite Loop When Repacking Buffer | ||
400 | 185 | ----------------------------------- | ||
401 | 186 | |||
402 | 187 | https://bugs.launchpad.net/bugs/1005206 | ||
403 | 188 | |||
404 | 189 | This was introduced late into the 3.1.1 development cycle. This could occur if a buffer required restructuring during pruning of a long value that was previously stored under a transaction. Upon the next save of this buffer to disk (e.g. shutdown), an infinite loop would occur. | ||
405 | 190 | |||
406 | 191 | Corruption Exceptions During Various Operations | ||
407 | 192 | ----------------------------------------------- | ||
408 | 193 | |||
409 | 194 | https://bugs.launchpad.net/bugs/1010079 | ||
410 | 195 | |||
411 | 196 | .. note:: | ||
412 | 197 | Only the message indicates a database corruption. The data volume is actually correct and intact. | ||
413 | 198 | |||
414 | 199 | This was introduced late into the 3.1.1 development cycle. This could occur if pruning a buffer containing a long record previously stored under a transaction required removal of keys and then that buffer was reused without further modification. A parallel structure associated with the every ``Buffer``, the ``FastIndex``, was not maintained during this operation. | ||
415 | 200 | |||
416 | 201 | Slow Accumulator Operations | ||
417 | 202 | --------------------------- | ||
418 | 203 | |||
419 | 204 | https://bugs.launchpad.net/bugs/1012859 | ||
420 | 205 | |||
421 | 206 | This bug preexisted but was unknown to the 3.1.1 release. If a thread starting a new transaction was interrupted during the call to ``begin()``, there was a chance for an internal object to wind up in an invalid state. This invalid state caused no visible consequences other than slower than expected ``Accumulator`` actions if this had occurred many times. | ||
422 | 207 | |||
423 | 208 | B+Tree Corruption in Stress Test | ||
424 | 209 | -------------------------------- | ||
425 | 210 | |||
426 | 211 | https://bugs.launchpad.net/akiban-persistit/+bug/1017957 | ||
427 | 212 | |||
428 | 213 | This bug preexisted but was unknown to the 3.1.1 release. An extremely rare combination of events corrupted memory structures causing an incorrect key-pointer pair to be inserted while deleting records in a key range. The bug was detected in an 8-hour stress test run. | ||
429 | 214 | |||
430 | 215 | |||
431 | 216 | Slow Recovery Due to Temporary Tree IT Records | ||
432 | 217 | ---------------------------------------------- | ||
433 | 218 | |||
434 | 219 | https://bugs.launchpad.net/akiban-persistit/+bug/1018526 | ||
435 | 220 | |||
436 | 221 | This bug preexisted but was unknown to the 3.1.1 release. Every Tree created in a temporary volume was being assigned a tree handle recorded permanently in the journal. In one case the result was a journal containing millions of IT (Identify Tree) records, and these caused normal recovery to take a very long time. The fix keeps temporary trees out of the journal and removes IT records which may have been added previously. | ||
437 | 222 | |||
438 | 223 | |||
439 | 224 | Asserts Added to Check for Correct Exchange Thread Behavior | ||
440 | 225 | ----------------------------------------------------------- | ||
443 | 226 | 118 | ||
444 | 227 | 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. | 119 | 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. |
465 | 228 | 120 | ||
466 | 229 | 121 | ||
447 | 230 | Known Issues | ||
448 | 231 | ============ | ||
449 | 232 | As described in the *3.1.1 Known Issues*. | ||
450 | 233 | |||
451 | 234 | | | ||
452 | 235 | | | ||
453 | 236 | |||
454 | 237 | ************************************ | ||
455 | 238 | 3.1.1 | ||
456 | 239 | ************************************ | ||
457 | 240 | |||
458 | 241 | Release Date | ||
459 | 242 | ============ | ||
460 | 243 | May 31, 2012 | ||
461 | 244 | |||
462 | 245 | Overview | ||
463 | 246 | ======== | ||
464 | 247 | This is the first open source release of the Persistit project (https://launchpad.net/akiban-persistit). | ||
467 | 248 | 122 | ||
468 | 249 | Known Issues | 123 | Known Issues |
469 | 250 | ============ | 124 | ============ |
470 | @@ -283,7 +157,8 @@ | |||
471 | 283 | https://bugs.launchpad.net/akiban-persistit/+bug/1000331 | 157 | https://bugs.launchpad.net/akiban-persistit/+bug/1000331 |
472 | 284 | 158 | ||
473 | 285 | 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. | 159 | 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. |
474 | 160 | |||
475 | 286 | * 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. | 161 | * 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. |
476 | 287 | 162 | ||
478 | 288 | * Workaround 2: To reduce the size of the volume you can use the CLI commands save and load to offload and then 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. | 163 | * 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. |
479 | 289 | 164 | ||
480 | 290 | 165 | ||
481 | === modified file 'doc/build/src/SphinxDocPrep.java' | |||
482 | --- doc/build/src/SphinxDocPrep.java 2012-06-11 21:25:37 +0000 | |||
483 | +++ doc/build/src/SphinxDocPrep.java 2012-09-11 21:38:18 +0000 | |||
484 | @@ -2,7 +2,10 @@ | |||
485 | 2 | import java.io.File; | 2 | import java.io.File; |
486 | 3 | import java.io.FileReader; | 3 | import java.io.FileReader; |
487 | 4 | import java.io.FileWriter; | 4 | import java.io.FileWriter; |
488 | 5 | import java.io.IOException; | ||
489 | 5 | import java.io.PrintWriter; | 6 | import java.io.PrintWriter; |
490 | 7 | import java.util.ArrayList; | ||
491 | 8 | import java.util.List; | ||
492 | 6 | import java.util.SortedMap; | 9 | import java.util.SortedMap; |
493 | 7 | import java.util.regex.Matcher; | 10 | import java.util.regex.Matcher; |
494 | 8 | import java.util.regex.Pattern; | 11 | import java.util.regex.Pattern; |
495 | @@ -68,7 +71,10 @@ | |||
496 | 68 | } | 71 | } |
497 | 69 | 72 | ||
498 | 70 | private void processLine(final String line) throws Exception { | 73 | private void processLine(final String line) throws Exception { |
500 | 71 | if (line.contains(".. code-block:") || line.endsWith("::")) { | 74 | if (line.contains("{{bug-list}}")) { |
501 | 75 | prepareBugList(); | ||
502 | 76 | return; | ||
503 | 77 | } else if (line.contains(".. code-block:") || line.endsWith("::")) { | ||
504 | 72 | block = BlockState.WAIT_FIRST_BLANK_LINE; | 78 | block = BlockState.WAIT_FIRST_BLANK_LINE; |
505 | 73 | } else if (line.isEmpty()) { | 79 | } else if (line.isEmpty()) { |
506 | 74 | switch (block) { | 80 | switch (block) { |
507 | @@ -134,14 +140,132 @@ | |||
508 | 134 | text = text.replace("com.persistit.", ""); | 140 | text = text.replace("com.persistit.", ""); |
509 | 135 | text = text.replace("java.lang.", ""); | 141 | text = text.replace("java.lang.", ""); |
510 | 136 | text = text.replace("java.util.", ""); | 142 | text = text.replace("java.util.", ""); |
512 | 137 | replacement= "`" + text + " <" + url + ">`_"; | 143 | replacement = "`" + text + " <" + url + ">`_"; |
513 | 138 | } | 144 | } |
514 | 139 | } | 145 | } |
515 | 140 | 146 | ||
516 | 141 | matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement)); | 147 | matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement)); |
517 | 142 | } | 148 | } |
518 | 143 | 149 | ||
519 | 150 | private void prepareBugList() throws IOException { | ||
520 | 151 | List<String[]> rows = new ArrayList<String[]>(); | ||
521 | 152 | rows.add(new String[] { "Bug Reference", "Fixed in|Version", "Summary" }); | ||
522 | 153 | BufferedReader reader = null; | ||
523 | 154 | try { | ||
524 | 155 | String urls = ""; | ||
525 | 156 | String version = ""; | ||
526 | 157 | reader = new BufferedReader(new FileReader("../BugList")); | ||
527 | 158 | StringBuilder sb = new StringBuilder(); | ||
528 | 159 | String line = null; | ||
529 | 160 | while ((line = reader.readLine()) != null) { | ||
530 | 161 | if (line.isEmpty()) { | ||
531 | 162 | if (sb.length() > 0) { | ||
532 | 163 | sb.append('|'); | ||
533 | 164 | } | ||
534 | 165 | } else if (Character.isDigit(line.charAt(0))) { | ||
535 | 166 | if (!urls.isEmpty()) { | ||
536 | 167 | rows.add(new String[] { urls, version, sb.toString() }); | ||
537 | 168 | urls = ""; | ||
538 | 169 | version = ""; | ||
539 | 170 | sb.setLength(0); | ||
540 | 171 | } | ||
541 | 172 | String[] split = line.split("\\:"); | ||
542 | 173 | for (final String bug : split[0].trim().split(",")) { | ||
543 | 174 | if (urls.length() > 0) { | ||
544 | 175 | urls += '|'; | ||
545 | 176 | } | ||
546 | 177 | urls = urls + "https://launchpad.net/bugs/" + bug; | ||
547 | 178 | } | ||
548 | 179 | version = split[1].trim(); | ||
549 | 180 | } else { | ||
550 | 181 | sb.append(line.trim()); | ||
551 | 182 | if (sb.length() > 0) { | ||
552 | 183 | sb.append('|'); | ||
553 | 184 | } | ||
554 | 185 | } | ||
555 | 186 | } | ||
556 | 187 | if (!urls.isEmpty()) { | ||
557 | 188 | rows.add(new String[] { urls, version, sb.toString() }); | ||
558 | 189 | } | ||
559 | 190 | |||
560 | 191 | int[] maxWidth = new int[3]; | ||
561 | 192 | for (final String[] row : rows) { | ||
562 | 193 | for (int i = 0; i < 3; i++) { | ||
563 | 194 | for (String s : row[i].split("\\|")) { | ||
564 | 195 | maxWidth[i] = Math.max(s.length(), maxWidth[i]); | ||
565 | 196 | } | ||
566 | 197 | } | ||
567 | 198 | } | ||
568 | 199 | |||
569 | 200 | bugTableLine(sb, false, maxWidth); | ||
570 | 201 | for (int l = 0;; l++) { | ||
571 | 202 | if (bugTableText(sb, rows.get(0), maxWidth, l)) { | ||
572 | 203 | break; | ||
573 | 204 | } | ||
574 | 205 | } | ||
575 | 206 | bugTableLine(sb, true, maxWidth); | ||
576 | 207 | for (int i = 1; i < rows.size(); i++) { | ||
577 | 208 | String[] text = rows.get(i); | ||
578 | 209 | for (int l = 0;; l++) { | ||
579 | 210 | if (bugTableText(sb, text, maxWidth, l)) { | ||
580 | 211 | break; | ||
581 | 212 | } | ||
582 | 213 | } | ||
583 | 214 | bugTableLine(sb, false, maxWidth); | ||
584 | 215 | } | ||
585 | 216 | } catch (IOException e) { | ||
586 | 217 | System.out.println(e + " while trying to read BugList"); | ||
587 | 218 | } finally { | ||
588 | 219 | if (reader != null) { | ||
589 | 220 | reader.close(); | ||
590 | 221 | } | ||
591 | 222 | } | ||
592 | 223 | } | ||
593 | 224 | |||
594 | 225 | private void bugTableLine(StringBuilder sb, boolean dline, int[] width) { | ||
595 | 226 | sb.setLength(0); | ||
596 | 227 | sb.append('+'); | ||
597 | 228 | for (int j = 0; j < 3; j++) { | ||
598 | 229 | for (int i = 0; i < width[j] + 2; i++) { | ||
599 | 230 | sb.append(dline ? '=' : '-'); | ||
600 | 231 | } | ||
601 | 232 | sb.append('+'); | ||
602 | 233 | } | ||
603 | 234 | writer.println(sb); | ||
604 | 235 | writer.flush(); | ||
605 | 236 | } | ||
606 | 237 | |||
607 | 238 | private boolean bugTableText(StringBuilder sb, String[] text, int[] width, int line) { | ||
608 | 239 | String[] s = new String[3]; | ||
609 | 240 | boolean done = true; | ||
610 | 241 | for (int j = 0; j < 3; j++) { | ||
611 | 242 | String[] split = text[j].split("\\|"); | ||
612 | 243 | if (split.length > line) { | ||
613 | 244 | done = false; | ||
614 | 245 | s[j] = split[line]; | ||
615 | 246 | } | ||
616 | 247 | } | ||
617 | 248 | if (!done) { | ||
618 | 249 | sb.setLength(0); | ||
619 | 250 | sb.append("|"); | ||
620 | 251 | for (int j = 0; j < 3; j++) { | ||
621 | 252 | if (s[j] == null) { | ||
622 | 253 | s[j] = ""; | ||
623 | 254 | } | ||
624 | 255 | sb.append(' '); | ||
625 | 256 | sb.append(s[j]); | ||
626 | 257 | for (int i = s[j].length() + 1; i < width[j] + 2; i++) { | ||
627 | 258 | sb.append(' '); | ||
628 | 259 | } | ||
629 | 260 | sb.append('|'); | ||
630 | 261 | } | ||
631 | 262 | writer.println(sb); | ||
632 | 263 | } | ||
633 | 264 | writer.flush(); | ||
634 | 265 | return done; | ||
635 | 266 | } | ||
636 | 267 | |||
637 | 144 | public static void main(final String[] args) throws Exception { | 268 | public static void main(final String[] args) throws Exception { |
639 | 145 | new SphinxDocPrep().prepare(args); | 269 | new SphinxDocPrep().prepare(args); |
640 | 146 | } | 270 | } |
641 | 147 | } | 271 | } |
642 | 148 | 272 | ||
643 | === modified file 'src/main/java/com/persistit/IntegrityCheck.java' | |||
644 | --- src/main/java/com/persistit/IntegrityCheck.java 2012-08-31 14:06:47 +0000 | |||
645 | +++ src/main/java/com/persistit/IntegrityCheck.java 2012-09-11 21:38:18 +0000 | |||
646 | @@ -1158,7 +1158,7 @@ | |||
647 | 1158 | } | 1158 | } |
648 | 1159 | } | 1159 | } |
649 | 1160 | } | 1160 | } |
651 | 1161 | } catch (Exception e) { | 1161 | } catch (final Exception e) { |
652 | 1162 | addFault(e.toString(), page, level, 0); | 1162 | addFault(e.toString(), page, level, 0); |
653 | 1163 | } | 1163 | } |
654 | 1164 | return true; | 1164 | return true; |
655 | @@ -1213,7 +1213,7 @@ | |||
656 | 1213 | 1213 | ||
657 | 1214 | fromPage = longPage; | 1214 | fromPage = longPage; |
658 | 1215 | longPage = longBuffer.getRightSibling(); | 1215 | longPage = longBuffer.getRightSibling(); |
660 | 1216 | } catch (Exception e) { | 1216 | } catch (final Exception e) { |
661 | 1217 | addFault(e.toString() + " while verifying long record page " + longPage, page, 0, foundAt); | 1217 | addFault(e.toString() + " while verifying long record page " + longPage, page, 0, foundAt); |
662 | 1218 | break; | 1218 | break; |
663 | 1219 | } finally { | 1219 | } finally { |
664 | 1220 | 1220 | ||
665 | === modified file 'src/main/java/com/persistit/JournalManager.java' | |||
666 | --- src/main/java/com/persistit/JournalManager.java 2012-08-28 16:15:27 +0000 | |||
667 | +++ src/main/java/com/persistit/JournalManager.java 2012-09-11 21:38:18 +0000 | |||
668 | @@ -29,7 +29,6 @@ | |||
669 | 29 | import java.util.Collections; | 29 | import java.util.Collections; |
670 | 30 | import java.util.Comparator; | 30 | import java.util.Comparator; |
671 | 31 | import java.util.HashMap; | 31 | import java.util.HashMap; |
672 | 32 | import java.util.HashSet; | ||
673 | 33 | import java.util.Iterator; | 32 | import java.util.Iterator; |
674 | 34 | import java.util.List; | 33 | import java.util.List; |
675 | 35 | import java.util.Map; | 34 | import java.util.Map; |
676 | 36 | 35 | ||
677 | === modified file 'src/main/java/com/persistit/JournalManagerBench.java' | |||
678 | --- src/main/java/com/persistit/JournalManagerBench.java 2012-08-20 19:24:58 +0000 | |||
679 | +++ src/main/java/com/persistit/JournalManagerBench.java 2012-09-11 21:38:18 +0000 | |||
680 | @@ -123,7 +123,7 @@ | |||
681 | 123 | } | 123 | } |
682 | 124 | if (remaining > buffer.capacity()) { | 124 | if (remaining > buffer.capacity()) { |
683 | 125 | remaining = buffer.capacity(); | 125 | remaining = buffer.capacity(); |
685 | 126 | long unaligned = fc.size() % 16384; | 126 | final long unaligned = fc.size() % 16384; |
686 | 127 | if (unaligned > 0) { | 127 | if (unaligned > 0) { |
687 | 128 | remaining = remaining - (16384 - unaligned); | 128 | remaining = remaining - (16384 - unaligned); |
688 | 129 | } | 129 | } |
689 | @@ -139,12 +139,12 @@ | |||
690 | 139 | 139 | ||
691 | 140 | private void doOneCycle(final long time, final int align, final long extension, final int size) throws Exception { | 140 | private void doOneCycle(final long time, final int align, final long extension, final int size) throws Exception { |
692 | 141 | // Make a fake transaction record | 141 | // Make a fake transaction record |
695 | 142 | String header = String.format("\nsize=%06d count=%06d time=%012d\n", size, count, time); | 142 | final String header = String.format("\nsize=%06d count=%06d time=%012d\n", size, count, time); |
696 | 143 | byte[] b = header.getBytes(); | 143 | final byte[] b = header.getBytes(); |
697 | 144 | System.arraycopy(b, 0, bytes, 0, b.length); | 144 | System.arraycopy(b, 0, bytes, 0, b.length); |
698 | 145 | 145 | ||
699 | 146 | // Add the record, possibly offset to maintaining alignment | 146 | // Add the record, possibly offset to maintaining alignment |
701 | 147 | int toRewrite = (int) (currentAddress - writeAddress); | 147 | final int toRewrite = (int) (currentAddress - writeAddress); |
702 | 148 | buffer.position(toRewrite); | 148 | buffer.position(toRewrite); |
703 | 149 | buffer.put(bytes, 0, size); | 149 | buffer.put(bytes, 0, size); |
704 | 150 | boolean extended = false; | 150 | boolean extended = false; |
705 | 151 | 151 | ||
706 | === modified file 'src/main/java/com/persistit/Persistit.java' | |||
707 | --- src/main/java/com/persistit/Persistit.java 2012-08-31 20:20:13 +0000 | |||
708 | +++ src/main/java/com/persistit/Persistit.java 2012-09-11 21:38:18 +0000 | |||
709 | @@ -725,7 +725,7 @@ | |||
710 | 725 | for (final BufferPool pool : _bufferPoolTable.values()) { | 725 | for (final BufferPool pool : _bufferPoolTable.values()) { |
711 | 726 | try { | 726 | try { |
712 | 727 | pool.recordBufferInventory(timestamp); | 727 | pool.recordBufferInventory(timestamp); |
714 | 728 | } catch (PersistitException e) { | 728 | } catch (final PersistitException e) { |
715 | 729 | getLogBase().bufferInventoryException.log(e); | 729 | getLogBase().bufferInventoryException.log(e); |
716 | 730 | } | 730 | } |
717 | 731 | } | 731 | } |
718 | 732 | 732 | ||
719 | === modified file 'src/test/java/com/persistit/Bug1041293Test.java' | |||
720 | --- src/test/java/com/persistit/Bug1041293Test.java 2012-09-04 21:01:23 +0000 | |||
721 | +++ src/test/java/com/persistit/Bug1041293Test.java 2012-09-11 21:38:18 +0000 | |||
722 | @@ -34,7 +34,7 @@ | |||
723 | 34 | final Configuration config = _persistit.getConfiguration(); | 34 | final Configuration config = _persistit.getConfiguration(); |
724 | 35 | final VolumeSpecification vspec = config.volumeSpecification("${datapath}/test,pageSize:2048,create," | 35 | final VolumeSpecification vspec = config.volumeSpecification("${datapath}/test,pageSize:2048,create," |
725 | 36 | + "initialPages:100,extensionPages:100,maximumPages:25000"); | 36 | + "initialPages:100,extensionPages:100,maximumPages:25000"); |
727 | 37 | Volume volume = _persistit.loadVolume(vspec); | 37 | final Volume volume = _persistit.loadVolume(vspec); |
728 | 38 | volume.open(_persistit); | 38 | volume.open(_persistit); |
729 | 39 | } | 39 | } |
730 | 40 | 40 | ||
731 | 41 | 41 | ||
732 | === modified file 'src/test/java/com/persistit/TrackingFileChannel.java' | |||
733 | --- src/test/java/com/persistit/TrackingFileChannel.java 2012-08-27 17:31:02 +0000 | |||
734 | +++ src/test/java/com/persistit/TrackingFileChannel.java 2012-09-11 21:38:18 +0000 | |||
735 | @@ -15,9 +15,8 @@ | |||
736 | 15 | 15 | ||
737 | 16 | package com.persistit; | 16 | package com.persistit; |
738 | 17 | 17 | ||
739 | 18 | import static org.junit.Assert.assertEquals; | ||
740 | 19 | import static org.junit.Assert.assertTrue; | 18 | import static org.junit.Assert.assertTrue; |
742 | 20 | import static org.junit.Assert.fail; | 19 | |
743 | 21 | import java.io.IOException; | 20 | import java.io.IOException; |
744 | 22 | import java.nio.ByteBuffer; | 21 | import java.nio.ByteBuffer; |
745 | 23 | import java.nio.MappedByteBuffer; | 22 | import java.nio.MappedByteBuffer; |
746 | @@ -161,9 +160,9 @@ | |||
747 | 161 | return _readPositions; | 160 | return _readPositions; |
748 | 162 | } | 161 | } |
749 | 163 | 162 | ||
751 | 164 | public void assertOrdered(boolean read, boolean forward) { | 163 | public void assertOrdered(final boolean read, final boolean forward) { |
752 | 165 | final List<Long> list = read ? _readPositions : _writePositions; | 164 | final List<Long> list = read ? _readPositions : _writePositions; |
754 | 166 | long previous = forward ? -1 : Long.MAX_VALUE; | 165 | final long previous = forward ? -1 : Long.MAX_VALUE; |
755 | 167 | for (final Long position : list) { | 166 | for (final Long position : list) { |
756 | 168 | if (forward) { | 167 | if (forward) { |
757 | 169 | assertTrue("Position should be larger", position > previous); | 168 | assertTrue("Position should be larger", position > previous); |
758 | 170 | 169 | ||
759 | === modified file 'src/test/java/com/persistit/stress/unit/CommitBench.java' | |||
760 | --- src/test/java/com/persistit/stress/unit/CommitBench.java 2012-08-24 13:57:19 +0000 | |||
761 | +++ src/test/java/com/persistit/stress/unit/CommitBench.java 2012-09-11 21:38:18 +0000 | |||
762 | @@ -85,11 +85,11 @@ | |||
763 | 85 | /* | 85 | /* |
764 | 86 | * Damage the file so that there's no keystone checkpoint | 86 | * Damage the file so that there's no keystone checkpoint |
765 | 87 | */ | 87 | */ |
767 | 88 | RandomAccessFile raf = new RandomAccessFile(file, "rws"); | 88 | final RandomAccessFile raf = new RandomAccessFile(file, "rws"); |
768 | 89 | raf.seek(0); | 89 | raf.seek(0); |
769 | 90 | raf.write(new byte[256]); | 90 | raf.write(new byte[256]); |
770 | 91 | raf.close(); | 91 | raf.close(); |
772 | 92 | } catch (IOException e) { | 92 | } catch (final IOException e) { |
773 | 93 | throw new RuntimeException(e); | 93 | throw new RuntimeException(e); |
774 | 94 | } | 94 | } |
775 | 95 | } else { | 95 | } else { |
Self-approving because there are no code changes (other than cosmetic changes) and Nathan is unavailable to review.