Merge lp:~pbeaman/akiban-persistit/better_4hour_tpcc_2 into lp:akiban-persistit

Proposed by Peter Beaman
Status: Superseded
Proposed branch: lp:~pbeaman/akiban-persistit/better_4hour_tpcc_2
Merge into: lp:akiban-persistit
Prerequisite: lp:~pbeaman/akiban-persistit/buffer-pool-warmup-sorted
Diff against target: 41059 lines (+7869/-6328)
329 files modified
doc/Configuration.rst (+13/-1)
doc/ReleaseNotes.rst (+20/-0)
eclipse-format.xml (+72/-0)
pom.xml (+37/-1)
src/etc/eclipse-cleanup-config.xml (+56/-0)
src/etc/eclipse-format-config.xml (+291/-0)
src/main/java/com/persistit/Accumulator.java (+10/-9)
src/main/java/com/persistit/AccumulatorState.java (+4/-5)
src/main/java/com/persistit/AlertMonitor.java (+27/-27)
src/main/java/com/persistit/AntiValue.java (+15/-15)
src/main/java/com/persistit/BackupTask.java (+14/-13)
src/main/java/com/persistit/Buffer.java (+518/-478)
src/main/java/com/persistit/BufferPool.java (+215/-169)
src/main/java/com/persistit/BufferPoolMXBeanImpl.java (+6/-5)
src/main/java/com/persistit/CLI.java (+67/-63)
src/main/java/com/persistit/CheckpointManager.java (+28/-28)
src/main/java/com/persistit/ClassIndex.java (+38/-36)
src/main/java/com/persistit/ClassInfo.java (+10/-9)
src/main/java/com/persistit/CleanupManager.java (+37/-26)
src/main/java/com/persistit/Configuration.java (+152/-144)
src/main/java/com/persistit/DefaultCoderManager.java (+46/-44)
src/main/java/com/persistit/DefaultObjectCoder.java (+40/-39)
src/main/java/com/persistit/DefaultValueCoder.java (+114/-113)
src/main/java/com/persistit/Exchange.java (+182/-170)
src/main/java/com/persistit/FastIndex.java (+43/-43)
src/main/java/com/persistit/GetVersion.java (+10/-7)
src/main/java/com/persistit/IOMeter.java (+51/-40)
src/main/java/com/persistit/IOTaskRunnable.java (+11/-11)
src/main/java/com/persistit/IntegrityCheck.java (+115/-106)
src/main/java/com/persistit/JournalManager.java (+219/-152)
src/main/java/com/persistit/JournalManagerBench.java (+186/-0)
src/main/java/com/persistit/JournalRecord.java (+6/-7)
src/main/java/com/persistit/JournalTool.java (+52/-55)
src/main/java/com/persistit/Key.java (+155/-149)
src/main/java/com/persistit/KeyFilter.java (+109/-105)
src/main/java/com/persistit/KeyHistogram.java (+10/-8)
src/main/java/com/persistit/KeyParser.java (+35/-35)
src/main/java/com/persistit/KeyState.java (+21/-21)
src/main/java/com/persistit/LongRecordHelper.java (+11/-11)
src/main/java/com/persistit/MVV.java (+57/-23)
src/main/java/com/persistit/Management.java (+53/-44)
src/main/java/com/persistit/ManagementImpl.java (+129/-126)
src/main/java/com/persistit/MediatedFileChannel.java (+54/-53)
src/main/java/com/persistit/Persistit.java (+137/-123)
src/main/java/com/persistit/PersistitMap.java (+93/-85)
src/main/java/com/persistit/RecoveryManager.java (+81/-63)
src/main/java/com/persistit/SessionId.java (+1/-1)
src/main/java/com/persistit/SharedResource.java (+18/-18)
src/main/java/com/persistit/StatisticsTask.java (+17/-13)
src/main/java/com/persistit/StreamLoader.java (+56/-55)
src/main/java/com/persistit/StreamSaver.java (+32/-30)
src/main/java/com/persistit/Task.java (+27/-26)
src/main/java/com/persistit/TaskCheck.java (+14/-13)
src/main/java/com/persistit/TimestampAllocator.java (+2/-2)
src/main/java/com/persistit/Transaction.java (+31/-25)
src/main/java/com/persistit/TransactionIndex.java (+33/-31)
src/main/java/com/persistit/TransactionIndexBucket.java (+6/-6)
src/main/java/com/persistit/TransactionPlayer.java (+17/-17)
src/main/java/com/persistit/TransactionPlayerSupport.java (+0/-1)
src/main/java/com/persistit/TransactionRunnable.java (+3/-3)
src/main/java/com/persistit/TransactionStatus.java (+20/-17)
src/main/java/com/persistit/Tree.java (+13/-13)
src/main/java/com/persistit/TreeSelector.java (+6/-6)
src/main/java/com/persistit/TreeState.java (+3/-3)
src/main/java/com/persistit/TreeStatistics.java (+6/-6)
src/main/java/com/persistit/Value.java (+433/-371)
src/main/java/com/persistit/ValueHelper.java (+31/-28)
src/main/java/com/persistit/ValueState.java (+8/-8)
src/main/java/com/persistit/Volume.java (+8/-7)
src/main/java/com/persistit/VolumeHandleLookup.java (+0/-2)
src/main/java/com/persistit/VolumeHeader.java (+12/-12)
src/main/java/com/persistit/VolumeSpecification.java (+15/-16)
src/main/java/com/persistit/VolumeStatistics.java (+8/-8)
src/main/java/com/persistit/VolumeStorage.java (+1/-3)
src/main/java/com/persistit/VolumeStorageT2.java (+40/-17)
src/main/java/com/persistit/VolumeStorageV2.java (+56/-28)
src/main/java/com/persistit/VolumeStructure.java (+49/-49)
src/main/java/com/persistit/encoding/CollectionValueCoder.java (+20/-19)
src/main/java/com/persistit/encoding/EnumValueCoder.java (+4/-4)
src/main/java/com/persistit/encoding/KeyDisplayer.java (+4/-4)
src/main/java/com/persistit/encoding/KeyRenderer.java (+7/-7)
src/main/java/com/persistit/encoding/ObjectCache.java (+19/-19)
src/main/java/com/persistit/encoding/SerialValueCoder.java (+9/-9)
src/main/java/com/persistit/exception/AppendableIOException.java (+1/-1)
src/main/java/com/persistit/exception/BufferSizeUnavailableException.java (+1/-1)
src/main/java/com/persistit/exception/ConversionException.java (+3/-3)
src/main/java/com/persistit/exception/CorruptImportStreamException.java (+1/-1)
src/main/java/com/persistit/exception/CorruptJournalException.java (+1/-1)
src/main/java/com/persistit/exception/CorruptValueException.java (+1/-1)
src/main/java/com/persistit/exception/CorruptVolumeException.java (+1/-1)
src/main/java/com/persistit/exception/InUseException.java (+1/-1)
src/main/java/com/persistit/exception/InvalidKeyException.java (+1/-1)
src/main/java/com/persistit/exception/InvalidPageAddressException.java (+1/-1)
src/main/java/com/persistit/exception/InvalidPageStructureException.java (+1/-1)
src/main/java/com/persistit/exception/InvalidPageTypeException.java (+1/-1)
src/main/java/com/persistit/exception/InvalidVolumeSpecificationException.java (+1/-1)
src/main/java/com/persistit/exception/MalformedValueException.java (+1/-1)
src/main/java/com/persistit/exception/MissingKeySegmentException.java (+1/-1)
src/main/java/com/persistit/exception/MissingThreadException.java (+1/-1)
src/main/java/com/persistit/exception/MissingVolumeException.java (+1/-1)
src/main/java/com/persistit/exception/PersistitClosedException.java (+1/-1)
src/main/java/com/persistit/exception/PersistitException.java (+3/-3)
src/main/java/com/persistit/exception/PersistitIOException.java (+4/-4)
src/main/java/com/persistit/exception/PersistitInterruptedException.java (+1/-2)
src/main/java/com/persistit/exception/PropertiesNotFoundException.java (+1/-2)
src/main/java/com/persistit/exception/ReadOnlyVolumeException.java (+1/-1)
src/main/java/com/persistit/exception/RebalanceException.java (+1/-2)
src/main/java/com/persistit/exception/RecoveryMissingVolumesException.java (+1/-1)
src/main/java/com/persistit/exception/RollbackException.java (+2/-2)
src/main/java/com/persistit/exception/TaskEndedException.java (+1/-2)
src/main/java/com/persistit/exception/TestException.java (+1/-1)
src/main/java/com/persistit/exception/TimeoutException.java (+1/-2)
src/main/java/com/persistit/exception/TransactionFailedException.java (+2/-2)
src/main/java/com/persistit/exception/TreeAlreadyExistsException.java (+1/-1)
src/main/java/com/persistit/exception/TreeNotFoundException.java (+1/-1)
src/main/java/com/persistit/exception/TruncateVolumeException.java (+1/-1)
src/main/java/com/persistit/exception/VolumeAlreadyExistsException.java (+1/-1)
src/main/java/com/persistit/exception/VolumeClosedException.java (+1/-2)
src/main/java/com/persistit/exception/VolumeFullException.java (+1/-2)
src/main/java/com/persistit/exception/VolumeNotFoundException.java (+1/-2)
src/main/java/com/persistit/exception/WrongVolumeException.java (+1/-2)
src/main/java/com/persistit/logging/ApacheCommonsLogAdapter.java (+4/-4)
src/main/java/com/persistit/logging/DefaultPersistitLogger.java (+8/-5)
src/main/java/com/persistit/logging/JDK14LoggingAdapter.java (+3/-4)
src/main/java/com/persistit/logging/Log4JAdapter.java (+4/-5)
src/main/java/com/persistit/logging/LogBase.java (+12/-4)
src/main/java/com/persistit/logging/PersistitLevel.java (+0/-1)
src/main/java/com/persistit/logging/PersistitLogMessage.java (+15/-12)
src/main/java/com/persistit/logging/Slf4jAdapter.java (+3/-3)
src/main/java/com/persistit/mxbeans/CleanupManagerMXBean.java (+2/-2)
src/main/java/com/persistit/mxbeans/Description.java (+3/-1)
src/main/java/com/persistit/mxbeans/IOMeterMXBean.java (+6/-8)
src/main/java/com/persistit/mxbeans/JournalManagerMXBean.java (+8/-2)
src/main/java/com/persistit/mxbeans/MXBeanWrapper.java (+30/-29)
src/main/java/com/persistit/mxbeans/ManagementMXBean.java (+14/-10)
src/main/java/com/persistit/mxbeans/PName.java (+3/-4)
src/main/java/com/persistit/mxbeans/TransactionIndexMXBean.java (+0/-1)
src/main/java/com/persistit/policy/JoinPolicy.java (+9/-10)
src/main/java/com/persistit/policy/SplitPolicy.java (+25/-18)
src/main/java/com/persistit/ref/AbstractReference.java (+2/-2)
src/main/java/com/persistit/ref/AbstractWeakReference.java (+2/-2)
src/main/java/com/persistit/ui/AbstractInspector.java (+1/-1)
src/main/java/com/persistit/ui/AdminPanel.java (+1/-1)
src/main/java/com/persistit/ui/AdminUI.java (+199/-179)
src/main/java/com/persistit/ui/AdminUIBufferPanel.java (+24/-24)
src/main/java/com/persistit/ui/AdminUISummaryPanel.java (+23/-22)
src/main/java/com/persistit/ui/AdminUITaskPanel.java (+39/-39)
src/main/java/com/persistit/ui/AdminUITreePanel.java (+38/-37)
src/main/java/com/persistit/ui/InnerJarClassLoader.java (+14/-14)
src/main/java/com/persistit/ui/InspectorDisplayablePanel.java (+3/-3)
src/main/java/com/persistit/ui/InspectorHexPanel.java (+4/-4)
src/main/java/com/persistit/ui/InspectorObjectPanel.java (+18/-17)
src/main/java/com/persistit/ui/InspectorPanel.java (+27/-27)
src/main/java/com/persistit/ui/ManagementListModel.java (+5/-5)
src/main/java/com/persistit/ui/ManagementSlidingTableModel.java (+20/-19)
src/main/java/com/persistit/ui/ManagementTableModel.java (+37/-36)
src/main/java/com/persistit/ui/PersistitTableModel.java (+54/-54)
src/main/java/com/persistit/ui/PoolDisplayPanel.java (+28/-28)
src/main/java/com/persistit/ui/TaskSetupPanel.java (+48/-47)
src/main/java/com/persistit/ui/TreeAndVolumeSelector.java (+57/-58)
src/main/java/com/persistit/ui/VTComboBoxModel.java (+12/-13)
src/main/java/com/persistit/ui/ValueInspectorTreeNode.java (+43/-42)
src/main/java/com/persistit/ui/renderers/TaskStatusStateRenderer.java (+2/-2)
src/main/java/com/persistit/util/ArgParser.java (+31/-32)
src/main/java/com/persistit/util/Debug.java (+21/-19)
src/main/java/com/persistit/util/InternalHashSet.java (+8/-8)
src/main/java/com/persistit/util/SequencerConstants.java (+35/-35)
src/main/java/com/persistit/util/ThreadSequencer.java (+22/-22)
src/main/java/com/persistit/util/Util.java (+98/-99)
src/test/java/com/persistit/AccumulatorMemoryTest.java (+6/-8)
src/test/java/com/persistit/AccumulatorRecoveryTest.java (+46/-43)
src/test/java/com/persistit/AccumulatorTest.java (+67/-69)
src/test/java/com/persistit/AlertMonitorTest.java (+13/-11)
src/test/java/com/persistit/BackupTaskTest.java (+8/-7)
src/test/java/com/persistit/BufferMaxPack.java (+2/-3)
src/test/java/com/persistit/BufferPoolTest.java (+16/-17)
src/test/java/com/persistit/BufferTest.java (+14/-13)
src/test/java/com/persistit/BufferTest2.java (+39/-39)
src/test/java/com/persistit/Bug1003578Test.java (+5/-6)
src/test/java/com/persistit/Bug1017957Test.java (+13/-13)
src/test/java/com/persistit/Bug1018526Test.java (+8/-8)
src/test/java/com/persistit/Bug706132Test.java (+2/-4)
src/test/java/com/persistit/Bug708592Test.java (+0/-3)
src/test/java/com/persistit/Bug739533Test.java (+1/-4)
src/test/java/com/persistit/Bug777918Test.java (+5/-7)
src/test/java/com/persistit/Bug790709Test.java (+2/-6)
src/test/java/com/persistit/Bug870352Test.java (+1/-5)
src/test/java/com/persistit/Bug877656Test.java (+4/-9)
src/test/java/com/persistit/Bug882219Test.java (+5/-7)
src/test/java/com/persistit/Bug885477Test.java (+0/-5)
src/test/java/com/persistit/Bug889850Test.java (+0/-4)
src/test/java/com/persistit/Bug911849Test.java (+6/-10)
src/test/java/com/persistit/Bug912514Test.java (+6/-8)
src/test/java/com/persistit/Bug915594Test.java (+2/-7)
src/test/java/com/persistit/Bug918909Test.java (+0/-6)
src/test/java/com/persistit/Bug920754Test.java (+0/-6)
src/test/java/com/persistit/Bug923790Test.java (+5/-7)
src/test/java/com/persistit/Bug927701Test.java (+4/-6)
src/test/java/com/persistit/Bug932097Test.java (+0/-2)
src/test/java/com/persistit/Bug937877Test.java (+4/-6)
src/test/java/com/persistit/Bug942669Test.java (+6/-8)
src/test/java/com/persistit/Bug947182Test.java (+10/-13)
src/test/java/com/persistit/Bug974589Test.java (+2/-3)
src/test/java/com/persistit/Bug980292Test.java (+1/-5)
src/test/java/com/persistit/Bug989202Test.java (+3/-5)
src/test/java/com/persistit/Bug992801Test.java (+0/-6)
src/test/java/com/persistit/Bug996241Test.java (+14/-20)
src/test/java/com/persistit/ClassIndexTest.java (+29/-28)
src/test/java/com/persistit/CleanupManagerTest.java (+3/-4)
src/test/java/com/persistit/CommandLineTest.java (+4/-5)
src/test/java/com/persistit/ConfigurationTest.java (+21/-21)
src/test/java/com/persistit/ConfirmEmptyVolume.java (+1/-1)
src/test/java/com/persistit/ConfirmIntegrity.java (+0/-1)
src/test/java/com/persistit/CorruptVolumeTest.java (+3/-4)
src/test/java/com/persistit/DumpTaskTest.java (+8/-8)
src/test/java/com/persistit/ErrorInjectingFileChannel.java (+40/-39)
src/test/java/com/persistit/FastIndexTest.java (+19/-20)
src/test/java/com/persistit/FatalErrorExceptionTest.java (+3/-4)
src/test/java/com/persistit/IOFailureTest.java (+17/-15)
src/test/java/com/persistit/IOMeterChargeBenchmark.java (+4/-6)
src/test/java/com/persistit/InsertSequenceTest.java (+7/-7)
src/test/java/com/persistit/IntegrityCheckTest.java (+30/-30)
src/test/java/com/persistit/JournalManagerTest.java (+91/-85)
src/test/java/com/persistit/KeyHistogramTest.java (+1/-3)
src/test/java/com/persistit/MVCCBasicTest.java (+48/-48)
src/test/java/com/persistit/MVCCConcurrentTest.java (+8/-9)
src/test/java/com/persistit/MVCCPruneBufferTest.java (+56/-33)
src/test/java/com/persistit/MVCCPruneTest.java (+14/-14)
src/test/java/com/persistit/MVCCTestBase.java (+40/-37)
src/test/java/com/persistit/MVVTest.java (+53/-43)
src/test/java/com/persistit/MediatedFileChannelTest.java (+7/-6)
src/test/java/com/persistit/MockSerializableObject.java (+1/-1)
src/test/java/com/persistit/PersistitUnitTestCase.java (+136/-0)
src/test/java/com/persistit/RecoveryTest.java (+64/-62)
src/test/java/com/persistit/ScriptedKeyFilterTest.java (+8/-8)
src/test/java/com/persistit/SplitPolicyTest.java (+18/-19)
src/test/java/com/persistit/StatisticsTaskTest.java (+0/-1)
src/test/java/com/persistit/StressRunner.java (+16/-13)
src/test/java/com/persistit/TestShim.java (+6/-5)
src/test/java/com/persistit/TrackingFileChannel.java (+175/-0)
src/test/java/com/persistit/TransactionIndexConcurrencyTest.java (+18/-17)
src/test/java/com/persistit/TransactionIndexTest.java (+21/-18)
src/test/java/com/persistit/TransactionLifetimeTest.java (+16/-10)
src/test/java/com/persistit/TransactionTest2.java (+13/-12)
src/test/java/com/persistit/TreeLifetimeTest.java (+16/-17)
src/test/java/com/persistit/TreeTest2.java (+4/-6)
src/test/java/com/persistit/ValueTest7.java (+6/-8)
src/test/java/com/persistit/VolumeTest.java (+32/-33)
src/test/java/com/persistit/WarmupTest.java (+89/-35)
src/test/java/com/persistit/stress/AbstractStressTest.java (+3/-2)
src/test/java/com/persistit/stress/AbstractSuite.java (+19/-19)
src/test/java/com/persistit/stress/InsertUUIDs.java (+2/-1)
src/test/java/com/persistit/stress/IntentionalFailure.java (+5/-4)
src/test/java/com/persistit/stress/Mixture1.java (+2/-1)
src/test/java/com/persistit/stress/Mixture2.java (+2/-1)
src/test/java/com/persistit/stress/Mixture3.java (+2/-1)
src/test/java/com/persistit/stress/MixtureTxn1.java (+1/-1)
src/test/java/com/persistit/stress/MixtureTxn2.java (+2/-1)
src/test/java/com/persistit/stress/PersistitMap1.java (+2/-1)
src/test/java/com/persistit/stress/PreloadMixtureTxn1.java (+82/-0)
src/test/java/com/persistit/stress/Recovery1.java (+2/-1)
src/test/java/com/persistit/stress/Recovery2.java (+2/-1)
src/test/java/com/persistit/stress/Recovery2_StdIn.java (+2/-1)
src/test/java/com/persistit/stress/StartStop.java (+7/-5)
src/test/java/com/persistit/stress/Stress10Suite.java (+2/-1)
src/test/java/com/persistit/stress/Stress12txnSuite.java (+2/-1)
src/test/java/com/persistit/stress/Stress4Suite.java (+2/-1)
src/test/java/com/persistit/stress/Stress8txnSuite.java (+2/-1)
src/test/java/com/persistit/stress/TestResult.java (+1/-1)
src/test/java/com/persistit/stress/unit/CommitBench.java (+65/-20)
src/test/java/com/persistit/stress/unit/MD5Sum.java (+2/-5)
src/test/java/com/persistit/stress/unit/PersistitMapStress1.java (+9/-11)
src/test/java/com/persistit/stress/unit/PersistitMapStress2.java (+11/-12)
src/test/java/com/persistit/stress/unit/Stress1.java (+3/-4)
src/test/java/com/persistit/stress/unit/Stress10.java (+3/-7)
src/test/java/com/persistit/stress/unit/Stress11.java (+3/-7)
src/test/java/com/persistit/stress/unit/Stress12txn.java (+2/-3)
src/test/java/com/persistit/stress/unit/Stress1txn.java (+3/-4)
src/test/java/com/persistit/stress/unit/Stress2.java (+5/-6)
src/test/java/com/persistit/stress/unit/Stress2txn.java (+5/-7)
src/test/java/com/persistit/stress/unit/Stress3.java (+3/-5)
src/test/java/com/persistit/stress/unit/Stress3txn.java (+3/-5)
src/test/java/com/persistit/stress/unit/Stress4Base.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress4a.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress4b.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress5.java (+1/-2)
src/test/java/com/persistit/stress/unit/Stress6.java (+5/-7)
src/test/java/com/persistit/stress/unit/Stress7.java (+7/-11)
src/test/java/com/persistit/stress/unit/Stress8txn.java (+2/-6)
src/test/java/com/persistit/stress/unit/Stress9.java (+5/-6)
src/test/java/com/persistit/stress/unit/StressBase.java (+1/-2)
src/test/java/com/persistit/stress/unit/StressInsert.java (+3/-4)
src/test/java/com/persistit/stress/unit/StressRecovery.java (+20/-21)
src/test/java/com/persistit/stress/unit/StressRecoveryTxn1.java (+2/-2)
src/test/java/com/persistit/stress/unit/StressUUID.java (+1/-1)
src/test/java/com/persistit/stress/unit/TestSamePageOptimization.java (+7/-7)
src/test/java/com/persistit/unit/BufferPoolMemConfigurationTest.java (+7/-6)
src/test/java/com/persistit/unit/ConcurrentUtil.java (+28/-24)
src/test/java/com/persistit/unit/DefaultCoderManagerTest.java (+1/-0)
src/test/java/com/persistit/unit/ExchangeTest.java (+37/-35)
src/test/java/com/persistit/unit/FileLockTest.java (+2/-1)
src/test/java/com/persistit/unit/JoinTest1.java (+4/-2)
src/test/java/com/persistit/unit/KeyCoderTest1.java (+42/-40)
src/test/java/com/persistit/unit/KeyFilterTest1.java (+1/-0)
src/test/java/com/persistit/unit/KeyFilterTest2.java (+12/-11)
src/test/java/com/persistit/unit/KeyParserTest1.java (+1/-0)
src/test/java/com/persistit/unit/KeyParserTest2.java (+1/-0)
src/test/java/com/persistit/unit/KeyTest1.java (+24/-22)
src/test/java/com/persistit/unit/Log4JLoggerTest.java (+2/-1)
src/test/java/com/persistit/unit/LongRecordTest1.java (+2/-1)
src/test/java/com/persistit/unit/LotsaSmallKeys.java (+2/-1)
src/test/java/com/persistit/unit/PersistitMapTest.java (+4/-1)
src/test/java/com/persistit/unit/PersistitUnitTestCase.java (+0/-132)
src/test/java/com/persistit/unit/SaveLoadTest1.java (+1/-0)
src/test/java/com/persistit/unit/SimpleTest1.java (+6/-4)
src/test/java/com/persistit/unit/TemporaryVolumeTest1.java (+12/-10)
src/test/java/com/persistit/unit/ThreadSequencerTest.java (+7/-5)
src/test/java/com/persistit/unit/TransactionTest1.java (+7/-6)
src/test/java/com/persistit/unit/TransactionTest3.java (+3/-1)
src/test/java/com/persistit/unit/TreeSelectorTest.java (+8/-8)
src/test/java/com/persistit/unit/TreeTest1.java (+1/-0)
src/test/java/com/persistit/unit/UnitTestProperties.java (+0/-1)
src/test/java/com/persistit/unit/ValueCoderTest1.java (+2/-1)
src/test/java/com/persistit/unit/ValueCoderTest2.java (+1/-0)
src/test/java/com/persistit/unit/ValueTest1.java (+34/-22)
src/test/java/com/persistit/unit/ValueTest2.java (+2/-1)
src/test/java/com/persistit/unit/ValueTest3.java (+17/-0)
src/test/java/com/persistit/unit/ValueTest4.java (+17/-0)
src/test/java/com/persistit/unit/ValueTest5.java (+6/-5)
To merge this branch: bzr merge lp:~pbeaman/akiban-persistit/better_4hour_tpcc_2
Reviewer Review Type Date Requested Status
Akiban Technologies Pending
Review via email: mp+121192@code.launchpad.net

This proposal supersedes a proposal from 2012-08-24.

Description of the change

This branch solves several problems relating to Journal I/O, pruning and performance.

Specifically, when running the 4-hour TPCC test on a particular server, perf02, the "terminal" threads outrun the ability of the JOURNAL_COPIER thread to remove obsolete journal files. The result is an ever-growing collection of journal files that eventually overflow the disk. The distinguishing feature of perf02 is that it has 12 fast cores (x2 with hyper-threading) but just a single disk drive.

This branch keeps the number of journal files under control during the test (never exceeding 16) and allows the test to complete. The test arrives at a stable configuration after a couple of hours and there's no reason to believe it would fail if run for much longer periods of time. However, a longer test run has not yet been completed.

Major changes:

1) The Transaction#commit() method now includes a call to new method JournalManager#throttle() which imposes a voluntary delay if the JournalCopier#urgency() value becomes large. The delay adjusts upward when urgency becomes extreme.

2) The order in which commit() completes its actions has changed to:

   flush()
   notifyComplete();
   throttle();
   waitForDurability();

Further, durability is measured from a timestamp taken immediately after the call to flush().

It is safe to call notifyComplete() and allow other concurrent transactions to continue (thereby hopefully allowing more transactions to join a GROUP commit). It is safe because no other transaction released by notifyComplete() can commit and become durable unless this one is also durable.

3) Pruning is accelerated, preventing old aborted transactions from holding up the JOURNAL_COPIER cleanup process. There are two main changes to support faster pruning:

3a) Scheduling: the CLEANUP_MANAGER normally polls once per second, but when the queue becomes more than half full it now runs continuously until the queue is no longer half full.

3b) Prune on write: when a dirty page thats needs pruning is being written to disk, a new optional code path prunes it before writing it. This reduces the likelihood that a page that is read back in from disk will need to be pruned.

Other changes made while analyzing test runs include updates in the IOMeter log function, and small fixes in the CLI.

One source a many lines of diff output is that to enable a new test the PersistitUnitTestCase class was moved from com.persistit.unit to com.persistit. In a future proposal I intend to move all of the unit tests to the correct package (same package as the class they are testing) and get rid of TestShim.

Due to the large size of this proposal, it not be approved until after Akiban Server 1.4.0 - and for that reason perhaps deserves a new version number, which is not in the current proposal.

This branch depends on the eclipse-canonical-format branch to reduce the number of format-only diffs.

To post a comment you must log in.
370. By Peter Beaman

Merge from release-notes-3.16

371. By Peter Beaman

Merge from trunk, modify according to review comments.

372. By Peter Beaman

One more review comment.

373. By Peter Beaman

Remove extraneous eclipse-format file

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'doc/Configuration.rst'
2--- doc/Configuration.rst 2012-06-11 21:25:37 +0000
3+++ doc/Configuration.rst 2012-08-24 18:21:22 +0000
4@@ -221,7 +221,7 @@
5 ``serialOverride``, ``constructorOverride``: (``com.persistit.Configuration#setSerialOverride`` ``com.persistit.Configuration#setConstructorOverride``)
6 Control aspects of object serialization. See :ref:`Serialization`.
7
8- ``showgui``: (``com.persistit.Configuration#setShowGUI``), True of False.
9+ ``showgui``: (``com.persistit.Configuration#setShowGUI``), True or False (default).
10 If true, Persistit attempts to create and display an instance of the AdminUI utility panel within the current JVM.
11 Alternatively, AdminUI uses RMI and can be launched and run remotely if ``rmiport`` or ``rmihost`` has been
12 specified.
13@@ -231,6 +231,18 @@
14 install a logging adapter to reroute messages through Log4J, SLF4J or other logger. The ``logfile`` property is used
15 only when no adapter has been installed.
16
17+ ``bufferinventory``: (``com.persistit.Configuration#setBufferInventoryEnabled``), True or False (default).
18+ If true, Persistit periodically records an inventory of all the buffes in the buffers pools to the System Volume. The inventory
19+ enables Persistit to preload the buffer pools then next time it starts up with approximately the same pages that were present
20+ before shutdown. To enable buffer preloading, the bufferpreload property must also be true.
21+
22+ ``bufferpreload``: (``com.persistit.Configuration#setBufferPreloadEnabled``), True or False (default).
23+ If true, and if a buffer pool inventory was previously recorded, Persistit attempts to "warm up" the buffer pool
24+ by preloading pages that were present in the buffer pool when Persistit last shut down. This may allow a freshly started
25+ Persistit instance to begin service a workload similar to what it had previously been processing without incurring the
26+ cost of many random disk reads to load pages.
27+
28+
29 For all integer-valued properties, the suffix “K” may be used to represent kilo, “M” for mega, “G” for giga and “T” for tera. For example, “2M” represents the value 2,097,152.
30
31 A Configuration Example
32
33=== modified file 'doc/ReleaseNotes.rst'
34--- doc/ReleaseNotes.rst 2012-08-06 14:43:42 +0000
35+++ doc/ReleaseNotes.rst 2012-08-24 18:21:22 +0000
36@@ -44,6 +44,26 @@
37 |
38 |
39
40+
41+************************************
42+3.1.6
43+************************************
44+
45+Release Date
46+============
47+August 24, 2012
48+
49+Overview
50+========
51+This version of Persistit fixes one bug.
52+
53+Fixed Issues
54+============
55+
56+https://bugs.launchpad.net/akiban-persistit/+bug/1036422
57+
58+With CommitPolicy HARD we observed a CPU-soaking loop in the commit logic.
59+
60 ************************************
61 3.1.5
62 ************************************
63
64=== added file 'eclipse-format.xml'
65--- eclipse-format.xml 1970-01-01 00:00:00 +0000
66+++ eclipse-format.xml 2012-08-24 18:21:22 +0000
67@@ -0,0 +1,72 @@
68+<!--
69+
70+ Copyright © 2011-2012 Akiban Technologies, Inc. All rights reserved.
71+
72+ This program and the accompanying materials are made available
73+ under the terms of the Eclipse Public License v1.0 which
74+ accompanies this distribution, and is available at
75+ http://www.eclipse.org/legal/epl-v10.html
76+
77+ This program may also be available under different license terms.
78+ For more information, see www.akiban.com or contact licensing@akiban.com.
79+
80+ Contributors:
81+ Akiban Technologies, Inc.
82+
83+-->
84+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
85+<profiles version="2">
86+<profile kind="CleanUpProfile" name="Akiban-Persistit" version="2">
87+<setting id="cleanup.format_source_code" value="true"/>
88+<setting id="cleanup.add_missing_annotations" value="true"/>
89+<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
90+<setting id="cleanup.remove_unused_private_types" value="true"/>
91+<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="true"/>
92+<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="false"/>
93+<setting id="cleanup.add_generated_serial_version_id" value="false"/>
94+<setting id="cleanup.make_variable_declarations_final" value="true"/>
95+<setting id="cleanup.add_missing_methods" value="false"/>
96+<setting id="cleanup.always_use_this_for_non_static_field_access" value="false"/>
97+<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="false"/>
98+<setting id="cleanup.correct_indentation" value="true"/>
99+<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
100+<setting id="cleanup.add_serial_version_id" value="false"/>
101+<setting id="cleanup.remove_unused_private_methods" value="true"/>
102+<setting id="cleanup.use_this_for_non_static_field_access" value="false"/>
103+<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
104+<setting id="cleanup.remove_unused_private_members" value="false"/>
105+<setting id="cleanup.add_missing_override_annotations_interface_methods" value="true"/>
106+<setting id="cleanup.remove_trailing_whitespaces_all" value="true"/>
107+<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
108+<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
109+<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
110+<setting id="cleanup.format_source_code_changes_only" value="false"/>
111+<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
112+<setting id="cleanup.add_missing_nls_tags" value="false"/>
113+<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="true"/>
114+<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="false"/>
115+<setting id="cleanup.remove_unnecessary_casts" value="true"/>
116+<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
117+<setting id="cleanup.use_parentheses_in_expressions" value="false"/>
118+<setting id="cleanup.remove_unused_private_fields" value="true"/>
119+<setting id="cleanup.make_parameters_final" value="true"/>
120+<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
121+<setting id="cleanup.remove_unused_imports" value="true"/>
122+<setting id="cleanup.organize_imports" value="true"/>
123+<setting id="cleanup.sort_members" value="false"/>
124+<setting id="cleanup.remove_private_constructors" value="true"/>
125+<setting id="cleanup.convert_to_enhanced_for_loop" value="false"/>
126+<setting id="cleanup.always_use_blocks" value="true"/>
127+<setting id="cleanup.never_use_blocks" value="false"/>
128+<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
129+<setting id="cleanup.use_this_for_non_static_method_access" value="false"/>
130+<setting id="cleanup.remove_unused_local_variables" value="false"/>
131+<setting id="cleanup.make_private_fields_final" value="true"/>
132+<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
133+<setting id="cleanup.add_default_serial_version_id" value="true"/>
134+<setting id="cleanup.sort_members_all" value="false"/>
135+<setting id="cleanup.use_blocks" value="false"/>
136+<setting id="cleanup.add_missing_override_annotations" value="true"/>
137+<setting id="cleanup.make_local_variable_final" value="true"/>
138+</profile>
139+</profiles>
140
141=== modified file 'pom.xml'
142--- pom.xml 2012-08-07 21:11:28 +0000
143+++ pom.xml 2012-08-24 18:21:22 +0000
144@@ -82,6 +82,14 @@
145 </dependency>
146 </dependencies>
147
148+ <pluginRepositories>
149+ <pluginRepository>
150+ <id>maven-java-formatter-plugin</id>
151+ <name>Maven2 Java Formatter Plugin repository</name>
152+ <url>https://raw.github.com/benalexau/maven-java-formatter-plugin/master/releases/</url>
153+ </pluginRepository>
154+ </pluginRepositories>
155+
156 <build>
157 <finalName>${project.artifactId}-${project.version}${BZR_REVISION}</finalName>
158 <resources>
159@@ -256,6 +264,7 @@
160 <exclude>.project</exclude>
161 <exclude>.classpath</exclude>
162 <exclude>.bzrignore</exclude>
163+ <exclude>src/etc/eclipse*.xml</exclude>
164 <!-- Other -->
165 <exclude>LICENSE.txt</exclude>
166 </excludes>
167@@ -273,6 +282,21 @@
168 <artifactId>maven-eclipse-plugin</artifactId>
169 <version>2.6</version>
170 </plugin>
171+ <plugin>
172+ <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
173+ <artifactId>maven-java-formatter-plugin</artifactId>
174+ <version>0.4.0.e371sr1</version>
175+ <configuration>
176+ <configFile>${project.basedir}/src/etc/eclipse-format-config.xml</configFile>
177+ </configuration>
178+ <executions>
179+ <execution>
180+ <goals>
181+ <goal>format</goal>
182+ </goals>
183+ </execution>
184+ </executions>
185+ </plugin>
186 </plugins>
187 <pluginManagement>
188 <plugins>
189@@ -324,6 +348,19 @@
190 <ignore />
191 </action>
192 </pluginExecution>
193+ <pluginExecution>
194+ <pluginExecutionFilter>
195+ <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
196+ <artifactId>maven-java-formatter-plugin</artifactId>
197+ <versionRange>[0.4.0.e371sr1,)</versionRange>
198+ <goals>
199+ <goal>format</goal>
200+ </goals>
201+ </pluginExecutionFilter>
202+ <action>
203+ <ignore></ignore>
204+ </action>
205+ </pluginExecution>
206 </pluginExecutions>
207 </lifecycleMappingMetadata>
208 </configuration>
209@@ -331,7 +368,6 @@
210 </plugins>
211 </pluginManagement>
212 </build>
213-
214 <reporting>
215 <plugins>
216 <plugin>
217
218=== added file 'src/etc/eclipse-cleanup-config.xml'
219--- src/etc/eclipse-cleanup-config.xml 1970-01-01 00:00:00 +0000
220+++ src/etc/eclipse-cleanup-config.xml 2012-08-24 18:21:22 +0000
221@@ -0,0 +1,56 @@
222+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
223+<profiles version="2">
224+<profile kind="CleanUpProfile" name="Akiban-Persistit" version="2">
225+<setting id="cleanup.format_source_code" value="true"/>
226+<setting id="cleanup.add_missing_annotations" value="true"/>
227+<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
228+<setting id="cleanup.remove_unused_private_types" value="true"/>
229+<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="true"/>
230+<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="false"/>
231+<setting id="cleanup.add_generated_serial_version_id" value="false"/>
232+<setting id="cleanup.make_variable_declarations_final" value="true"/>
233+<setting id="cleanup.add_missing_methods" value="false"/>
234+<setting id="cleanup.always_use_this_for_non_static_field_access" value="false"/>
235+<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="false"/>
236+<setting id="cleanup.correct_indentation" value="true"/>
237+<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
238+<setting id="cleanup.add_serial_version_id" value="false"/>
239+<setting id="cleanup.remove_unused_private_methods" value="true"/>
240+<setting id="cleanup.use_this_for_non_static_field_access" value="false"/>
241+<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
242+<setting id="cleanup.remove_unused_private_members" value="false"/>
243+<setting id="cleanup.add_missing_override_annotations_interface_methods" value="true"/>
244+<setting id="cleanup.remove_trailing_whitespaces_all" value="true"/>
245+<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
246+<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
247+<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
248+<setting id="cleanup.format_source_code_changes_only" value="false"/>
249+<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
250+<setting id="cleanup.add_missing_nls_tags" value="false"/>
251+<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="true"/>
252+<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="false"/>
253+<setting id="cleanup.remove_unnecessary_casts" value="true"/>
254+<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
255+<setting id="cleanup.use_parentheses_in_expressions" value="false"/>
256+<setting id="cleanup.remove_unused_private_fields" value="true"/>
257+<setting id="cleanup.make_parameters_final" value="true"/>
258+<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
259+<setting id="cleanup.remove_unused_imports" value="true"/>
260+<setting id="cleanup.organize_imports" value="true"/>
261+<setting id="cleanup.sort_members" value="false"/>
262+<setting id="cleanup.remove_private_constructors" value="true"/>
263+<setting id="cleanup.convert_to_enhanced_for_loop" value="false"/>
264+<setting id="cleanup.always_use_blocks" value="true"/>
265+<setting id="cleanup.never_use_blocks" value="false"/>
266+<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
267+<setting id="cleanup.use_this_for_non_static_method_access" value="false"/>
268+<setting id="cleanup.remove_unused_local_variables" value="false"/>
269+<setting id="cleanup.make_private_fields_final" value="true"/>
270+<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
271+<setting id="cleanup.add_default_serial_version_id" value="true"/>
272+<setting id="cleanup.sort_members_all" value="false"/>
273+<setting id="cleanup.use_blocks" value="false"/>
274+<setting id="cleanup.add_missing_override_annotations" value="true"/>
275+<setting id="cleanup.make_local_variable_final" value="true"/>
276+</profile>
277+</profiles>
278
279=== added file 'src/etc/eclipse-format-config.xml'
280--- src/etc/eclipse-format-config.xml 1970-01-01 00:00:00 +0000
281+++ src/etc/eclipse-format-config.xml 2012-08-24 18:21:22 +0000
282@@ -0,0 +1,291 @@
283+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
284+<profiles version="12">
285+<profile kind="CodeFormatterProfile" name="Akiban-code-format" version="12">
286+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
287+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
288+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
289+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
290+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
291+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
292+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
293+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
294+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
295+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
296+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
297+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
298+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
299+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
300+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
301+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
302+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
303+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
304+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
305+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
306+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
307+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
308+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
309+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
310+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
311+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
312+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
313+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
314+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
315+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
316+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
317+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
318+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
319+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
320+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
321+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
322+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
323+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
324+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
325+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
326+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
327+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
328+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
329+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
330+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
331+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
332+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
333+<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
334+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
335+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
336+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
337+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
338+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
339+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
340+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
341+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
342+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
343+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
344+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
345+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
346+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
347+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
348+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
349+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
350+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
351+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
352+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
353+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
354+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
355+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
356+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
357+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
358+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
359+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
360+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
361+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
362+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
363+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
364+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
365+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
366+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
367+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
368+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
369+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
370+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
371+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
372+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
373+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
374+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
375+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
376+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
377+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
378+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
379+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
380+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
381+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
382+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
383+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
384+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
385+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
386+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
387+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
388+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
389+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
390+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
391+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
392+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
393+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
394+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
395+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
396+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
397+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
398+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
399+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
400+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
401+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
402+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
403+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
404+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
405+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
406+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
407+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
408+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
409+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
410+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
411+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
412+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
413+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
414+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
415+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
416+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
417+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
418+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
419+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
420+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
421+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
422+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
423+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
424+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
425+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
426+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
427+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
428+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
429+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
430+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
431+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
432+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
433+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
434+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
435+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
436+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
437+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
438+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
439+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
440+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
441+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
442+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
443+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
444+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
445+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
446+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
447+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
448+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
449+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
450+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
451+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
452+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
453+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
454+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
455+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
456+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
457+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
458+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
459+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
460+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
461+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
462+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
463+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
464+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
465+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
466+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
467+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
468+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
469+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
470+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
471+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
472+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
473+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
474+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
475+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
476+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
477+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
478+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
479+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
480+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
481+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
482+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
483+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
484+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
485+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
486+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
487+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
488+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
489+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
490+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
491+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
492+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
493+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
494+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
495+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
496+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
497+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
498+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
499+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
500+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
501+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
502+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
503+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
504+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
505+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
506+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
507+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
508+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
509+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
510+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
511+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
512+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
513+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
514+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
515+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
516+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
517+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
518+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
519+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
520+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
521+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
522+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
523+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
524+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
525+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
526+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
527+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
528+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
529+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
530+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
531+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
532+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
533+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
534+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
535+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
536+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
537+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
538+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
539+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
540+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
541+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
542+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
543+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
544+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
545+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
546+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
547+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
548+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
549+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
550+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
551+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
552+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
553+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
554+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
555+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
556+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
557+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
558+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
559+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
560+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
561+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
562+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
563+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
564+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
565+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
566+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
567+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
568+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
569+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
570+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
571+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
572+</profile>
573+</profiles>
574
575=== modified file 'src/main/java/com/persistit/Accumulator.java'
576--- src/main/java/com/persistit/Accumulator.java 2012-08-02 04:45:28 +0000
577+++ src/main/java/com/persistit/Accumulator.java 2012-08-24 18:21:22 +0000
578@@ -97,10 +97,10 @@
579 final static Comparator<Accumulator> SORT_COMPARATOR = new Comparator<Accumulator>() {
580
581 @Override
582- public int compare(Accumulator a, Accumulator b) {
583+ public int compare(final Accumulator a, final Accumulator b) {
584 final String treeNameA = a.getTree() == null ? "" : a.getTree().getName();
585 final String treeNameB = b.getTree() == null ? "" : b.getTree().getName();
586- int compare = treeNameA.compareTo(treeNameB);
587+ final int compare = treeNameA.compareTo(treeNameB);
588 if (compare != 0) {
589 return compare;
590 } else {
591@@ -144,7 +144,7 @@
592 * longer present in live TransactionStatus objects. This array has one
593 * element per TransactionIndexBucket.
594 */
595- private long[] _bucketValues;
596+ private final long[] _bucketValues;
597
598 /*
599 * Object held on the accumulators list in {@link Persistit}. An
600@@ -374,7 +374,7 @@
601 }
602
603 Accumulator takeCheckpointRef() {
604- Accumulator result = _checkpointRef;
605+ final Accumulator result = _checkpointRef;
606 _checkpointRef = null;
607 return result;
608 }
609@@ -551,7 +551,7 @@
610 long getSnapshotValue(final long timestamp, final int step) throws PersistitInterruptedException {
611 try {
612 return _transactionIndex.getAccumulatorSnapshot(this, timestamp, step, _baseValue);
613- } catch (InterruptedException ie) {
614+ } catch (final InterruptedException ie) {
615 throw new PersistitInterruptedException(ie);
616 }
617 }
618@@ -588,6 +588,7 @@
619 /**
620 * Update the Accumulator by contributing a value. The contribution is
621 * immediately accumulated into the live value, and it is also posted with a
622+ *
623 * @{link {@link Delta} instance to the supplied {@link Transaction}.
624 *
625 * @param value
626@@ -636,8 +637,8 @@
627 * values for this <code>Accumulator</code>.
628 */
629 public String toString() {
630- return String.format("Accumulator(tree=%s index=%d type=%s base=%,d live=%,d)", _tree == null ? "null" : _tree
631- .getName(), _index, getType(), _baseValue, _liveValue.get());
632+ return String.format("Accumulator(tree=%s index=%d type=%s base=%,d live=%,d)",
633+ _tree == null ? "null" : _tree.getName(), _index, getType(), _baseValue, _liveValue.get());
634 }
635
636 void store(final Value value) {
637@@ -649,8 +650,8 @@
638
639 static AccumulatorState getAccumulatorState(final Tree tree, final int index) throws PersistitException {
640 final Exchange exchange = tree.getVolume().getStructure().directoryExchange();
641- exchange.clear().append(VolumeStructure.DIRECTORY_TREE_NAME).append(VolumeStructure.TREE_ACCUMULATOR).append(
642- tree.getName()).append(index).fetch();
643+ exchange.clear().append(VolumeStructure.DIRECTORY_TREE_NAME).append(VolumeStructure.TREE_ACCUMULATOR)
644+ .append(tree.getName()).append(index).fetch();
645 if (exchange.getValue().isDefined()) {
646 return (AccumulatorState) exchange.getValue().get();
647 } else {
648
649=== modified file 'src/main/java/com/persistit/AccumulatorState.java'
650--- src/main/java/com/persistit/AccumulatorState.java 2012-08-02 04:45:28 +0000
651+++ src/main/java/com/persistit/AccumulatorState.java 2012-08-24 18:21:22 +0000
652@@ -15,7 +15,6 @@
653
654 package com.persistit;
655
656-
657 /**
658 * State of an accumulator recovered from a checkpoint.
659 *
660@@ -48,19 +47,19 @@
661 public String toString() {
662 return String.format("Accumulator(tree=%s index=%d type=%s value=%,d)", _treeName, _index, _type, _value);
663 }
664-
665+
666 public String getTreeName() {
667 return _treeName;
668 }
669-
670+
671 public int getIndex() {
672 return _index;
673 }
674-
675+
676 public Accumulator.Type getType() {
677 return _type;
678 }
679-
680+
681 public long getValue() {
682 return _value;
683 }
684
685=== modified file 'src/main/java/com/persistit/AlertMonitor.java'
686--- src/main/java/com/persistit/AlertMonitor.java 2012-08-02 04:45:28 +0000
687+++ src/main/java/com/persistit/AlertMonitor.java 2012-08-24 18:21:22 +0000
688@@ -113,7 +113,7 @@
689 */
690 public class History {
691 private AlertLevel _level = AlertLevel.NORMAL;
692- private List<Event> _eventList = new ArrayList<Event>();
693+ private final List<Event> _eventList = new ArrayList<Event>();
694 private volatile long _firstEventTime = Long.MAX_VALUE;
695 private volatile long _lastWarnLogTime = Long.MIN_VALUE;
696 private volatile long _lastErrorLogTime = Long.MIN_VALUE;
697@@ -142,7 +142,7 @@
698 public String getDetailedHistory() {
699 final StringBuilder sb = new StringBuilder();
700 synchronized (AlertMonitor.this) {
701- int size = _eventList.size();
702+ final int size = _eventList.size();
703 if (_count > 0) {
704 sb.append(String.format(EVENT_FORMAT, 1, format(_firstEvent)));
705 for (int index = _count > size ? 0 : 1; index < size; index++) {
706@@ -250,7 +250,7 @@
707 * does nothing unless the interval has elapsed.
708 */
709 public void poll(final long now, final boolean force) {
710- int count = getCount();
711+ final int count = getCount();
712 if (count > _reportedCount) {
713 switch (_level) {
714 case ERROR:
715@@ -316,7 +316,7 @@
716 * event was posted.
717 */
718 public static class Event {
719- private AlertLevel _level;
720+ private final AlertLevel _level;
721 private final LogItem _logItem;
722 private final Object[] _args;
723 private final long _time;
724@@ -332,7 +332,7 @@
725 * @param args
726 * arguments specific to the <code>LogItem</code>
727 */
728- public Event(AlertLevel level, LogItem logItem, Object... args) {
729+ public Event(final AlertLevel level, final LogItem logItem, final Object... args) {
730 this(level, System.currentTimeMillis(), logItem, args);
731 }
732
733@@ -349,7 +349,7 @@
734 * @param args
735 * arguments specific to the <code>LogItem</code>
736 */
737- public Event(AlertLevel level, long time, LogItem logItem, Object... args) {
738+ public Event(final AlertLevel level, final long time, final LogItem logItem, final Object... args) {
739 _level = level;
740 _logItem = logItem;
741 _args = args;
742@@ -492,7 +492,7 @@
743 private volatile long _errorLogTimeInterval = DEFAULT_ERROR_INTERVAL;
744 private volatile int _historyLength = DEFAULT_HISTORY_LENGTH;
745
746- private AtomicLong _notificationSequence = new AtomicLong();
747+ private final AtomicLong _notificationSequence = new AtomicLong();
748 private volatile ObjectName _objectName;
749
750 /**
751@@ -533,7 +533,7 @@
752 * A String describing the nature of the event. A separate
753 * event-history is maintained for each unique category.
754 */
755- public synchronized final void post(Event event, final String category) {
756+ public synchronized final void post(final Event event, final String category) {
757 History history = _historyMap.get(category);
758 if (history == null) {
759 history = new History();
760@@ -570,7 +570,7 @@
761 * the interval in milliseconds
762 */
763 @Override
764- public void setWarnLogTimeInterval(long warnLogTimeInterval) {
765+ public void setWarnLogTimeInterval(final long warnLogTimeInterval) {
766 Util.rangeCheck(warnLogTimeInterval, MINIMUM_WARN_INTERVAL, MAXIMUM_WARN_INTERVAL);
767 _warnLogTimeInterval = warnLogTimeInterval;
768 }
769@@ -592,7 +592,7 @@
770 * the interval in milliseconds
771 */
772 @Override
773- public void setErrorLogTimeInterval(long errorLogTimeInterval) {
774+ public void setErrorLogTimeInterval(final long errorLogTimeInterval) {
775 Util.rangeCheck(errorLogTimeInterval, MINIMUM_ERROR_INTERVAL, MAXIMUM_ERROR_INTERVAL);
776 _errorLogTimeInterval = errorLogTimeInterval;
777 }
778@@ -613,7 +613,7 @@
779 * @return the <code>History</code> for that category or <code>null</code>
780 * if the specified category has no <code>History</code>.
781 */
782- public synchronized History getHistory(String name) {
783+ public synchronized History getHistory(final String name) {
784 return _historyMap.get(name);
785 }
786
787@@ -637,7 +637,7 @@
788 * the historyLength to set
789 */
790 @Override
791- public synchronized void setHistoryLength(int historyLength) {
792+ public synchronized void setHistoryLength(final int historyLength) {
793 Util.rangeCheck(historyLength, MINIMUM_HISTORY_LENGTH, MAXIMUM_HISTORY_LENGTH);
794 _historyLength = historyLength;
795 for (final History history : _historyMap.values()) {
796@@ -652,7 +652,7 @@
797 * @return List of AlertRecord elements.
798 */
799 public synchronized AlertRecord[] getAlertRecordArray() {
800- List<AlertRecord> list = new ArrayList<AlertRecord>();
801+ final List<AlertRecord> list = new ArrayList<AlertRecord>();
802 for (final Map.Entry<String, History> entry : _historyMap.entrySet()) {
803 for (final Event event : entry.getValue().getEventList()) {
804 list.add(new AlertRecord(entry.getKey(), event));
805@@ -681,7 +681,7 @@
806 */
807 @Override
808 public synchronized String toString() {
809- StringBuilder sb = new StringBuilder();
810+ final StringBuilder sb = new StringBuilder();
811 for (final Map.Entry<String, History> entry : _historyMap.entrySet()) {
812 sb.append(String.format("%12s: %s\n", entry.getKey(), entry.getValue()));
813 }
814@@ -705,8 +705,8 @@
815 */
816 @Override
817 public synchronized String getDetailedHistory(final String select) {
818- Pattern pattern = Util.pattern(select, true);
819- StringBuilder sb = new StringBuilder();
820+ final Pattern pattern = Util.pattern(select, true);
821+ final StringBuilder sb = new StringBuilder();
822 for (final Map.Entry<String, History> entry : _historyMap.entrySet()) {
823 if (pattern.matcher(entry.getKey()).matches()) {
824 sb.append(String.format("%s:\n", entry.getKey()));
825@@ -737,10 +737,10 @@
826 */
827 @Override
828 public MBeanNotificationInfo[] getNotificationInfo() {
829- String[] types = new String[] { NOTIFICATION_TYPE };
830- String name = Notification.class.getName();
831- String description = "Alert raised by Akiban PersistIT";
832- MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
833+ final String[] types = new String[] { NOTIFICATION_TYPE };
834+ final String name = Notification.class.getName();
835+ final String description = "Alert raised by Akiban PersistIT";
836+ final MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
837 return new MBeanNotificationInfo[] { info };
838 }
839
840@@ -751,7 +751,7 @@
841 *
842 * @param history
843 */
844- private void log(History history) {
845+ private void log(final History history) {
846 final Event event = history.getLastEvent();
847 if (event != null && event.getLogItem().isEnabled()) {
848 if (history.getCount() == 1) {
849@@ -767,13 +767,13 @@
850 *
851 * @param history
852 */
853- private void sendNotification(History history) {
854+ private void sendNotification(final History history) {
855 final Event event = history.getLastEvent();
856 if (event != null && event.getLogItem().isEnabled()) {
857- final String description = LogBase.recurring(event.getLogItem().logMessage(event.getArgs()), history
858- .getCount(), history.getDuration());
859- Notification notification = new Notification(NOTIFICATION_TYPE, getClass().getName(), _notificationSequence
860- .incrementAndGet(), description);
861+ final String description = LogBase.recurring(event.getLogItem().logMessage(event.getArgs()),
862+ history.getCount(), history.getDuration());
863+ final Notification notification = new Notification(NOTIFICATION_TYPE, getClass().getName(),
864+ _notificationSequence.incrementAndGet(), description);
865 sendNotification(notification);
866 }
867 }
868@@ -796,7 +796,7 @@
869 * @param event
870 * @return
871 */
872- private String format(Event event) {
873+ private String format(final Event event) {
874 return event == null ? "null" : event.toString();
875 }
876
877
878=== modified file 'src/main/java/com/persistit/AntiValue.java'
879--- src/main/java/com/persistit/AntiValue.java 2012-08-02 04:45:28 +0000
880+++ src/main/java/com/persistit/AntiValue.java 2012-08-24 18:21:22 +0000
881@@ -15,10 +15,10 @@
882
883 package com.persistit;
884
885+import java.util.Arrays;
886+
887 import com.persistit.exception.InvalidKeyException;
888
889-import java.util.Arrays;
890-
891 /**
892 * Represents the end of a key range to be removed. Used in Transactions.
893 *
894@@ -26,29 +26,29 @@
895 * @version 1.1
896 */
897 class AntiValue {
898- private int _elisionCount;
899- private byte[] _bytes;
900+ private final int _elisionCount;
901+ private final byte[] _bytes;
902
903- AntiValue(int ec, byte[] bytes) {
904+ AntiValue(final int ec, final byte[] bytes) {
905 _elisionCount = ec;
906 _bytes = bytes;
907 }
908
909- static void putAntiValue(Value value, Key key1, Key key2) {
910- int elisionCount = key1.firstUniqueByteIndex(key2);
911- int size = key2.getEncodedSize() - elisionCount;
912- byte[] bytes = new byte[size];
913+ static void putAntiValue(final Value value, final Key key1, final Key key2) {
914+ final int elisionCount = key1.firstUniqueByteIndex(key2);
915+ final int size = key2.getEncodedSize() - elisionCount;
916+ final byte[] bytes = new byte[size];
917 System.arraycopy(key2.getEncodedBytes(), elisionCount, bytes, 0, size);
918 value.putAntiValue((short) elisionCount, bytes);
919 }
920
921- static void fixUpKeys(Exchange exchange, int elisionCount, byte[] bytes, int offset, int length)
922- throws InvalidKeyException {
923- Key spareKey1 = exchange.getAuxiliaryKey1();
924- Key spareKey2 = exchange.getAuxiliaryKey2();
925+ static void fixUpKeys(final Exchange exchange, final int elisionCount, final byte[] bytes, final int offset,
926+ final int length) throws InvalidKeyException {
927+ final Key spareKey1 = exchange.getAuxiliaryKey1();
928+ final Key spareKey2 = exchange.getAuxiliaryKey2();
929 spareKey1.copyTo(spareKey2);
930- byte[] baseBytes = spareKey2.getEncodedBytes();
931- int baseSize = spareKey2.getEncodedSize();
932+ final byte[] baseBytes = spareKey2.getEncodedBytes();
933+ final int baseSize = spareKey2.getEncodedSize();
934 if (baseSize < elisionCount || elisionCount + length > Key.MAX_KEY_LENGTH) {
935 throw new InvalidKeyException("Key encoding in transaction is invalid");
936 }
937
938=== modified file 'src/main/java/com/persistit/BackupTask.java'
939--- src/main/java/com/persistit/BackupTask.java 2012-08-02 04:45:28 +0000
940+++ src/main/java/com/persistit/BackupTask.java 2012-08-24 18:21:22 +0000
941@@ -76,12 +76,13 @@
942 private volatile String _backupStatus;
943
944 @Cmd("backup")
945- static Task setupTask(@Arg("file|string|Archive file path") String file,
946- @Arg("_flag|a|Start appendOnly mode") boolean start, @Arg("_flag|e|End appendOnly mode") boolean end,
947- @Arg("_flag|c|Request checkpoint before backup") boolean checkpoint,
948- @Arg("_flag|z|Compress output to ZIP format") boolean compressed,
949- @Arg("_flag|f|Emit a list of files that need to be copied") boolean showFiles,
950- @Arg("_flag|y|Copyback pages before starting") boolean copyback) throws Exception {
951+ static Task setupTask(@Arg("file|string|Archive file path") final String file,
952+ @Arg("_flag|a|Start appendOnly mode") final boolean start,
953+ @Arg("_flag|e|End appendOnly mode") final boolean end,
954+ @Arg("_flag|c|Request checkpoint before backup") final boolean checkpoint,
955+ @Arg("_flag|z|Compress output to ZIP format") final boolean compressed,
956+ @Arg("_flag|f|Emit a list of files that need to be copied") final boolean showFiles,
957+ @Arg("_flag|y|Copyback pages before starting") final boolean copyback) throws Exception {
958 final BackupTask task = new BackupTask();
959 task._toFile = file;
960 task._start = start;
961@@ -103,7 +104,7 @@
962 protected void runTask() throws Exception {
963 validate();
964 final Management management = _persistit.getManagement();
965- boolean wasAppendOnly = management.getJournalInfo().isAppendOnly();
966+ final boolean wasAppendOnly = management.getJournalInfo().isAppendOnly();
967 if (_checkpoint) {
968 postMessage("Waiting for checkpoint", 0);
969 final Checkpoint cp = _persistit.checkpoint();
970@@ -115,9 +116,9 @@
971 }
972 if (_copyback && !wasAppendOnly) {
973 postMessage("Copying back pages from journal", 0);
974- long start = _persistit.getJournalManager().getCopiedPageCount();
975+ final long start = _persistit.getJournalManager().getCopiedPageCount();
976 _persistit.copyBackPages();
977- long end = _persistit.getJournalManager().getCopiedPageCount();
978+ final long end = _persistit.getJournalManager().getCopiedPageCount();
979 postMessage((end - start) + " pages copied", 0);
980 }
981 try {
982@@ -128,7 +129,7 @@
983 doBackup();
984 }
985 }
986- } catch (Exception e) {
987+ } catch (final Exception e) {
988 _backupStatus = "Failed: " + e;
989 } finally {
990 management.setAppendOnly(_start ? true : _end ? false : wasAppendOnly);
991@@ -136,7 +137,7 @@
992 }
993
994 @Override
995- protected void postMessage(final String message, int level) {
996+ protected void postMessage(final String message, final int level) {
997 super.postMessage(message, level);
998 _backupStatus = message;
999 }
1000@@ -152,9 +153,9 @@
1001 final long baseAddress = info.getBaseAddress();
1002 final long currentAddress = info.getCurrentJournalAddress();
1003 final long blockSize = info.getBlockSize();
1004- String path = JournalManager.fileToPath(new File(info.getCurrentJournalFile()));
1005+ final String path = JournalManager.fileToPath(new File(info.getCurrentJournalFile()));
1006 for (long generation = baseAddress / blockSize; generation <= currentAddress / blockSize; generation++) {
1007- File file = JournalManager.generationToFile(path, generation);
1008+ final File file = JournalManager.generationToFile(path, generation);
1009 _files.add(file.getAbsolutePath());
1010 }
1011 final StringBuilder sb = new StringBuilder();
1012
1013=== modified file 'src/main/java/com/persistit/Buffer.java'
1014--- src/main/java/com/persistit/Buffer.java 2012-08-02 04:45:28 +0000
1015+++ src/main/java/com/persistit/Buffer.java 2012-08-24 18:21:22 +0000
1016@@ -264,19 +264,23 @@
1017
1018 private final static int BINARY_SEARCH_THRESHOLD = 6;
1019
1020+ private final static int PRUNE_MVV_HELPER_CHANGED = 1;
1021+ private final static int PRUNE_MVV_HELPER_HAS_LONG = 2;
1022+
1023 abstract static class VerifyVisitor {
1024
1025- protected void visitPage(long timestamp, Volume volume, long page, int type, int bufferSize, int keyBlockStart,
1026- int keyBlockEnd, int alloc, int available, long rightSibling) throws PersistitException {
1027- }
1028-
1029- protected void visitIndexRecord(Key key, int foundAt, int tail, int kLength, long pointer)
1030- throws PersistitException {
1031-
1032- }
1033-
1034- protected void visitDataRecord(Key key, int foundAt, int tail, int klength, int offset, int length, byte[] bytes)
1035- throws PersistitException {
1036+ protected void visitPage(final long timestamp, final Volume volume, final long page, final int type,
1037+ final int bufferSize, final int keyBlockStart, final int keyBlockEnd, final int alloc,
1038+ final int available, final long rightSibling) throws PersistitException {
1039+ }
1040+
1041+ protected void visitIndexRecord(final Key key, final int foundAt, final int tail, final int kLength,
1042+ final long pointer) throws PersistitException {
1043+
1044+ }
1045+
1046+ protected void visitDataRecord(final Key key, final int foundAt, final int tail, final int klength,
1047+ final int offset, final int length, final byte[] bytes) throws PersistitException {
1048 }
1049 }
1050
1051@@ -323,7 +327,7 @@
1052 * The bytes in this buffer. Note these bytes are also the backing store of
1053 * _byteBuffer.
1054 */
1055- private byte[] _bytes;
1056+ private final byte[] _bytes;
1057
1058 /**
1059 * FastIndex structure used for rapid page searching
1060@@ -382,7 +386,7 @@
1061 * @param size
1062 * The buffer size, in bytes.
1063 */
1064- Buffer(int size, int index, BufferPool pool, Persistit persistit) {
1065+ Buffer(int size, final int index, final BufferPool pool, final Persistit persistit) {
1066 super(persistit);
1067 boolean ok = false;
1068 for (int s = MIN_BUFFER_SIZE; !ok && s <= MAX_BUFFER_SIZE; s *= 2) {
1069@@ -402,7 +406,7 @@
1070 _fastIndex = new FastIndex(this, 1 + (size - HEADER_SIZE) / MAX_KEY_RATIO);
1071 }
1072
1073- Buffer(Buffer original) {
1074+ Buffer(final Buffer original) {
1075 this(original._bufferSize, original._poolIndex, original._pool, original._persistit);
1076 setStatus(original);
1077 _type = original._type;
1078@@ -421,7 +425,7 @@
1079 /**
1080 * Initializes the buffer so that it contains no keys or data.
1081 */
1082- void init(int type) {
1083+ void init(final int type) {
1084 _type = type;
1085 setKeyBlockEnd(KEY_BLOCK_START);
1086 _tailHeaderSize = isIndexPage() ? TAILBLOCK_HDR_SIZE_INDEX : TAILBLOCK_HDR_SIZE_DATA;
1087@@ -449,7 +453,7 @@
1088 * @throws InUseException
1089 * @throws PersistitInterruptedException
1090 */
1091- void load(Volume vol, long page) throws PersistitIOException, InvalidPageAddressException,
1092+ void load(final Volume vol, final long page) throws PersistitIOException, InvalidPageAddressException,
1093 InvalidPageStructureException, VolumeClosedException, InUseException, PersistitInterruptedException {
1094 _vol = vol;
1095 _page = page;
1096@@ -463,7 +467,7 @@
1097 _timestamp = getLong(TIMESTAMP_OFFSET);
1098
1099 if (_page != 0) {
1100- int type = getByte(TYPE_OFFSET);
1101+ final int type = getByte(TYPE_OFFSET);
1102 if (type > PAGE_TYPE_MAX) {
1103 throw new InvalidPageStructureException("Invalid type " + type);
1104 }
1105@@ -501,15 +505,23 @@
1106 Debug.$assert0.t(isMine());
1107 final long checkpointTimestamp = _persistit.getTimestampAllocator().getProposedCheckpointTimestamp();
1108 if (isDirty() && !isTemporary() && getTimestamp() < checkpointTimestamp && timestamp > checkpointTimestamp) {
1109- writePage();
1110+ writePage(false);
1111 _pool.bumpForcedCheckpointWrites();
1112 }
1113 }
1114
1115 void writePage() throws PersistitException {
1116+ writePage(_persistit.getJournalManager().isWritePagePruningEnabled());
1117+ }
1118+
1119+ private void writePage(final boolean prune) throws PersistitException {
1120+ assert isMine();
1121 _persistit.checkFatal();
1122 final Volume volume = getVolume();
1123 if (volume != null) {
1124+ if (prune) {
1125+ pruneMvvValues(null, false);
1126+ }
1127 clearSlack();
1128 save();
1129 _vol.getStorage().writePage(this);
1130@@ -519,6 +531,7 @@
1131 }
1132 }
1133
1134+ @Override
1135 boolean clearDirty() {
1136 if (super.clearDirty()) {
1137 _pool.decrementDirtyPageCount();
1138@@ -527,6 +540,7 @@
1139 return false;
1140 }
1141
1142+ @Override
1143 boolean setDirty() {
1144 throw new UnsupportedOperationException();
1145 }
1146@@ -543,12 +557,12 @@
1147 }
1148
1149 @Override
1150- boolean claim(boolean writer) throws PersistitInterruptedException {
1151+ boolean claim(final boolean writer) throws PersistitInterruptedException {
1152 return claim(writer, DEFAULT_MAX_WAIT_TIME);
1153 }
1154
1155 @Override
1156- boolean claim(boolean writer, long timeout) throws PersistitInterruptedException {
1157+ boolean claim(final boolean writer, final long timeout) throws PersistitInterruptedException {
1158 if (super.claim(writer, timeout)) {
1159 if (!isDirty()) {
1160 _timestamp = _persistit.getCurrentTimestamp();
1161@@ -579,7 +593,7 @@
1162 Util.clearBytes(_bytes, 0, _bufferSize);
1163 }
1164
1165- void clearBytes(int from, int to) {
1166+ void clearBytes(final int from, final int to) {
1167 Util.clearBytes(_bytes, from, to);
1168 }
1169
1170@@ -733,7 +747,7 @@
1171 * @param pageAddress
1172 * the sibling's address
1173 */
1174- void setRightSibling(long pageAddress) {
1175+ void setRightSibling(final long pageAddress) {
1176 Debug.$assert0.t(isMine());
1177 _rightSibling = pageAddress;
1178 }
1179@@ -803,15 +817,15 @@
1180 * it follows the last key in the page.
1181 * @throws PersistitInterruptedException
1182 */
1183- int findKey(Key key) throws PersistitInterruptedException {
1184+ int findKey(final Key key) throws PersistitInterruptedException {
1185 final FastIndex fastIndex = getFastIndex();
1186- byte[] kbytes = key.getEncodedBytes();
1187- int klength = key.getEncodedSize();
1188+ final byte[] kbytes = key.getEncodedBytes();
1189+ final int klength = key.getEncodedSize();
1190 int depth = 0;
1191 int left = KEY_BLOCK_START;
1192 int right = _keyBlockEnd;
1193- int start = left;
1194- int tailHeaderSize = _tailHeaderSize;
1195+ final int start = left;
1196+ final int tailHeaderSize = _tailHeaderSize;
1197
1198 for (int p = start; p < right;) {
1199 //
1200@@ -820,7 +834,7 @@
1201 int kbData = getInt(p);
1202 int index = (p - start) >> 2;
1203 int runCount = fastIndex.getRunCount(index);
1204- int ebc = decodeKeyBlockEbc(kbData);
1205+ final int ebc = decodeKeyBlockEbc(kbData);
1206
1207 if (depth < ebc) {
1208 // We know that depth < ebc for a bunch of KeyBlocks - we
1209@@ -836,7 +850,7 @@
1210 }
1211
1212 else if (depth > ebc) {
1213- int result = p | (depth << DEPTH_SHIFT);
1214+ final int result = p | (depth << DEPTH_SHIFT);
1215 return result;
1216 }
1217
1218@@ -847,7 +861,7 @@
1219 int kb = kbytes[depth] & 0xFF;
1220
1221 if (kb < db) {
1222- int result = p | (depth << DEPTH_SHIFT);
1223+ final int result = p | (depth << DEPTH_SHIFT);
1224 return result;
1225 }
1226 if (kb > db) {
1227@@ -858,13 +872,13 @@
1228 // either do a linear search or perform a binary search
1229 // within the run.
1230 //
1231- int p2 = p + (runCount * KEYBLOCK_LENGTH);
1232+ final int p2 = p + (runCount * KEYBLOCK_LENGTH);
1233 //
1234 // p2 now points to the last key block with the same
1235 // ebc in this run.
1236 //
1237- int kbData2 = getInt(p2);
1238- int db2 = decodeKeyBlockDb(kbData2);
1239+ final int kbData2 = getInt(p2);
1240+ final int db2 = decodeKeyBlockDb(kbData2);
1241 //
1242 // For the common case that runCount == 1, we avoid
1243 // setting up the binary search loop. Instead, the
1244@@ -877,7 +891,7 @@
1245 // This is right because we already know
1246 // that kb > db.
1247 //
1248- int result = p2 | (depth << DEPTH_SHIFT);
1249+ final int result = p2 | (depth << DEPTH_SHIFT);
1250 return result;
1251 } else if (db2 < kb) {
1252 //
1253@@ -888,7 +902,7 @@
1254 // -
1255 // in that case we use the cross count to skip
1256 // all of them.
1257- int runCount2 = fastIndex.getRunCount(index + runCount);
1258+ final int runCount2 = fastIndex.getRunCount(index + runCount);
1259 assert runCount2 <= 0;
1260 p = p2 + KEYBLOCK_LENGTH * (-runCount + 1);
1261 continue;
1262@@ -921,8 +935,8 @@
1263 // we are seeking.
1264 //
1265 if (runCount > BINARY_SEARCH_THRESHOLD) {
1266- int distance = (right - left) >> 2;
1267- int oldRight = right;
1268+ final int distance = (right - left) >> 2;
1269+ final int oldRight = right;
1270 if (distance > kb - db + 1) {
1271 right = left + ((kb - db + 1) << 2);
1272 }
1273@@ -942,7 +956,7 @@
1274 // that kb > db and less than db2, so the
1275 // final answer is know to be in right.
1276 //
1277- int result = right | (depth << DEPTH_SHIFT);
1278+ final int result = right | (depth << DEPTH_SHIFT);
1279 return result;
1280 }
1281 //
1282@@ -950,7 +964,7 @@
1283 // mid-point and
1284 // adjust the ends depending on the comparison.
1285 //
1286- int db1 = getDb(p);
1287+ final int db1 = getDb(p);
1288
1289 if (db1 == kb) {
1290 db = db1;
1291@@ -998,10 +1012,10 @@
1292 // for each byte in the key.
1293 //
1294 kbData = getInt(p);
1295- int tail = decodeKeyBlockTail(kbData);
1296- int tbData = getInt(tail);
1297- int tlength = decodeTailBlockKLength(tbData) + depth + 1;
1298- int qlength = tlength < klength ? tlength : klength;
1299+ final int tail = decodeKeyBlockTail(kbData);
1300+ final int tbData = getInt(tail);
1301+ final int tlength = decodeTailBlockKLength(tbData) + depth + 1;
1302+ final int qlength = tlength < klength ? tlength : klength;
1303 //
1304 // Walk down the key, increasing depth
1305 //
1306@@ -1025,7 +1039,7 @@
1307 // Key is less than tail, so we return
1308 // this keyblock
1309 //
1310- int result = p | (depth << DEPTH_SHIFT) | FIXUP_MASK;
1311+ final int result = p | (depth << DEPTH_SHIFT) | FIXUP_MASK;
1312 return result;
1313 }
1314 matched = false;
1315@@ -1045,7 +1059,7 @@
1316 // And the key lengths are equal so this is an
1317 // exact match.
1318 //
1319- int result = p | (depth << DEPTH_SHIFT) | EXACT_MASK;
1320+ final int result = p | (depth << DEPTH_SHIFT) | EXACT_MASK;
1321 return result;
1322 }
1323 } else if (tlength > qlength) {
1324@@ -1054,7 +1068,7 @@
1325 // key is less than tail, so we return the
1326 // this keyblock since it is greater than the key
1327 //
1328- int result = p | (depth << DEPTH_SHIFT) | FIXUP_MASK;
1329+ final int result = p | (depth << DEPTH_SHIFT) | FIXUP_MASK;
1330 return result;
1331 }
1332 // Otherwise, the key is longer, so we move to the next
1333@@ -1066,7 +1080,7 @@
1334
1335 }
1336
1337- int result = right | (depth << DEPTH_SHIFT);
1338+ final int result = right | (depth << DEPTH_SHIFT);
1339 return result;
1340 }
1341
1342@@ -1074,13 +1088,13 @@
1343 if (isDataPage()) {
1344 final int p = foundAt & P_MASK;
1345 if (p >= KEY_BLOCK_START && p < _keyBlockEnd) {
1346- int kbData = getInt(p);
1347- int tail = decodeKeyBlockTail(kbData);
1348- int tbData = getInt(tail);
1349- int klength = decodeTailBlockKLength(tbData);
1350- int size = decodeTailBlockSize(tbData);
1351- int offset = tail + _tailHeaderSize + klength;
1352- int valueSize = size - klength - _tailHeaderSize;
1353+ final int kbData = getInt(p);
1354+ final int tail = decodeKeyBlockTail(kbData);
1355+ final int tbData = getInt(tail);
1356+ final int klength = decodeTailBlockKLength(tbData);
1357+ final int size = decodeTailBlockSize(tbData);
1358+ final int offset = tail + _tailHeaderSize + klength;
1359+ final int valueSize = size - klength - _tailHeaderSize;
1360 return valueSize == 1 && _bytes[offset] == MVV.TYPE_ANTIVALUE;
1361 }
1362 }
1363@@ -1099,13 +1113,13 @@
1364 if (isDataPage() || isIndexPage()) {
1365 final int p = foundAt & P_MASK;
1366 if (p >= KEY_BLOCK_START && p < _keyBlockEnd) {
1367- int kbData = getInt(p);
1368- int tail = decodeKeyBlockTail(kbData);
1369- int tbData = getInt(tail);
1370- int klength = decodeTailBlockKLength(tbData);
1371- int size = decodeTailBlockSize(tbData);
1372- int offset = tail + _tailHeaderSize + klength;
1373- int valueSize = size - klength - _tailHeaderSize;
1374+ final int kbData = getInt(p);
1375+ final int tail = decodeKeyBlockTail(kbData);
1376+ final int tbData = getInt(tail);
1377+ final int klength = decodeTailBlockKLength(tbData);
1378+ final int size = decodeTailBlockSize(tbData);
1379+ final int offset = tail + _tailHeaderSize + klength;
1380+ final int valueSize = size - klength - _tailHeaderSize;
1381 return ((long) offset) << 32 | valueSize;
1382 }
1383 }
1384@@ -1116,13 +1130,13 @@
1385 Debug.$assert0.t(foundAt > 0 && foundAt < _keyBlockEnd);
1386 if (isDataPage() || isIndexPage()) {
1387 for (int p = KEY_BLOCK_START; p <= foundAt; p += KEYBLOCK_LENGTH) {
1388- int kbData = getInt(p);
1389- int tail = decodeKeyBlockTail(kbData);
1390- int ebc = decodeKeyBlockEbc(kbData);
1391- int db = decodeKeyBlockDb(kbData);
1392- int tbData = getInt(tail);
1393- int klength = decodeTailBlockKLength(tbData);
1394- byte[] keyBytes = key.getEncodedBytes();
1395+ final int kbData = getInt(p);
1396+ final int tail = decodeKeyBlockTail(kbData);
1397+ final int ebc = decodeKeyBlockEbc(kbData);
1398+ final int db = decodeKeyBlockDb(kbData);
1399+ final int tbData = getInt(tail);
1400+ final int klength = decodeTailBlockKLength(tbData);
1401+ final byte[] keyBytes = key.getEncodedBytes();
1402 keyBytes[ebc] = (byte) db;
1403 System.arraycopy(_bytes, tail + _tailHeaderSize, keyBytes, ebc + 1, klength);
1404 key.setEncodedSize(ebc + klength + 1);
1405@@ -1130,32 +1144,32 @@
1406 }
1407 }
1408
1409- Value fetch(int foundAt, Value value) {
1410+ Value fetch(final int foundAt, final Value value) {
1411 if ((foundAt & EXACT_MASK) == 0) {
1412 value.clear();
1413 } else {
1414 Debug.$assert0.t(foundAt > 0 && (foundAt & P_MASK) < _keyBlockEnd);
1415- int kbData = getInt(foundAt & P_MASK);
1416- int tail = decodeKeyBlockTail(kbData);
1417- int tbData = getInt(tail);
1418- int klength = decodeTailBlockKLength(tbData);
1419- int size = decodeTailBlockSize(tbData);
1420- int valueSize = size - klength - _tailHeaderSize;
1421+ final int kbData = getInt(foundAt & P_MASK);
1422+ final int tail = decodeKeyBlockTail(kbData);
1423+ final int tbData = getInt(tail);
1424+ final int klength = decodeTailBlockKLength(tbData);
1425+ final int size = decodeTailBlockSize(tbData);
1426+ final int valueSize = size - klength - _tailHeaderSize;
1427 value.putEncodedBytes(_bytes, tail + _tailHeaderSize + klength, valueSize);
1428 }
1429 return value;
1430 }
1431
1432- long fetchLongRecordPointer(int foundAt) {
1433+ long fetchLongRecordPointer(final int foundAt) {
1434 if (!isDataPage()) {
1435 return 0;
1436 }
1437- int kbData = getInt(foundAt & P_MASK);
1438- int tail = decodeKeyBlockTail(kbData);
1439- int tbData = getInt(tail);
1440- int klength = decodeTailBlockKLength(tbData);
1441- int size = decodeTailBlockSize(tbData);
1442- int valueSize = size - klength - _tailHeaderSize;
1443+ final int kbData = getInt(foundAt & P_MASK);
1444+ final int tail = decodeKeyBlockTail(kbData);
1445+ final int tbData = getInt(tail);
1446+ final int klength = decodeTailBlockKLength(tbData);
1447+ final int size = decodeTailBlockSize(tbData);
1448+ final int valueSize = size - klength - _tailHeaderSize;
1449 if (valueSize != LONGREC_SIZE) {
1450 return 0;
1451 }
1452@@ -1163,16 +1177,16 @@
1453 return 0;
1454 }
1455
1456- long pointer = getLong(tail + _tailHeaderSize + klength + LONGREC_PAGE_OFFSET);
1457+ final long pointer = getLong(tail + _tailHeaderSize + klength + LONGREC_PAGE_OFFSET);
1458 return pointer;
1459 }
1460
1461- long getPointer(int foundAt) throws PersistitException {
1462+ long getPointer(final int foundAt) throws PersistitException {
1463 if (!isIndexPage()) {
1464 throw new InvalidPageTypeException("type=" + _type);
1465 }
1466- int kbData = getInt(foundAt & P_MASK);
1467- int tail = decodeKeyBlockTail(kbData);
1468+ final int kbData = getInt(foundAt & P_MASK);
1469+ final int tail = decodeKeyBlockTail(kbData);
1470 return getInt(tail + 4);
1471 }
1472
1473@@ -1185,8 +1199,8 @@
1474 * @param foundAt
1475 * @return
1476 */
1477- int traverse(Key key, Key.Direction mode, int foundAt) {
1478- boolean exactMatch = (foundAt & EXACT_MASK) > 0;
1479+ int traverse(final Key key, final Key.Direction mode, final int foundAt) {
1480+ final boolean exactMatch = (foundAt & EXACT_MASK) > 0;
1481 if (mode == Key.EQ || exactMatch && (mode == Key.LTEQ || mode == Key.GTEQ)) {
1482 return foundAt;
1483 }
1484@@ -1205,21 +1219,21 @@
1485 * @param foundAt
1486 * @return
1487 */
1488- int previousKey(Key key, int foundAt) {
1489+ int previousKey(final Key key, final int foundAt) {
1490 int p = (foundAt & P_MASK) - KEYBLOCK_LENGTH;
1491- int depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
1492+ final int depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
1493
1494 if (p < KEY_BLOCK_START)
1495 return foundAt;
1496
1497- byte[] kbytes = key.getEncodedBytes();
1498+ final byte[] kbytes = key.getEncodedBytes();
1499
1500 // Compute the count of prefix bytes in the supplied key that
1501 // are known to match. The leftmost knownGood bytes do not need
1502 // to be recovered by traversing keys in the page.
1503 //
1504- int kbData2 = getInt(p + KEYBLOCK_LENGTH);
1505- int ebc2 = decodeKeyBlockEbc(kbData2);
1506+ final int kbData2 = getInt(p + KEYBLOCK_LENGTH);
1507+ final int ebc2 = decodeKeyBlockEbc(kbData2);
1508 int kbData = getInt(p);
1509 int ebc = decodeKeyBlockEbc(kbData);
1510 int knownGood = ebc;
1511@@ -1244,7 +1258,7 @@
1512 int unknown = decodeTailBlockKLength(getInt(tail)) + ebc + 1;
1513 key.setEncodedSize(unknown);
1514
1515- int result = p | (unknown << DEPTH_SHIFT) | EXACT_MASK;
1516+ final int result = p | (unknown << DEPTH_SHIFT) | EXACT_MASK;
1517 //
1518 // Reconstruct the previous key.
1519 //
1520@@ -1252,7 +1266,7 @@
1521 if (ebc < unknown) {
1522 // move bytes from this keyblock into the result key.
1523 kbytes[ebc] = (byte) decodeKeyBlockDb(kbData);
1524- int more = unknown - ebc - 1;
1525+ final int more = unknown - ebc - 1;
1526 if (more > 0) {
1527 System.arraycopy(_bytes, tail + _tailHeaderSize, kbytes, ebc + 1, more);
1528 }
1529@@ -1278,7 +1292,7 @@
1530 * @param foundAt
1531 * @return
1532 */
1533- int nextKey(Key key, int foundAt) {
1534+ int nextKey(final Key key, final int foundAt) {
1535 int p = foundAt & P_MASK;
1536 if ((foundAt & EXACT_MASK) != 0)
1537 p += KEYBLOCK_LENGTH;
1538@@ -1286,16 +1300,16 @@
1539 if (p >= _keyBlockEnd)
1540 return foundAt;
1541
1542- byte[] kbytes = key.getEncodedBytes();
1543- int kbData = getInt(p);
1544- int ebc = decodeKeyBlockEbc(kbData);
1545- int tail = decodeKeyBlockTail(kbData);
1546- int tbData = getInt(tail);
1547- int klength = decodeTailBlockKLength(tbData);
1548- int keyLength = klength + ebc + 1;
1549+ final byte[] kbytes = key.getEncodedBytes();
1550+ final int kbData = getInt(p);
1551+ final int ebc = decodeKeyBlockEbc(kbData);
1552+ final int tail = decodeKeyBlockTail(kbData);
1553+ final int tbData = getInt(tail);
1554+ final int klength = decodeTailBlockKLength(tbData);
1555+ final int keyLength = klength + ebc + 1;
1556 key.setEncodedSize(keyLength);
1557
1558- int result = p | (keyLength << DEPTH_SHIFT) | EXACT_MASK;
1559+ final int result = p | (keyLength << DEPTH_SHIFT) | EXACT_MASK;
1560 //
1561 // Note: the findKey method is guaranteed to return the offset of a
1562 // keyblock whose first ebc bytes match the supplied key.
1563@@ -1313,15 +1327,15 @@
1564 * @param foundAt
1565 * @return
1566 */
1567- int nextLongRecord(Value value, int foundAt) {
1568+ int nextLongRecord(final Value value, final int foundAt) {
1569 Debug.$assert0.t(isDataPage());
1570 for (int p = foundAt & P_MASK; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
1571- int kbData = getInt(p);
1572- int tail = decodeKeyBlockTail(kbData);
1573- int tbData = getInt(tail);
1574- int klength = decodeTailBlockKLength(tbData);
1575- int size = decodeTailBlockSize(tbData);
1576- int valueSize = size - klength - _tailHeaderSize;
1577+ final int kbData = getInt(p);
1578+ final int tail = decodeKeyBlockTail(kbData);
1579+ final int tbData = getInt(tail);
1580+ final int klength = decodeTailBlockKLength(tbData);
1581+ final int size = decodeTailBlockSize(tbData);
1582+ final int valueSize = size - klength - _tailHeaderSize;
1583 if ((valueSize > 0) && ((_bytes[tail + _tailHeaderSize + klength] & 0xFF) == LONGREC_TYPE)) {
1584 value.putEncodedBytes(_bytes, tail + _tailHeaderSize + klength, valueSize);
1585 return p;
1586@@ -1330,15 +1344,15 @@
1587 return -1;
1588 }
1589
1590- int previousKeyBlock(int foundAt) {
1591- int p = (foundAt & P_MASK) - KEYBLOCK_LENGTH;
1592+ int previousKeyBlock(final int foundAt) {
1593+ final int p = (foundAt & P_MASK) - KEYBLOCK_LENGTH;
1594 if (p < KEY_BLOCK_START || p > _keyBlockEnd)
1595 return -1;
1596 return p;
1597 }
1598
1599- int nextKeyBlock(int foundAt) {
1600- int p = (foundAt & P_MASK) + KEYBLOCK_LENGTH;
1601+ int nextKeyBlock(final int foundAt) {
1602+ final int p = (foundAt & P_MASK) + KEYBLOCK_LENGTH;
1603 if (p >= _keyBlockEnd || p < KEY_BLOCK_START)
1604 return -1;
1605 return p;
1606@@ -1366,8 +1380,8 @@
1607 * The value, converted to a byte array
1608 * @throws PersistitInterruptedException
1609 */
1610- int putValue(Key key, ValueHelper valueHelper) throws PersistitInterruptedException {
1611- int p = findKey(key);
1612+ int putValue(final Key key, final ValueHelper valueHelper) throws PersistitInterruptedException {
1613+ final int p = findKey(key);
1614 return putValue(key, valueHelper, p, false);
1615 }
1616
1617@@ -1383,13 +1397,13 @@
1618 * @param foundAt
1619 * The keyblock before which this record will be inserted
1620 */
1621- int putValue(Key key, ValueHelper valueHelper, int foundAt, boolean postSplit) {
1622+ int putValue(final Key key, final ValueHelper valueHelper, final int foundAt, final boolean postSplit) {
1623 if (Debug.ENABLED) {
1624 assertVerify();
1625 }
1626
1627- boolean exactMatch = (foundAt & EXACT_MASK) > 0;
1628- int p = foundAt & P_MASK;
1629+ final boolean exactMatch = (foundAt & EXACT_MASK) > 0;
1630+ final int p = foundAt & P_MASK;
1631
1632 if (exactMatch) {
1633 return replaceValue(key, valueHelper, p);
1634@@ -1401,9 +1415,9 @@
1635 length = valueHelper.requiredLength(_bytes, 0, -1);
1636 }
1637
1638- int depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
1639- boolean fixupSuccessor = (foundAt & FIXUP_MASK) > 0;
1640- byte[] kbytes = key.getEncodedBytes();
1641+ final int depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
1642+ final boolean fixupSuccessor = (foundAt & FIXUP_MASK) > 0;
1643+ final byte[] kbytes = key.getEncodedBytes();
1644
1645 int ebcNew;
1646 int ebcSuccessor;
1647@@ -1429,8 +1443,8 @@
1648 ebcSuccessor = 0;
1649 ebcNew = depth;
1650 }
1651- int klength = key.getEncodedSize() - ebcNew - 1;
1652- int newTailSize = klength + length + _tailHeaderSize;
1653+ final int klength = key.getEncodedSize() - ebcNew - 1;
1654+ final int newTailSize = klength + length + _tailHeaderSize;
1655
1656 if (getKeyCount() >= _pool.getMaxKeys() || !willFit(newTailSize + KEYBLOCK_LENGTH - (free1 - free2))) {
1657 Debug.$assert0.t(!postSplit);
1658@@ -1443,8 +1457,8 @@
1659 // is correct.
1660 //
1661 if (fixupSuccessor && ebcNew != ebcSuccessor) {
1662- int successorKeyLength = decodeTailBlockKLength(successorTailBlock);
1663- int successorDb = getByte(successorTail + _tailHeaderSize + delta - 1);
1664+ final int successorKeyLength = decodeTailBlockKLength(successorTailBlock);
1665+ final int successorDb = getByte(successorTail + _tailHeaderSize + delta - 1);
1666
1667 // Write updated successor tail block
1668 putInt(successorTail, encodeTailBlock(successorTailSize - delta, successorKeyLength - delta));
1669@@ -1460,7 +1474,7 @@
1670
1671 putInt(p, kbSuccessor);
1672 }
1673- int dbNew = kbytes[ebcNew] & 0xFF;
1674+ final int dbNew = kbytes[ebcNew] & 0xFF;
1675 //
1676 // Allocate space for the new tail block
1677 //
1678@@ -1481,7 +1495,7 @@
1679 System.arraycopy(_bytes, p, _bytes, p + KEYBLOCK_LENGTH, _keyBlockEnd - p - KEYBLOCK_LENGTH);
1680
1681 // Write new key block
1682- int newKeyBlock = encodeKeyBlock(ebcNew, dbNew, newTail);
1683+ final int newKeyBlock = encodeKeyBlock(ebcNew, dbNew, newTail);
1684 putInt(p, newKeyBlock);
1685
1686 // Write new tail block
1687@@ -1493,14 +1507,18 @@
1688 System.arraycopy(kbytes, ebcNew + 1, _bytes, newTail + _tailHeaderSize, klength);
1689
1690 if (isIndexPage()) {
1691- int pointer = (int) valueHelper.getPointerValue();
1692+ final int pointer = (int) valueHelper.getPointerValue();
1693
1694 Debug.$assert0.t(p + KEYBLOCK_LENGTH < _keyBlockEnd ? pointer > 0 : true);
1695 putInt(newTail + TAILBLOCK_POINTER, pointer);
1696 } else {
1697- int storedLength = valueHelper.storeVersion(_bytes, newTail + _tailHeaderSize + klength, -1,
1698- _bytes.length); // TODO limit
1699- incCountIfMvv(_bytes, newTail + _tailHeaderSize + klength, storedLength & MVV.STORE_LENGTH_MASK);
1700+ final int offset = newTail + _tailHeaderSize + klength;
1701+ final int storedLength = valueHelper.storeVersion(_bytes, offset, -1, _bytes.length); // TODO
1702+ // limit
1703+ incCountIfMvv(_bytes, offset, storedLength & MVV.STORE_LENGTH_MASK);
1704+
1705+ // TODO - remove after debugging
1706+ MVV.verify(_persistit.getTransactionIndex(), _bytes, offset, storedLength & MVV.STORE_LENGTH_MASK);
1707 }
1708 //
1709 // Correct not to call getFastIndex()
1710@@ -1532,12 +1550,12 @@
1711 */
1712 private boolean adjacentKeyCheck(int p) {
1713 p &= P_MASK;
1714- int kbData1 = getInt(p);
1715- int kbData2 = getInt(p + KEYBLOCK_LENGTH);
1716- int db1 = decodeKeyBlockDb(kbData1);
1717- int ebc1 = decodeKeyBlockEbc(kbData1);
1718- int db2 = decodeKeyBlockDb(kbData2);
1719- int ebc2 = decodeKeyBlockEbc(kbData2);
1720+ final int kbData1 = getInt(p);
1721+ final int kbData2 = getInt(p + KEYBLOCK_LENGTH);
1722+ final int db1 = decodeKeyBlockDb(kbData1);
1723+ final int ebc1 = decodeKeyBlockEbc(kbData1);
1724+ final int db2 = decodeKeyBlockDb(kbData2);
1725+ final int ebc2 = decodeKeyBlockEbc(kbData2);
1726
1727 if (db1 == 0 && p > KEY_BLOCK_START) {
1728 return false; // Can set breakpoint here
1729@@ -1551,9 +1569,9 @@
1730 if (ebc2 < ebc1)
1731 return true;
1732 if (ebc2 > ebc1) {
1733- int tail1 = decodeKeyBlockTail(kbData1);
1734- int tbData1 = getInt(tail1);
1735- int klength1 = decodeTailBlockKLength(tbData1);
1736+ final int tail1 = decodeKeyBlockTail(kbData1);
1737+ final int tbData1 = getInt(tail1);
1738+ final int klength1 = decodeTailBlockKLength(tbData1);
1739 int db = -1;
1740 if (klength1 >= ebc2 - ebc1) {
1741 db = _bytes[tail1 + _tailHeaderSize + ebc2 - ebc1 - 1] & DB_MASK;
1742@@ -1569,12 +1587,12 @@
1743 return false; // Can set breakpoint here
1744 }
1745
1746- private int replaceValue(Key key, ValueHelper valueHelper, int p) {
1747- int kbData = getInt(p);
1748- int tail = decodeKeyBlockTail(kbData);
1749- int tbData = getInt(tail);
1750- int klength = decodeTailBlockKLength(tbData);
1751- int oldTailSize = decodeTailBlockSize(tbData);
1752+ private int replaceValue(final Key key, final ValueHelper valueHelper, final int p) {
1753+ final int kbData = getInt(p);
1754+ final int tail = decodeKeyBlockTail(kbData);
1755+ final int tbData = getInt(tail);
1756+ final int klength = decodeTailBlockKLength(tbData);
1757+ final int oldTailSize = decodeTailBlockSize(tbData);
1758 boolean wasMVV = false;
1759 boolean isMVV = false;
1760
1761@@ -1587,9 +1605,9 @@
1762 wasMVV = isValueMVV(_bytes, tail + _tailHeaderSize + klength, oldTailSize - _tailHeaderSize - klength);
1763 }
1764
1765- int newTailSize = klength + length + _tailHeaderSize;
1766- int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1767- int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1768+ final int newTailSize = klength + length + _tailHeaderSize;
1769+ final int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1770+ final int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1771 int newTail = tail;
1772 if (newNext < oldNext) {
1773 // Free the remainder of the old tail block
1774@@ -1622,13 +1640,18 @@
1775 }
1776
1777 if (isIndexPage()) {
1778- long pointer = valueHelper.getPointerValue();
1779+ final long pointer = valueHelper.getPointerValue();
1780 Debug.$assert0.t(p + KEYBLOCK_LENGTH < _keyBlockEnd ? pointer > 0 : pointer == -1);
1781 putInt(newTail + TAILBLOCK_POINTER, (int) pointer);
1782 } else {
1783- final int storedLength = valueHelper.storeVersion(_bytes, newTail + _tailHeaderSize + klength, oldTailSize
1784- - _tailHeaderSize - klength, _bytes.length); // TODO - limit
1785- isMVV = isValueMVV(_bytes, newTail + _tailHeaderSize + klength, storedLength & MVV.STORE_LENGTH_MASK);
1786+ final int offset = newTail + _tailHeaderSize + klength;
1787+ final int storedLength = valueHelper.storeVersion(_bytes, offset, oldTailSize - _tailHeaderSize - klength,
1788+ _bytes.length); // TODO - limit
1789+ isMVV = isValueMVV(_bytes, offset, storedLength & MVV.STORE_LENGTH_MASK);
1790+
1791+ // TODO - remove after debugging
1792+ MVV.verify(_persistit.getTransactionIndex(), _bytes, offset, storedLength & MVV.STORE_LENGTH_MASK);
1793+
1794 }
1795 if (!wasMVV && isMVV) {
1796 _mvvCount++;
1797@@ -1658,11 +1681,11 @@
1798 * @return <i>true</i> if the key was found and the value removed, else
1799 * <i>false</i>
1800 */
1801- boolean removeKeys(int foundAt1, int foundAt2, Key spareKey) {
1802+ boolean removeKeys(final int foundAt1, final int foundAt2, final Key spareKey) {
1803 if (Debug.ENABLED) {
1804 assertVerify();
1805 }
1806- int p1 = foundAt1 & P_MASK;
1807+ final int p1 = foundAt1 & P_MASK;
1808 int p2 = foundAt2 & P_MASK;
1809 if ((foundAt2 & EXACT_MASK) != 0)
1810 p2 += KEYBLOCK_LENGTH;
1811@@ -1675,24 +1698,24 @@
1812
1813 int ebc = Integer.MAX_VALUE;
1814
1815- byte[] spareBytes = spareKey.getEncodedBytes();
1816+ final byte[] spareBytes = spareKey.getEncodedBytes();
1817 int keySize = 0;
1818 for (int p = p1; p < p2; p += KEYBLOCK_LENGTH) {
1819- int kbData = getInt(p);
1820- int ebcCandidate = decodeKeyBlockEbc(kbData);
1821+ final int kbData = getInt(p);
1822+ final int ebcCandidate = decodeKeyBlockEbc(kbData);
1823 if (ebcCandidate < ebc) {
1824 ebc = ebcCandidate;
1825 }
1826- int db = decodeKeyBlockDb(kbData);
1827- int tail = decodeKeyBlockTail(kbData);
1828- int tbData = getInt(tail);
1829- int klength = decodeTailBlockKLength(tbData);
1830+ final int db = decodeKeyBlockDb(kbData);
1831+ final int tail = decodeKeyBlockTail(kbData);
1832+ final int tbData = getInt(tail);
1833+ final int klength = decodeTailBlockKLength(tbData);
1834 spareBytes[ebcCandidate] = (byte) db;
1835 if (klength > 0) {
1836 System.arraycopy(_bytes, tail + _tailHeaderSize, spareBytes, ebcCandidate + 1, klength);
1837 }
1838 keySize = klength + ebcCandidate + 1;
1839- int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1840+ final int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1841 deallocTail(tail, size);
1842 }
1843 spareKey.setEncodedSize(keySize);
1844@@ -1711,22 +1734,22 @@
1845 //
1846 if (p1 < _keyBlockEnd) {
1847 int kbNext = getInt(p1);
1848- int ebcNext = decodeKeyBlockEbc(kbNext);
1849+ final int ebcNext = decodeKeyBlockEbc(kbNext);
1850
1851 //
1852 // If ebcNext > ebc then the successor key will need to expand.
1853 //
1854 if (ebcNext > ebc) {
1855 int tailNext = decodeKeyBlockTail(kbNext);
1856- int dbNext = decodeKeyBlockDb(kbNext);
1857- int tbNext = getInt(tailNext);
1858- int nextTailSize = decodeTailBlockSize(tbNext);
1859-
1860- int nextTailBlockSize = (nextTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1861-
1862- int newNextTailBlockSize = (nextTailSize + ebcNext - ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1863-
1864- int delta = newNextTailBlockSize - nextTailBlockSize;
1865+ final int dbNext = decodeKeyBlockDb(kbNext);
1866+ final int tbNext = getInt(tailNext);
1867+ final int nextTailSize = decodeTailBlockSize(tbNext);
1868+
1869+ final int nextTailBlockSize = (nextTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1870+
1871+ final int newNextTailBlockSize = (nextTailSize + ebcNext - ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1872+
1873+ final int delta = newNextTailBlockSize - nextTailBlockSize;
1874 boolean freeNextTailBlock = false;
1875 int newNextTail = tailNext;
1876 if (delta > 0) {
1877@@ -1786,17 +1809,17 @@
1878 //
1879 // Now construct the new tail block
1880 //
1881- int newNextKLength = decodeTailBlockKLength(tbNext) + ebcNext - ebc;
1882- int newNextTailSize = nextTailSize + ebcNext - ebc;
1883+ final int newNextKLength = decodeTailBlockKLength(tbNext) + ebcNext - ebc;
1884+ final int newNextTailSize = nextTailSize + ebcNext - ebc;
1885 putInt(newNextTail, encodeTailBlock(newNextTailSize, newNextKLength));
1886 if (freeNextTailBlock) {
1887- int toFree = (nextTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1888+ final int toFree = (nextTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1889 deallocTail(tailNext, toFree);
1890 }
1891 //
1892 // Fix up the successor key block
1893 //
1894- int kbNewNext = encodeKeyBlock(ebc, spareBytes[ebc], newNextTail);
1895+ final int kbNewNext = encodeKeyBlock(ebc, spareBytes[ebc], newNextTail);
1896 putInt(p1, kbNewNext);
1897 }
1898 }
1899@@ -1820,7 +1843,7 @@
1900 * The amount by which that block is to be expanded.
1901 * @return int Offset of the expanded tail block, or -1 if it does not fit.
1902 */
1903- private int wedgeTail(int tail, int delta) {
1904+ private int wedgeTail(final int tail, int delta) {
1905 delta = (delta + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1906 if (delta == 0) {
1907 return tail;
1908@@ -1836,8 +1859,8 @@
1909 _alloc -= delta;
1910
1911 for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
1912- int kbData = getInt(p);
1913- int oldTail = decodeKeyBlockTail(kbData);
1914+ final int kbData = getInt(p);
1915+ final int oldTail = decodeKeyBlockTail(kbData);
1916 if (oldTail < tail) {
1917 putInt(p, encodeKeyBlockTail(kbData, oldTail - delta));
1918 }
1919@@ -1869,8 +1892,8 @@
1920 * the right sibling Buffer.
1921 * @throws PersistitException
1922 */
1923- final int split(Buffer rightSibling, Key key, ValueHelper valueHelper, int foundAt, Key indexKey,
1924- Sequence sequence, SplitPolicy policy) throws PersistitException {
1925+ final int split(final Buffer rightSibling, final Key key, final ValueHelper valueHelper, int foundAt,
1926+ final Key indexKey, final Sequence sequence, final SplitPolicy policy) throws PersistitException {
1927 // Make sure the right sibling page is empty.
1928
1929 Debug.$assert0.t(rightSibling._keyBlockEnd == KEY_BLOCK_START);
1930@@ -1888,10 +1911,10 @@
1931 //
1932 int currentSize = _bufferSize - _alloc - _slack + _keyBlockEnd - KEY_BLOCK_START;
1933
1934- int foundAtPosition = foundAt & P_MASK;
1935- boolean exact = (foundAt & EXACT_MASK) != 0;
1936+ final int foundAtPosition = foundAt & P_MASK;
1937+ final boolean exact = (foundAt & EXACT_MASK) != 0;
1938 int depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
1939- boolean fixupSuccessor = (foundAt & FIXUP_MASK) > 0;
1940+ final boolean fixupSuccessor = (foundAt & FIXUP_MASK) > 0;
1941
1942 int ebcNew;
1943 int ebcSuccessor;
1944@@ -1899,18 +1922,18 @@
1945 int deltaSuccessorEbc = 0;
1946
1947 if (fixupSuccessor) {
1948- int kbSuccessor = getInt(foundAtPosition);
1949- int tbSuccessor = getInt(decodeKeyBlockTail(kbSuccessor));
1950+ final int kbSuccessor = getInt(foundAtPosition);
1951+ final int tbSuccessor = getInt(decodeKeyBlockTail(kbSuccessor));
1952 ebcNew = decodeKeyBlockEbc(kbSuccessor);
1953 ebcSuccessor = depth;
1954- int tbSize = decodeTailBlockSize(tbSuccessor);
1955+ final int tbSize = decodeTailBlockSize(tbSuccessor);
1956
1957 // This is the number of bytes by which the successor key
1958 // can have its elided byte count increased.
1959 deltaSuccessorEbc = ebcSuccessor - ebcNew;
1960
1961- int oldSize = (tbSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1962- int newSize = (tbSize - deltaSuccessorEbc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1963+ final int oldSize = (tbSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1964+ final int newSize = (tbSize - deltaSuccessorEbc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1965
1966 // This is the number of bytes by which the successor tail block
1967 // can be reduced (because its elision count has increased.)
1968@@ -1924,11 +1947,11 @@
1969 int newTailBlockSize;
1970 int newValueSize;
1971 if (exact) {
1972- int kbData = getInt(foundAtPosition);
1973- int tail = decodeKeyBlockTail(kbData);
1974- int tbData = getInt(tail);
1975- int tbSize = decodeTailBlockSize(tbData);
1976- int klength = decodeTailBlockKLength(tbData);
1977+ final int kbData = getInt(foundAtPosition);
1978+ final int tail = decodeKeyBlockTail(kbData);
1979+ final int tbData = getInt(tail);
1980+ final int tbSize = decodeTailBlockSize(tbData);
1981+ final int klength = decodeTailBlockKLength(tbData);
1982 oldTailBlockSize = (tbSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
1983 keyBlockSizeDelta = 0;
1984 ebcNew = decodeKeyBlockEbc(kbData);
1985@@ -1940,7 +1963,7 @@
1986 newTailBlockSize = ((isIndexPage() ? 0 : newValueSize) + _tailHeaderSize + key.getEncodedSize() - ebcNew - 1 + ~TAILBLOCK_MASK)
1987 & TAILBLOCK_MASK;
1988
1989- int virtualSize = currentSize + newTailBlockSize - oldTailBlockSize + keyBlockSizeDelta
1990+ final int virtualSize = currentSize + newTailBlockSize - oldTailBlockSize + keyBlockSizeDelta
1991 - deltaSuccessorTailSize;
1992
1993 int splitBest = 0; // Maximal fitness measure
1994@@ -1951,7 +1974,7 @@
1995 boolean armed = true;
1996 int whereInserted = -1;
1997
1998- int rightKeyBlock = _keyBlockEnd - KEYBLOCK_LENGTH;
1999+ final int rightKeyBlock = _keyBlockEnd - KEYBLOCK_LENGTH;
2000 for (int p = KEY_BLOCK_START; p < rightKeyBlock;) {
2001 int splitCandidate = 0;
2002 if (p == foundAtPosition && armed) {
2003@@ -1968,18 +1991,18 @@
2004 // Compute the number of bytes by which the successor tailblock
2005 // will grow due to its elision count becoming zero.
2006 //
2007- int kbData = getInt(p);
2008- int tbData = getInt(decodeKeyBlockTail(kbData));
2009- int ebc = decodeKeyBlockEbc(kbData);
2010- int tbSize = decodeTailBlockSize(tbData);
2011- int tbSizeDelta = ((tbSize + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2012+ final int kbData = getInt(p);
2013+ final int tbData = getInt(decodeKeyBlockTail(kbData));
2014+ final int ebc = decodeKeyBlockEbc(kbData);
2015+ final int tbSize = decodeTailBlockSize(tbData);
2016+ final int tbSizeDelta = ((tbSize + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2017 - ((tbSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2018
2019- int edgeTailBlockSize = (decodeTailBlockKLength(tbData) - deltaSuccessorEbc + _tailHeaderSize + ~TAILBLOCK_MASK)
2020+ final int edgeTailBlockSize = (decodeTailBlockKLength(tbData) - deltaSuccessorEbc + _tailHeaderSize + ~TAILBLOCK_MASK)
2021 & TAILBLOCK_MASK;
2022
2023 if (p < rightKeyBlock) {
2024- int rightSize = virtualSize - leftSize + tbSizeDelta;
2025+ final int rightSize = virtualSize - leftSize + tbSizeDelta;
2026
2027 splitCandidate = policy.splitFit(this, p, foundAtPosition, exact, leftSize + KEYBLOCK_LENGTH
2028 + edgeTailBlockSize, rightSize, currentSize, virtualSize, _bufferSize - KEY_BLOCK_START,
2029@@ -1996,7 +2019,7 @@
2030 int kbData = getInt(p);
2031 int tbData = getInt(decodeKeyBlockTail(kbData));
2032 int tbSizeDelta;
2033- int tailBlockSize = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2034+ final int tailBlockSize = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2035 leftSize += tailBlockSize + KEYBLOCK_LENGTH;
2036
2037 p += KEYBLOCK_LENGTH;
2038@@ -2011,8 +2034,8 @@
2039 } else {
2040 kbData = getInt(p);
2041 tbData = getInt(decodeKeyBlockTail(kbData));
2042- int ebc = decodeKeyBlockEbc(kbData);
2043- int tbSize = decodeTailBlockSize(tbData);
2044+ final int ebc = decodeKeyBlockEbc(kbData);
2045+ final int tbSize = decodeTailBlockSize(tbData);
2046
2047 tbSizeDelta = ((tbSize + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2048 - ((tbSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2049@@ -2022,7 +2045,7 @@
2050 }
2051
2052 if (p < rightKeyBlock) {
2053- int rightSize = virtualSize - leftSize + tbSizeDelta;
2054+ final int rightSize = virtualSize - leftSize + tbSizeDelta;
2055
2056 splitCandidate = policy.splitFit(this, p, foundAtPosition, exact, leftSize + KEYBLOCK_LENGTH
2057 + edgeTailBlockSize, rightSize, currentSize, virtualSize, _bufferSize - KEY_BLOCK_START,
2058@@ -2048,11 +2071,11 @@
2059 //
2060 // Now move the keys and records.
2061 //
2062- byte[] indexKeyBytes = indexKey.getEncodedBytes();
2063- int splitAtPosition = splitAt & P_MASK;
2064+ final byte[] indexKeyBytes = indexKey.getEncodedBytes();
2065+ final int splitAtPosition = splitAt & P_MASK;
2066
2067- boolean lastLeft = (splitAt & EXACT_MASK) != 0;
2068- boolean firstRight = !lastLeft && splitAtPosition == foundAtPosition;
2069+ final boolean lastLeft = (splitAt & EXACT_MASK) != 0;
2070+ final boolean firstRight = !lastLeft && splitAtPosition == foundAtPosition;
2071 int indexKeyDepth = 0;
2072 //
2073 // First we need to compute the full key in the right sibling page.
2074@@ -2074,18 +2097,18 @@
2075 //
2076 if (!firstRight) {
2077 for (int p = scanStart; p <= splitAtPosition; p += KEYBLOCK_LENGTH) {
2078- int kbData = getInt(p);
2079- int ebc = decodeKeyBlockEbc(kbData);
2080- int db = decodeKeyBlockDb(kbData);
2081- int tail = decodeKeyBlockTail(kbData);
2082+ final int kbData = getInt(p);
2083+ final int ebc = decodeKeyBlockEbc(kbData);
2084+ final int db = decodeKeyBlockDb(kbData);
2085+ final int tail = decodeKeyBlockTail(kbData);
2086 if (ebc > indexKeyDepth) {
2087 throw new InvalidPageStructureException("ebc at " + p + " ebc=" + ebc + " > indexKeyDepth="
2088 + indexKeyDepth);
2089 }
2090 indexKeyDepth = ebc;
2091 indexKeyBytes[indexKeyDepth++] = (byte) db;
2092- int tbData = getInt(tail);
2093- int klength = decodeTailBlockKLength(tbData);
2094+ final int tbData = getInt(tail);
2095+ final int klength = decodeTailBlockKLength(tbData);
2096
2097 System.arraycopy(_bytes, tail + _tailHeaderSize, indexKeyBytes, indexKeyDepth, klength);
2098 indexKeyDepth += klength;
2099@@ -2202,7 +2225,7 @@
2100 if (isDataPage()) {
2101 currentSize = (tailBlockSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2102
2103- int newSize = (tailBlockSize - dataSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2104+ final int newSize = (tailBlockSize - dataSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2105 if (newSize != currentSize) {
2106 deallocTail(tail + newSize, currentSize - newSize);
2107 }
2108@@ -2217,9 +2240,9 @@
2109 //
2110 // Fix up the right edge key in the left page.
2111 //
2112- int kbData = getInt(splitAtPosition);
2113+ final int kbData = getInt(splitAtPosition);
2114 int edgeTail = decodeKeyBlockTail(kbData);
2115- int ebc = decodeKeyBlockEbc(kbData);
2116+ final int ebc = decodeKeyBlockEbc(kbData);
2117 depth = (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
2118
2119 if (firstRight && !exact) {
2120@@ -2230,10 +2253,10 @@
2121 if (fixupSuccessor) {
2122 depth = ebc;
2123 }
2124- int db = indexKeyBytes[depth];
2125+ final int db = indexKeyBytes[depth];
2126
2127- int edgeKeyLength = indexKey.getEncodedSize() - depth - 1;
2128- int edgeTailBlockSize = edgeKeyLength + _tailHeaderSize;
2129+ final int edgeKeyLength = indexKey.getEncodedSize() - depth - 1;
2130+ final int edgeTailBlockSize = edgeKeyLength + _tailHeaderSize;
2131 edgeTail = allocTail(edgeTailBlockSize);
2132 if (edgeTail == -1) {
2133 setKeyBlockEnd(splitAtPosition);
2134@@ -2367,8 +2390,8 @@
2135 * in the rare case where no rearrangement of the records is
2136 * possible.
2137 */
2138- final boolean join(Buffer buffer, int foundAt1, int foundAt2, Key indexKey, Key spareKey, JoinPolicy policy)
2139- throws RebalanceException {
2140+ final boolean join(final Buffer buffer, int foundAt1, int foundAt2, final Key indexKey, final Key spareKey,
2141+ final JoinPolicy policy) throws RebalanceException {
2142 foundAt1 &= P_MASK;
2143 foundAt2 &= P_MASK;
2144
2145@@ -2401,17 +2424,17 @@
2146 //
2147 buffer.keyAt(foundAt2, spareKey);
2148
2149- long measureLeft = joinMeasure(foundAt1, _keyBlockEnd);
2150- long measureRight = buffer.joinMeasure(KEY_BLOCK_START, foundAt2);
2151+ final long measureLeft = joinMeasure(foundAt1, _keyBlockEnd);
2152+ final long measureRight = buffer.joinMeasure(KEY_BLOCK_START, foundAt2);
2153 kbData = buffer.getInt(foundAt2);
2154- int oldEbc = decodeKeyBlockEbc(kbData);
2155- int newEbc = Math.min(oldEbc, Math.min((int) (measureLeft >>> 32), (int) (measureRight >>> 32)));
2156+ final int oldEbc = decodeKeyBlockEbc(kbData);
2157+ final int newEbc = Math.min(oldEbc, Math.min((int) (measureLeft >>> 32), (int) (measureRight >>> 32)));
2158 tail = decodeKeyBlockTail(kbData);
2159 tbData = buffer.getInt(tail);
2160
2161- int oldSize = decodeTailBlockSize(tbData);
2162- int newSize = oldSize + (oldEbc - newEbc);
2163- int adjustmentForNewEbc = ((newSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2164+ final int oldSize = decodeTailBlockSize(tbData);
2165+ final int newSize = oldSize + (oldEbc - newEbc);
2166+ final int adjustmentForNewEbc = ((newSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2167 - ((oldSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2168
2169 /*
2170@@ -2424,7 +2447,7 @@
2171 final int virtualKeyCount = ((foundAt1 - KEY_BLOCK_START) + (buffer.getKeyBlockEnd() - foundAt2))
2172 / KEYBLOCK_LENGTH;
2173
2174- boolean okayToRejoin = virtualKeyCount < _pool.getMaxKeys() && policy.acceptJoin(this, virtualSize);
2175+ final boolean okayToRejoin = virtualKeyCount < _pool.getMaxKeys() && policy.acceptJoin(this, virtualSize);
2176
2177 boolean result;
2178
2179@@ -2473,7 +2496,7 @@
2180 /*
2181 * unsplice the right buffer from the right sibling chain.
2182 */
2183- long rightSibling = buffer.getRightSibling();
2184+ final long rightSibling = buffer.getRightSibling();
2185 setRightSibling(rightSibling);
2186 if (hasMVV) {
2187 _mvvCount = Integer.MAX_VALUE;
2188@@ -2520,7 +2543,7 @@
2189 buffer.joinDeallocateTails(KEY_BLOCK_START, foundAt2);
2190 buffer.clearBytes(KEY_BLOCK_START, foundAt2);
2191 buffer.reduceEbc(foundAt2, newEbc, spareKeyBytes);
2192- int rightSize = buffer._keyBlockEnd - joinOffset;
2193+ final int rightSize = buffer._keyBlockEnd - joinOffset;
2194
2195 moveRecords(buffer, foundAt2, joinOffset, _keyBlockEnd, true);
2196
2197@@ -2540,7 +2563,7 @@
2198
2199 buffer.joinDeallocateTails(KEY_BLOCK_START, foundAt2);
2200
2201- int rightSize = buffer._keyBlockEnd - foundAt2;
2202+ final int rightSize = buffer._keyBlockEnd - foundAt2;
2203 System.arraycopy(buffer._bytes, foundAt2, buffer._bytes, KEY_BLOCK_START, rightSize);
2204 buffer.clearBytes(KEY_BLOCK_START + rightSize, buffer._keyBlockEnd);
2205 buffer.setKeyBlockEnd(KEY_BLOCK_START + rightSize);
2206@@ -2629,18 +2652,18 @@
2207 * @return long encoding the size being deleted and the minimum ebc
2208 *
2209 */
2210- long joinMeasure(int from, int to) {
2211+ long joinMeasure(final int from, final int to) {
2212 int minimumEbc = Integer.MAX_VALUE;
2213 int totalDeallocatedSize = 0;
2214 for (int index = from; index < to; index += KEYBLOCK_LENGTH) {
2215- int kbData = getInt(index);
2216- int ebc = decodeKeyBlockEbc(kbData);
2217+ final int kbData = getInt(index);
2218+ final int ebc = decodeKeyBlockEbc(kbData);
2219 if (index != KEY_BLOCK_START && ebc < minimumEbc) {
2220 minimumEbc = ebc;
2221 }
2222- int tail = decodeKeyBlockTail(kbData);
2223- int tbData = getInt(tail);
2224- int size = decodeTailBlockSize(tbData);
2225+ final int tail = decodeKeyBlockTail(kbData);
2226+ final int tbData = getInt(tail);
2227+ final int size = decodeTailBlockSize(tbData);
2228 totalDeallocatedSize += ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK) + KEYBLOCK_LENGTH;
2229 }
2230 return (((long) minimumEbc) << 32) | totalDeallocatedSize;
2231@@ -2660,12 +2683,12 @@
2232 * @param to
2233 * offset of the next key block not being deleted
2234 */
2235- void joinDeallocateTails(int from, int to) {
2236+ void joinDeallocateTails(final int from, final int to) {
2237 for (int index = from; index < to; index += KEYBLOCK_LENGTH) {
2238- int kbData = getInt(index);
2239- int tail = decodeKeyBlockTail(kbData);
2240- int tbData = getInt(tail);
2241- int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2242+ final int kbData = getInt(index);
2243+ final int tail = decodeKeyBlockTail(kbData);
2244+ final int tbData = getInt(tail);
2245+ final int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2246 deallocTail(tail, size);
2247 }
2248 }
2249@@ -2739,23 +2762,24 @@
2250 //
2251 for (int p = KEY_BLOCK_START; p < foundAt1; p += KEYBLOCK_LENGTH) {
2252 kbData = getInt(p);
2253- int ebc = decodeKeyBlockEbc(kbData);
2254+ final int ebc = decodeKeyBlockEbc(kbData);
2255 tail = decodeKeyBlockTail(kbData);
2256 tbData = getInt(tail);
2257- int size = decodeTailBlockSize(tbData);
2258+ final int size = decodeTailBlockSize(tbData);
2259 klength = decodeTailBlockKLength(tbData);
2260
2261- int delta = ((size + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK) - ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2262-
2263- int candidateRightSize = virtualSize - leftSize + delta;
2264-
2265- int candidateLeftSize = leftSize + KEYBLOCK_LENGTH + ((klength + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2266+ final int delta = ((size + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2267+ - ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2268+
2269+ final int candidateRightSize = virtualSize - leftSize + delta;
2270+
2271+ final int candidateLeftSize = leftSize + KEYBLOCK_LENGTH + ((klength + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2272 + _tailHeaderSize;
2273
2274- int rightKeyCount = ((buffer.getKeyBlockEnd() - foundAt2) + (foundAt1 - p)) / KEYBLOCK_LENGTH;
2275+ final int rightKeyCount = ((buffer.getKeyBlockEnd() - foundAt2) + (foundAt1 - p)) / KEYBLOCK_LENGTH;
2276
2277- int joinFit = policy.rebalanceFit(this, buffer, p, foundAt1, foundAt2, virtualSize, candidateLeftSize,
2278- candidateRightSize, _bufferSize - KEY_BLOCK_START);
2279+ final int joinFit = policy.rebalanceFit(this, buffer, p, foundAt1, foundAt2, virtualSize,
2280+ candidateLeftSize, candidateRightSize, _bufferSize - KEY_BLOCK_START);
2281
2282 if (joinFit > joinBest && rightKeyCount < _pool.getMaxKeys()) {
2283 joinBest = joinFit;
2284@@ -2770,10 +2794,10 @@
2285 */
2286 for (int p = foundAt2; p < buffer._keyBlockEnd; p += KEYBLOCK_LENGTH) {
2287 kbData = buffer.getInt(p);
2288- int ebc = decodeKeyBlockEbc(kbData);
2289+ final int ebc = decodeKeyBlockEbc(kbData);
2290 tail = decodeKeyBlockTail(kbData);
2291 tbData = buffer.getInt(tail);
2292- int size = decodeTailBlockSize(tbData);
2293+ final int size = decodeTailBlockSize(tbData);
2294 klength = decodeTailBlockKLength(tbData);
2295
2296 /*
2297@@ -2781,23 +2805,24 @@
2298 * rebalance key would have to grow if it became the first key on
2299 * the right page and its ebc became zero.
2300 */
2301- int delta = ((size + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK) - ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2302+ final int delta = ((size + ebc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2303+ - ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2304
2305 /*
2306 * Amount by which the current tail block needs to grow to
2307 * accommodate reduced ebc.
2308 */
2309- int adjustment = (p == foundAt2) ? adjustmentForNewEbc : 0;
2310-
2311- int candidateRightSize = virtualSize - leftSize + delta;
2312-
2313- int candidateLeftSize = leftSize + ((klength + ~TAILBLOCK_MASK) & TAILBLOCK_MASK) + adjustment
2314+ final int adjustment = (p == foundAt2) ? adjustmentForNewEbc : 0;
2315+
2316+ final int candidateRightSize = virtualSize - leftSize + delta;
2317+
2318+ final int candidateLeftSize = leftSize + ((klength + ~TAILBLOCK_MASK) & TAILBLOCK_MASK) + adjustment
2319 + _tailHeaderSize + KEYBLOCK_LENGTH;
2320
2321- int leftKeyCount = ((foundAt1 - KEY_BLOCK_START) + (p - foundAt2)) / KEYBLOCK_LENGTH;
2322+ final int leftKeyCount = ((foundAt1 - KEY_BLOCK_START) + (p - foundAt2)) / KEYBLOCK_LENGTH;
2323
2324- int joinFit = policy.rebalanceFit(this, buffer, p, foundAt1, foundAt2, virtualSize, candidateLeftSize,
2325- candidateRightSize, _bufferSize - KEY_BLOCK_START);
2326+ final int joinFit = policy.rebalanceFit(this, buffer, p, foundAt1, foundAt2, virtualSize,
2327+ candidateLeftSize, candidateRightSize, _bufferSize - KEY_BLOCK_START);
2328
2329 if (joinFit > joinBest && leftKeyCount < _pool.getMaxKeys()) {
2330 joinBest = joinFit;
2331@@ -2821,12 +2846,12 @@
2332 return _fastIndex;
2333 }
2334
2335- private void reduceEbc(int p, int newEbc, byte[] indexKeyBytes) {
2336+ private void reduceEbc(final int p, final int newEbc, final byte[] indexKeyBytes) {
2337 int kbData = getInt(p);
2338- int oldDb = decodeKeyBlockDb(kbData);
2339- int oldEbc = decodeKeyBlockEbc(kbData);
2340+ final int oldDb = decodeKeyBlockDb(kbData);
2341+ final int oldEbc = decodeKeyBlockEbc(kbData);
2342 int tail = decodeKeyBlockTail(kbData);
2343- int tbData = getInt(tail);
2344+ final int tbData = getInt(tail);
2345 int size = decodeTailBlockSize(tbData);
2346 int klength = decodeTailBlockKLength(tbData);
2347
2348@@ -2836,7 +2861,7 @@
2349 throw new IllegalArgumentException("newEbc=" + newEbc + " must be less than oldEbc=" + oldEbc);
2350 }
2351
2352- int delta = ((size + oldEbc - newEbc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2353+ final int delta = ((size + oldEbc - newEbc + ~TAILBLOCK_MASK) & TAILBLOCK_MASK)
2354 - ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2355 int newTail;
2356 boolean wedged = false;
2357@@ -2881,7 +2906,7 @@
2358
2359 size += oldEbc - newEbc;
2360 klength += oldEbc - newEbc;
2361- int newDb = indexKeyBytes[newEbc] & 0xFF;
2362+ final int newDb = indexKeyBytes[newEbc] & 0xFF;
2363
2364 putInt(newTail, encodeTailBlock(size, klength));
2365
2366@@ -2897,7 +2922,7 @@
2367 * @param insertAt
2368 * @param includesRightEdge
2369 */
2370- void moveRecords(Buffer buffer, int p1, int p2, int insertAt, boolean includesRightEdge) {
2371+ void moveRecords(final Buffer buffer, final int p1, final int p2, int insertAt, final boolean includesRightEdge) {
2372 if (p2 - p1 + _keyBlockEnd > _alloc) {
2373 repack();
2374 }
2375@@ -2912,15 +2937,15 @@
2376 setKeyBlockEnd(getKeyBlockEnd() + KEYBLOCK_LENGTH);
2377
2378 for (int p = p1; p < p2 || includesRightEdge && p == p2; p += KEYBLOCK_LENGTH) {
2379- int kbData = buffer.getInt(p);
2380- int ebc = decodeKeyBlockEbc(kbData);
2381- int db = decodeKeyBlockDb(kbData);
2382- int tail = decodeKeyBlockTail(kbData);
2383- int tbData = buffer.getInt(tail);
2384- int size = decodeTailBlockSize(tbData);
2385- int klength = decodeTailBlockKLength(tbData);
2386+ final int kbData = buffer.getInt(p);
2387+ final int ebc = decodeKeyBlockEbc(kbData);
2388+ final int db = decodeKeyBlockDb(kbData);
2389+ final int tail = decodeKeyBlockTail(kbData);
2390+ final int tbData = buffer.getInt(tail);
2391+ final int size = decodeTailBlockSize(tbData);
2392+ final int klength = decodeTailBlockKLength(tbData);
2393 int newSize = size;
2394- boolean edgeCase = includesRightEdge && p == p2;
2395+ final boolean edgeCase = includesRightEdge && p == p2;
2396 if (edgeCase) {
2397 // this is just for the right edge key of the left page
2398 newSize = _tailHeaderSize + klength;
2399@@ -2972,7 +2997,7 @@
2400 */
2401 private int allocTail(int size) {
2402 size = (size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2403- int alloc = _alloc - size;
2404+ final int alloc = _alloc - size;
2405 if (alloc >= _keyBlockEnd) {
2406 _alloc = alloc;
2407 return alloc;
2408@@ -2981,7 +3006,7 @@
2409 }
2410 }
2411
2412- private void deallocTail(int tail, int size) {
2413+ private void deallocTail(final int tail, int size) {
2414 size = (size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2415
2416 Debug.$assert0.t((size > 0 && size <= _bufferSize - _alloc) && (tail >= _alloc && tail < _bufferSize)
2417@@ -2993,9 +3018,9 @@
2418 // any free space above this block.
2419 //
2420 while (tail + size < _bufferSize) {
2421- int kbNext = getInt(tail + size);
2422+ final int kbNext = getInt(tail + size);
2423 if ((kbNext & TAILBLOCK_INUSE_MASK) == 0) {
2424- int sizeNext = decodeTailBlockSize(kbNext);
2425+ final int sizeNext = decodeTailBlockSize(kbNext);
2426 Debug.$assert0.t((sizeNext & ~TAILBLOCK_MASK) == 0 && sizeNext != 0);
2427 _slack -= sizeNext;
2428 putInt(tail + size, 0);
2429@@ -3018,7 +3043,7 @@
2430 private void repack() {
2431 Debug.$assert0.t(isMine());
2432
2433- int[] plan = getRepackPlanBuffer();
2434+ final int[] plan = getRepackPlanBuffer();
2435 //
2436 // Phase 1:
2437 // For each allocated tail block, post the offset of its
2438@@ -3028,9 +3053,9 @@
2439 int free = 0;
2440 int back = 0;
2441 for (int tail = _alloc; tail < _bufferSize;) {
2442- int tbData = getInt(tail);
2443+ final int tbData = getInt(tail);
2444
2445- int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2446+ final int size = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2447 if (size <= 0) {
2448 _persistit.fatal("Buffer has invalid tailblock length " + size + " at " + tail + " in " + this, null);
2449 }
2450@@ -3058,9 +3083,9 @@
2451 if (free > 0)
2452 moveSize += alloc - tail - free;
2453 alloc = tail + free;
2454- int planData = plan[tail / TAILBLOCK_FACTOR];
2455+ final int planData = plan[tail / TAILBLOCK_FACTOR];
2456 plan[tail / TAILBLOCK_FACTOR] = free + tail;
2457- int deltaFree = planData & 0xFFFF;
2458+ final int deltaFree = planData & 0xFFFF;
2459 if (deltaFree > 0 && moveSize > 0 && free > 0) {
2460 System.arraycopy(_bytes, moveFrom, _bytes, moveFrom + free, moveSize);
2461 moveSize = 0;
2462@@ -3080,14 +3105,14 @@
2463 //
2464 if (free > 0) {
2465 for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
2466- int kbData = getInt(p);
2467+ final int kbData = getInt(p);
2468 //
2469 // For certain remove operations, we may have invalid keyblocks
2470 // in range. We can safely ignore them here.
2471 //
2472 if (kbData != 0) {
2473- int tail = decodeKeyBlockTail(kbData);
2474- int newTail = plan[tail / KEYBLOCK_LENGTH];
2475+ final int tail = decodeKeyBlockTail(kbData);
2476+ final int newTail = plan[tail / KEYBLOCK_LENGTH];
2477
2478 if (newTail != tail) {
2479 putInt(p, encodeKeyBlockTail(kbData, newTail));
2480@@ -3105,7 +3130,7 @@
2481 * The size required by the proposed new tailblock.
2482 * @return boolean <i>true</i> if it will fit, else <i>false</i>.
2483 */
2484- private boolean willFit(int needed) {
2485+ private boolean willFit(final int needed) {
2486 return needed <= (_alloc - _keyBlockEnd + _slack);
2487 }
2488
2489@@ -3116,8 +3141,8 @@
2490 * @param foundAt
2491 * The keyblock index
2492 */
2493- boolean isAfterRightEdge(int foundAt) {
2494- int p = foundAt & P_MASK;
2495+ boolean isAfterRightEdge(final int foundAt) {
2496+ final int p = foundAt & P_MASK;
2497 return (p >= _keyBlockEnd) || ((p == _keyBlockEnd - KEYBLOCK_LENGTH && (foundAt & EXACT_MASK) != 0));
2498 }
2499
2500@@ -3127,7 +3152,7 @@
2501 *
2502 * @param foundAt
2503 */
2504- boolean isBeforeLeftEdge(int foundAt) {
2505+ boolean isBeforeLeftEdge(final int foundAt) {
2506 return (((foundAt & EXACT_MASK) == 0 && (foundAt & P_MASK) <= KEY_BLOCK_START) || (foundAt & P_MASK) < KEY_BLOCK_START);
2507 }
2508
2509@@ -3136,11 +3161,11 @@
2510 return _bytes;
2511 }
2512
2513- int getByte(int index) {
2514+ int getByte(final int index) {
2515 return (_bytes[index] & 0xFF);
2516 }
2517
2518- int getChar(int index) {
2519+ int getChar(final int index) {
2520 if (Persistit.BIG_ENDIAN) {
2521 return (_bytes[index + 1] & 0xFF) | (_bytes[index] & 0xFF) << 8;
2522 } else {
2523@@ -3148,7 +3173,7 @@
2524 }
2525 }
2526
2527- int getInt(int index) {
2528+ int getInt(final int index) {
2529 if (Persistit.BIG_ENDIAN) {
2530 return (_bytes[index + 3] & 0xFF) | (_bytes[index + 2] & 0xFF) << 8 | (_bytes[index + 1] & 0xFF) << 16
2531 | (_bytes[index] & 0xFF) << 24;
2532@@ -3158,21 +3183,21 @@
2533 }
2534 }
2535
2536- long getLong(int index) {
2537+ long getLong(final int index) {
2538 if (Persistit.BIG_ENDIAN) {
2539- return (long) (_bytes[index + 7] & 0xFF) | (long) (_bytes[index + 6] & 0xFF) << 8
2540+ return _bytes[index + 7] & 0xFF | (long) (_bytes[index + 6] & 0xFF) << 8
2541 | (long) (_bytes[index + 5] & 0xFF) << 16 | (long) (_bytes[index + 4] & 0xFF) << 24
2542 | (long) (_bytes[index + 3] & 0xFF) << 32 | (long) (_bytes[index + 2] & 0xFF) << 40
2543 | (long) (_bytes[index + 1] & 0xFF) << 48 | (long) (_bytes[index] & 0xFF) << 56;
2544 } else {
2545- return (long) (_bytes[index] & 0xFF) | (long) (_bytes[index + 1] & 0xFF) << 8
2546+ return _bytes[index] & 0xFF | (long) (_bytes[index + 1] & 0xFF) << 8
2547 | (long) (_bytes[index + 2] & 0xFF) << 16 | (long) (_bytes[index + 3] & 0xFF) << 24
2548 | (long) (_bytes[index + 4] & 0xFF) << 32 | (long) (_bytes[index + 5] & 0xFF) << 40
2549 | (long) (_bytes[index + 6] & 0xFF) << 48 | (long) (_bytes[index + 7] & 0xFF) << 56;
2550 }
2551 }
2552
2553- int getDb(int index) {
2554+ int getDb(final int index) {
2555 if (Persistit.BIG_ENDIAN) {
2556 return _bytes[index + 3] & 0xFF;
2557 } else {
2558@@ -3180,12 +3205,12 @@
2559 }
2560 }
2561
2562- void putByte(int index, int value) {
2563+ void putByte(final int index, final int value) {
2564 Debug.$assert0.t(index >= 0 && index + 1 <= _bytes.length);
2565 _bytes[index] = (byte) (value);
2566 }
2567
2568- void putChar(int index, int value) {
2569+ void putChar(final int index, final int value) {
2570 Debug.$assert0.t(index >= 0 && index + 2 <= _bytes.length);
2571 if (Persistit.BIG_ENDIAN) {
2572 _bytes[index + 1] = (byte) (value);
2573@@ -3196,7 +3221,7 @@
2574 }
2575 }
2576
2577- void putInt(int index, int value) {
2578+ void putInt(final int index, final int value) {
2579 Debug.$assert0.t(index >= 0 && index + 4 <= _bytes.length);
2580 if (Persistit.BIG_ENDIAN) {
2581 _bytes[index + 3] = (byte) (value);
2582@@ -3211,7 +3236,7 @@
2583 }
2584 }
2585
2586- void putLong(int index, long value) {
2587+ void putLong(final int index, final long value) {
2588 Debug.$assert0.t(index >= 0 && index + 8 <= _bytes.length);
2589
2590 if (Persistit.BIG_ENDIAN) {
2591@@ -3235,7 +3260,7 @@
2592 }
2593 }
2594
2595- static void writeLongRecordDescriptor(byte[] bytes, int size, long pageAddr) {
2596+ static void writeLongRecordDescriptor(final byte[] bytes, final int size, final long pageAddr) {
2597 if (bytes.length != LONGREC_SIZE) {
2598 throw new IllegalArgumentException("Bad LONG_RECORD descriptor size: " + size);
2599 }
2600@@ -3246,7 +3271,7 @@
2601 Util.putLong(bytes, LONGREC_PAGE_OFFSET, pageAddr);
2602 }
2603
2604- static int decodeLongRecordDescriptorSize(byte[] bytes, int offset) {
2605+ static int decodeLongRecordDescriptorSize(final byte[] bytes, final int offset) {
2606 int type;
2607 if ((type = (bytes[offset] & 0xFF)) != LONGREC_TYPE) {
2608 throw new IllegalArgumentException("Bad LONG_RECORD descriptor type: " + type);
2609@@ -3254,7 +3279,7 @@
2610 return (int) Util.getLong(bytes, offset + LONGREC_SIZE_OFFSET);
2611 }
2612
2613- static long decodeLongRecordDescriptorPointer(byte[] bytes, int offset) {
2614+ static long decodeLongRecordDescriptorPointer(final byte[] bytes, final int offset) {
2615 int type;
2616 if ((type = (bytes[offset] & 0xFF)) != LONGREC_TYPE) {
2617 throw new IllegalArgumentException("Bad LONG_RECORD descriptor type: " + type);
2618@@ -3263,7 +3288,7 @@
2619 }
2620
2621 static int bufferSizeWithOverhead(final int bufferSize) {
2622- int fastIndexSize = ((bufferSize - HEADER_SIZE) / MAX_KEY_RATIO) * FastIndex.BYTES_PER_ENTRY;
2623+ final int fastIndexSize = ((bufferSize - HEADER_SIZE) / MAX_KEY_RATIO) * FastIndex.BYTES_PER_ENTRY;
2624 return bufferSize + fastIndexSize + ESTIMATED_FIXED_BUFFER_OVERHEAD;
2625 }
2626
2627@@ -3314,16 +3339,16 @@
2628 return (size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2629 }
2630
2631- static int encodeKeyBlock(int ebc, int db, int tail) {
2632+ static int encodeKeyBlock(final int ebc, final int db, final int tail) {
2633 return ((ebc << EBC_SHIFT) & EBC_MASK) | ((db /* << DB_SHIFT */) & DB_MASK)
2634 | ((tail << TAIL_SHIFT) & TAIL_MASK);
2635 }
2636
2637- static int encodeKeyBlockTail(int kbData, int tail) {
2638+ static int encodeKeyBlockTail(final int kbData, final int tail) {
2639 return (kbData & ~TAIL_MASK) | ((tail << TAIL_SHIFT) & TAIL_MASK);
2640 }
2641
2642- static int encodeTailBlock(int size, int klength) {
2643+ static int encodeTailBlock(final int size, final int klength) {
2644 return ((klength << TAILBLOCK_KLENGTH_SHIFT) & TAILBLOCK_KLENGTH_MASK) | ((size /*
2645 * <<
2646 * TAILBLOCK_SIZE_SHIFT
2647@@ -3331,35 +3356,35 @@
2648 | TAILBLOCK_INUSE_MASK;
2649 }
2650
2651- static int encodeFreeBlock(int size) {
2652+ static int encodeFreeBlock(final int size) {
2653 return ((size /* << TAILBLOCK_SIZE_SHIFT */) & TAILBLOCK_SIZE_MASK);
2654 }
2655
2656- static int decodeKeyBlockEbc(int kbData) {
2657+ static int decodeKeyBlockEbc(final int kbData) {
2658 return (kbData & EBC_MASK) >>> EBC_SHIFT;
2659 }
2660
2661- static int decodeKeyBlockDb(int kbData) {
2662+ static int decodeKeyBlockDb(final int kbData) {
2663 return (kbData & DB_MASK) /* >>> DB_SHIFT */;
2664 }
2665
2666- static int decodeKeyBlockTail(int kbData) {
2667+ static int decodeKeyBlockTail(final int kbData) {
2668 return (kbData & TAIL_MASK) >>> TAIL_SHIFT;
2669 }
2670
2671- static int decodeTailBlockSize(int tbData) {
2672+ static int decodeTailBlockSize(final int tbData) {
2673 return (tbData & TAILBLOCK_SIZE_MASK) /* >>> TAILBLOCK_SIZE_SHIFT */;
2674 }
2675
2676- static int decodeTailBlockKLength(int tbData) {
2677+ static int decodeTailBlockKLength(final int tbData) {
2678 return (tbData & TAILBLOCK_KLENGTH_MASK) >>> TAILBLOCK_KLENGTH_SHIFT;
2679 }
2680
2681- static boolean decodeTailBlockInUse(int tbData) {
2682+ static boolean decodeTailBlockInUse(final int tbData) {
2683 return (tbData & TAILBLOCK_INUSE_MASK) != 0;
2684 }
2685
2686- static int decodeDepth(int foundAt) {
2687+ static int decodeDepth(final int foundAt) {
2688 return (foundAt & DEPTH_MASK) >>> DEPTH_SHIFT;
2689 }
2690
2691@@ -3367,7 +3392,7 @@
2692 return _persistit.getThreadLocalIntArray(MAX_BUFFER_SIZE / TAILBLOCK_FACTOR);
2693 }
2694
2695- PersistitException verify(Key key, VerifyVisitor visitor) {
2696+ PersistitException verify(Key key, final VerifyVisitor visitor) {
2697 try {
2698 if (_page == 0) {
2699 return new InvalidPageStructureException("head page is neither a data page nor an index page");
2700@@ -3380,8 +3405,8 @@
2701 key = new Key(_persistit);
2702 }
2703
2704- byte[] kb = key.getEncodedBytes();
2705- int[] plan = getRepackPlanBuffer();
2706+ final byte[] kb = key.getEncodedBytes();
2707+ final int[] plan = getRepackPlanBuffer();
2708 for (int index = 0; index < plan.length; index++) {
2709 plan[index] = 0;
2710 }
2711@@ -3392,10 +3417,10 @@
2712 }
2713
2714 for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
2715- int kbData = getInt(p);
2716- int db = decodeKeyBlockDb(kbData);
2717- int ebc = decodeKeyBlockEbc(kbData);
2718- int tail = decodeKeyBlockTail(kbData);
2719+ final int kbData = getInt(p);
2720+ final int db = decodeKeyBlockDb(kbData);
2721+ final int ebc = decodeKeyBlockEbc(kbData);
2722+ final int tail = decodeKeyBlockTail(kbData);
2723
2724 if (p == KEY_BLOCK_START && ebc != 0) {
2725 return new InvalidPageStructureException("invalid initial ebc " + ebc + " for keyblock at " + p
2726@@ -3407,8 +3432,8 @@
2727 return new InvalidPageStructureException("invalid tail block offset " + tail + " for keyblock at "
2728 + p + " --[" + summarize() + "]");
2729 }
2730- int tbData = getInt(tail);
2731- int klength = decodeTailBlockKLength(tbData);
2732+ final int tbData = getInt(tail);
2733+ final int klength = decodeTailBlockKLength(tbData);
2734 if ((tbData & TAILBLOCK_INUSE_MASK) == 0) {
2735 return new InvalidPageStructureException("not in-use tail block offset " + tail
2736 + " for keyblock at " + p + " --[" + summarize() + "]");
2737@@ -3426,14 +3451,14 @@
2738 compare = (kb[index] & 0xFF) - (_bytes[tail + _tailHeaderSize + index - 1] & 0xFF);
2739 }
2740 if (compare != 0) {
2741- String s = compare < 0 ? "too big" : "too small";
2742+ final String s = compare < 0 ? "too big" : "too small";
2743 return new InvalidPageStructureException("initial key " + s + " at offset " + index
2744 + " for keyblock at " + p + " --[" + summarize() + "]");
2745 }
2746 }
2747 // Verify that successor keys follow in sequence.
2748 if (p > KEY_BLOCK_START && ebc < key.getEncodedSize()) {
2749- int dbPrev = kb[ebc] & 0xFF;
2750+ final int dbPrev = kb[ebc] & 0xFF;
2751 if (db < dbPrev) {
2752 return new InvalidPageStructureException("db not greater: db=" + db + " dbPrev=" + dbPrev
2753 + " for keyblock at " + p + " --[" + summarize() + "]");
2754@@ -3444,7 +3469,7 @@
2755 // redundant
2756 //
2757 if (isIndexPage()) {
2758- int pointer = getInt(tail + 4);
2759+ final int pointer = getInt(tail + 4);
2760 if (visitor != null) {
2761 visitor.visitIndexRecord(key, p, tail, klength, pointer);
2762 }
2763@@ -3455,13 +3480,18 @@
2764 }
2765 }
2766 } else if (isDataPage()) {
2767- int size = decodeTailBlockSize(tbData);
2768- int offset = tail + _tailHeaderSize + klength;
2769- int length = size - klength - _tailHeaderSize;
2770+ final int size = decodeTailBlockSize(tbData);
2771+ final int offset = tail + _tailHeaderSize + klength;
2772+ final int length = size - klength - _tailHeaderSize;
2773 if (visitor != null) {
2774 visitor.visitDataRecord(key, p, tail, klength, offset, length, getBytes());
2775 }
2776- Debug.$assert1.t(MVV.verify(_bytes, offset, length));
2777+
2778+ if (!MVV.verify(_bytes, offset, length)) {
2779+ throw new InvalidPageStructureException("invalid MVV record at offset/length=" + offset + "/"
2780+ + length);
2781+ }
2782+
2783 }
2784
2785 if (_pool != null && getKeyCount() > _pool.getMaxKeys()) {
2786@@ -3477,13 +3507,13 @@
2787
2788 // Now check the free blocks
2789
2790- int formerBlock = _alloc;
2791+ final int formerBlock = _alloc;
2792 for (int tail = _alloc; tail < _bufferSize;) {
2793 if ((tail & ~TAILBLOCK_MASK) != 0 || tail < 0 || tail > _bufferSize) {
2794 return new InvalidPageStructureException("Tail block at " + formerBlock + " is invalid");
2795 }
2796- int tbData = getInt(tail);
2797- int size = decodeTailBlockSize(tbData);
2798+ final int tbData = getInt(tail);
2799+ final int size = decodeTailBlockSize(tbData);
2800 if (size <= ~TAILBLOCK_MASK || size >= _bufferSize - _keyBlockEnd) {
2801 return new InvalidPageStructureException("Tailblock at " + tail + " has invalid size=" + size);
2802 }
2803@@ -3492,7 +3522,7 @@
2804 return new InvalidPageStructureException("Tailblock at " + tail + " is in use, but no key "
2805 + " block points to it.");
2806 }
2807- int klength = decodeTailBlockKLength(tbData);
2808+ final int klength = decodeTailBlockKLength(tbData);
2809 {
2810 if (klength + _tailHeaderSize > size) {
2811 return new InvalidPageStructureException("Tailblock at " + tail + " has klength=" + klength
2812@@ -3508,7 +3538,7 @@
2813 tail += ((size + ~TAILBLOCK_MASK) & TAILBLOCK_MASK);
2814 }
2815 return null;
2816- } catch (PersistitException pe) {
2817+ } catch (final PersistitException pe) {
2818 return pe;
2819 }
2820
2821@@ -3528,7 +3558,7 @@
2822 * @return
2823 * @throws PersistitException
2824 */
2825- boolean pruneMvvValues(final Tree tree, boolean pruneLongMVVs) throws PersistitException {
2826+ boolean pruneMvvValues(final Tree tree, final boolean pruneLongMVVs) throws PersistitException {
2827
2828 boolean changed = false;
2829 try {
2830@@ -3541,70 +3571,22 @@
2831 final long timestamp = _persistit.getTimestampAllocator().updateTimestamp();
2832 _mvvCount = 0;
2833 writePageOnCheckpoint(timestamp);
2834- List<PrunedVersion> prunedVersions = new ArrayList<PrunedVersion>();
2835- for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
2836- final int kbData = getInt(p);
2837- final int tail = decodeKeyBlockTail(kbData);
2838- final int tbData = getInt(tail);
2839- final int klength = decodeTailBlockKLength(tbData);
2840- final int oldTailSize = decodeTailBlockSize(tbData);
2841- final int offset = tail + _tailHeaderSize + klength;
2842- final int oldSize = oldTailSize - klength - _tailHeaderSize;
2843-
2844- if (oldSize > 0) {
2845- int valueByte = _bytes[offset] & 0xFF;
2846- if (isLongMVV(_bytes, offset, oldSize)) {
2847- /*
2848- * Can't prune in this pass because of long record
2849- * timestamp management. Simply remember that there
2850- * are long records to prune, then prune them in a
2851- * copy of the buffer.
2852- */
2853- hasLongMvvRecords = true;
2854- }
2855- if (valueByte == MVV.TYPE_MVV) {
2856- final int newSize = MVV.prune(_bytes, offset, oldSize, _persistit.getTransactionIndex(),
2857- true, prunedVersions);
2858- if (newSize != oldSize) {
2859- changed = true;
2860- int newTailSize = klength + newSize + _tailHeaderSize;
2861- int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2862- int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2863- if (newNext < oldNext) {
2864- // Free the remainder of the old tail block
2865- deallocTail(newNext, oldNext - newNext);
2866- } else {
2867- Debug.$assert0.t(newNext == oldNext);
2868- }
2869- // Rewrite the tail block header
2870- putInt(tail, encodeTailBlock(newTailSize, klength));
2871- if (Debug.ENABLED) {
2872- MVV.verify(_bytes, offset, newSize);
2873- }
2874- }
2875- valueByte = newSize > 0 ? _bytes[offset] & 0xFF : -1;
2876- incCountIfMvv(_bytes, offset, newSize);
2877- }
2878-
2879- if (pruneAntiValue(valueByte, p, tree)) {
2880- changed = true;
2881- p -= KEYBLOCK_LENGTH;
2882- }
2883- }
2884- }
2885+ final int flags = pruneMvvValuesHelper(tree);
2886+ changed = (flags & PRUNE_MVV_HELPER_CHANGED) != 0;
2887+ hasLongMvvRecords = (flags & PRUNE_MVV_HELPER_HAS_LONG) != 0;
2888+
2889 if (changed) {
2890 setDirtyAtTimestamp(timestamp);
2891 }
2892
2893- deallocatePrunedVersions(_persistit, _vol, prunedVersions);
2894- prunedVersions.clear();
2895+ final List<PrunedVersion> prunedVersions = new ArrayList<PrunedVersion>();
2896
2897 if (pruneLongMVVs && hasLongMvvRecords) {
2898- List<PersistitException> deferredExceptions = new ArrayList<PersistitException>();
2899- List<Long> oldChainsToDeallocate = new ArrayList<Long>();
2900+ final List<PersistitException> deferredExceptions = new ArrayList<PersistitException>();
2901+ final List<Long> oldChainsToDeallocate = new ArrayList<Long>();
2902
2903- Buffer copy = new Buffer(this);
2904- boolean copyChanged = copy.pruneLongMvvValues(tree, prunedVersions, deferredExceptions,
2905+ final Buffer copy = new Buffer(this);
2906+ final boolean copyChanged = copy.pruneLongMvvValues(tree, prunedVersions, deferredExceptions,
2907 oldChainsToDeallocate);
2908 if (copyChanged) {
2909 changed = true;
2910@@ -3640,6 +3622,63 @@
2911 return changed;
2912 }
2913
2914+ private int pruneMvvValuesHelper(final Tree tree) throws PersistitException {
2915+ boolean changed = false;
2916+ boolean hasLongMvvRecords = false;
2917+ final List<PrunedVersion> prunedVersions = new ArrayList<PrunedVersion>();
2918+
2919+ for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
2920+ final int kbData = getInt(p);
2921+ final int tail = decodeKeyBlockTail(kbData);
2922+ final int tbData = getInt(tail);
2923+ final int klength = decodeTailBlockKLength(tbData);
2924+ final int oldTailSize = decodeTailBlockSize(tbData);
2925+ final int offset = tail + _tailHeaderSize + klength;
2926+ final int oldSize = oldTailSize - klength - _tailHeaderSize;
2927+
2928+ if (oldSize > 0) {
2929+ int valueByte = _bytes[offset] & 0xFF;
2930+ if (isLongMVV(_bytes, offset, oldSize)) {
2931+ /*
2932+ * Can't prune in this pass because of long record timestamp
2933+ * management. Simply remember that there are long records
2934+ * to prune, then prune them in a copy of the buffer.
2935+ */
2936+ hasLongMvvRecords = true;
2937+ }
2938+ if (valueByte == MVV.TYPE_MVV) {
2939+ final int newSize = MVV.prune(_bytes, offset, oldSize, _persistit.getTransactionIndex(), true,
2940+ prunedVersions);
2941+ if (newSize != oldSize) {
2942+ changed = true;
2943+ final int newTailSize = klength + newSize + _tailHeaderSize;
2944+ final int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2945+ final int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2946+ if (newNext < oldNext) {
2947+ // Free the remainder of the old tail block
2948+ deallocTail(newNext, oldNext - newNext);
2949+ } else {
2950+ Debug.$assert0.t(newNext == oldNext);
2951+ }
2952+ // Rewrite the tail block header
2953+ putInt(tail, encodeTailBlock(newTailSize, klength));
2954+ Debug.$assert0.t(MVV.verify(_bytes, offset, newSize));
2955+ }
2956+ valueByte = newSize > 0 ? _bytes[offset] & 0xFF : -1;
2957+ incCountIfMvv(_bytes, offset, newSize);
2958+ }
2959+
2960+ if (pruneAntiValue(valueByte, p, tree)) {
2961+ changed = true;
2962+ p -= KEYBLOCK_LENGTH;
2963+ }
2964+ }
2965+ }
2966+ deallocatePrunedVersions(_persistit, _vol, prunedVersions);
2967+ prunedVersions.clear();
2968+ return (changed ? PRUNE_MVV_HELPER_CHANGED : 0) | (hasLongMvvRecords ? PRUNE_MVV_HELPER_HAS_LONG : 0);
2969+ }
2970+
2971 /**
2972 * This method attempts to prune each LongRecord MVVs found in the page.
2973 * This method is performed on a _copy_ of the original Buffer being pruned;
2974@@ -3666,17 +3705,17 @@
2975 boolean pruned = false;
2976 try {
2977 pruned = pruneLongMvv(_bytes, offset, oldSize, value, prunedVersions, toDeallocate);
2978- } catch (PersistitException pe) {
2979+ } catch (final PersistitException pe) {
2980 deferredExceptions.add(pe);
2981 }
2982 if (pruned) {
2983 changed = true;
2984- int newSize = value.getEncodedSize();
2985+ final int newSize = value.getEncodedSize();
2986 assert newSize <= oldSize : "Pruned long value overflow";
2987 System.arraycopy(value.getEncodedBytes(), 0, _bytes, offset, newSize);
2988- int newTailSize = klength + newSize + _tailHeaderSize;
2989- int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2990- int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2991+ final int newTailSize = klength + newSize + _tailHeaderSize;
2992+ final int oldNext = (tail + oldTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2993+ final int newNext = (tail + newTailSize + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
2994 if (newNext < oldNext) {
2995 // Free the remainder of the old tail block
2996 deallocTail(newNext, oldNext - newNext);
2997@@ -3709,8 +3748,7 @@
2998 if (!_enqueuedForAntiValuePruning) {
2999 final int treeHandle = tree.getHandle();
3000 assert treeHandle != 0 : "MVV found in a temporary tree " + tree;
3001- if (_persistit.getCleanupManager().offer(
3002- new CleanupAntiValue(treeHandle, getPageAddress()))) {
3003+ if (_persistit.getCleanupManager().offer(new CleanupAntiValue(treeHandle, getPageAddress()))) {
3004 _enqueuedForAntiValuePruning = true;
3005 }
3006 }
3007@@ -3731,19 +3769,19 @@
3008 private boolean pruneLongMvv(final byte[] bytes, final int offset, final int oldSize, final Value value,
3009 final List<PrunedVersion> prunedVersions, final List<Long> toDeallocate) throws PersistitException {
3010 assert isLongMVV(bytes, offset, oldSize) : "Not a long MVV";
3011- long oldLongRecordChain = decodeLongRecordDescriptorPointer(bytes, offset);
3012+ final long oldLongRecordChain = decodeLongRecordDescriptorPointer(bytes, offset);
3013 value.changeLongRecordMode(false);
3014 value.ensureFit(oldSize);
3015 System.arraycopy(bytes, offset, value.getEncodedBytes(), 0, oldSize);
3016 value.setEncodedSize(oldSize);
3017 final LongRecordHelper helper = new LongRecordHelper(_persistit, _vol);
3018 helper.fetchLongRecord(value, Integer.MAX_VALUE);
3019- byte[] rawBytes = value.getEncodedBytes();
3020- int oldLongSize = value.getEncodedSize();
3021+ final byte[] rawBytes = value.getEncodedBytes();
3022+ final int oldLongSize = value.getEncodedSize();
3023 // TODO - perhaps remove. Done as a precaution for now.
3024- MVV.verify(rawBytes, 0, oldLongSize);
3025- List<PrunedVersion> provisionalPrunedVersions = new ArrayList<PrunedVersion>();
3026- int newLongSize = MVV.prune(rawBytes, 0, oldLongSize, _persistit.getTransactionIndex(), true,
3027+ Debug.$assert0.t(MVV.verify(rawBytes, 0, oldLongSize));
3028+ final List<PrunedVersion> provisionalPrunedVersions = new ArrayList<PrunedVersion>();
3029+ final int newLongSize = MVV.prune(rawBytes, 0, oldLongSize, _persistit.getTransactionIndex(), true,
3030 provisionalPrunedVersions);
3031 if (newLongSize == oldLongSize) {
3032 // No pruning done.
3033@@ -3771,6 +3809,7 @@
3034 getTimestamp(), getGeneration());
3035 }
3036
3037+ @Override
3038 public String toString() {
3039 if (_toStringDebug) {
3040 return toStringDetail();
3041@@ -3818,7 +3857,7 @@
3042 }
3043 boolean elision = false;
3044 for (int index = 0; index < records.length; index++) {
3045- RecordInfo r = records[index];
3046+ final RecordInfo r = records[index];
3047 r.getKeyState().copyTo(key);
3048 String mark = " ";
3049 boolean selected = all | index < contextLines || index >= records.length - contextLines;
3050@@ -3843,16 +3882,16 @@
3051 r.getValueState().getEncodedBytes().length, Util.abridge(value.toString(),
3052 maxValueDisplayLength)));
3053 } else {
3054- sb.append(String.format("\n%s %5d: db=%3d ebc=%3d tb=%,5d [%,d]%s->%,d", mark, r
3055- .getKbOffset(), r.getDb(), r.getEbc(), r.getTbOffset(), r.getKLength(), Util
3056- .abridge(key.toString(), maxKeyDisplayLength), r.getPointerValue()));
3057+ sb.append(String.format("\n%s %5d: db=%3d ebc=%3d tb=%,5d [%,d]%s->%,d", mark,
3058+ r.getKbOffset(), r.getDb(), r.getEbc(), r.getTbOffset(), r.getKLength(),
3059+ Util.abridge(key.toString(), maxKeyDisplayLength), r.getPointerValue()));
3060 }
3061 } else {
3062 elision = true;
3063 }
3064
3065 }
3066- } catch (Exception e) {
3067+ } catch (final Exception e) {
3068 sb.append(" - " + e);
3069 }
3070 } else if (isHeadPage()) {
3071@@ -3876,7 +3915,7 @@
3072 }
3073
3074 String foundAtString(int p) {
3075- StringBuilder sb = new StringBuilder("<");
3076+ final StringBuilder sb = new StringBuilder("<");
3077 sb.append(p & P_MASK);
3078 if ((p & EXACT_MASK) != 0)
3079 sb.append(":exact");
3080@@ -3892,7 +3931,7 @@
3081 else if (p + KEYBLOCK_LENGTH == _keyBlockEnd)
3082 sb.append(":end");
3083 else {
3084- int kbData = getInt(p);
3085+ final int kbData = getInt(p);
3086 sb.append(":ebc=" + decodeKeyBlockEbc(kbData));
3087 sb.append(":db=" + decodeKeyBlockDb(kbData));
3088 sb.append(":tail=" + decodeKeyBlockTail(kbData));
3089@@ -3908,23 +3947,23 @@
3090 ManagementImpl.RecordInfo[] result = null;
3091
3092 if (isIndexPage() || isDataPage()) {
3093- Key key = new Key(_persistit);
3094- Value value = new Value(_persistit);
3095+ final Key key = new Key(_persistit);
3096+ final Value value = new Value(_persistit);
3097
3098- int count = (_keyBlockEnd - KEY_BLOCK_START) / KEYBLOCK_LENGTH;
3099+ final int count = (_keyBlockEnd - KEY_BLOCK_START) / KEYBLOCK_LENGTH;
3100 result = new ManagementImpl.RecordInfo[count];
3101 int n = 0;
3102 for (int p = KEY_BLOCK_START; p < _keyBlockEnd; p += KEYBLOCK_LENGTH) {
3103- int kbData = getInt(p);
3104- int db = decodeKeyBlockDb(kbData);
3105- int ebc = decodeKeyBlockEbc(kbData);
3106- int tail = decodeKeyBlockTail(kbData);
3107- int tbData = tail != 0 ? getInt(tail) : 0;
3108- int size = decodeTailBlockSize(tbData);
3109- int klength = decodeTailBlockKLength(tbData);
3110- boolean inUse = decodeTailBlockInUse(tbData);
3111+ final int kbData = getInt(p);
3112+ final int db = decodeKeyBlockDb(kbData);
3113+ final int ebc = decodeKeyBlockEbc(kbData);
3114+ final int tail = decodeKeyBlockTail(kbData);
3115+ final int tbData = tail != 0 ? getInt(tail) : 0;
3116+ final int size = decodeTailBlockSize(tbData);
3117+ final int klength = decodeTailBlockKLength(tbData);
3118+ final boolean inUse = decodeTailBlockInUse(tbData);
3119
3120- ManagementImpl.RecordInfo rec = new ManagementImpl.RecordInfo();
3121+ final ManagementImpl.RecordInfo rec = new ManagementImpl.RecordInfo();
3122 rec._kbOffset = p;
3123 rec._tbOffset = tail;
3124 rec._ebc = ebc;
3125@@ -3933,7 +3972,7 @@
3126 rec._size = size;
3127 rec._inUse = inUse;
3128
3129- byte[] kbytes = key.getEncodedBytes();
3130+ final byte[] kbytes = key.getEncodedBytes();
3131 kbytes[ebc] = (byte) db;
3132 System.arraycopy(_bytes, tail + _tailHeaderSize, kbytes, ebc + 1, klength);
3133 key.setEncodedSize(ebc + 1 + klength);
3134@@ -3956,11 +3995,11 @@
3135 result[n++] = rec;
3136 }
3137 } else if (isGarbagePage()) {
3138- int count = (_bufferSize - _alloc) / GARBAGE_BLOCK_SIZE;
3139+ final int count = (_bufferSize - _alloc) / GARBAGE_BLOCK_SIZE;
3140 result = new ManagementImpl.RecordInfo[count];
3141 int n = 0;
3142 for (int p = _alloc; p < _bufferSize; p += GARBAGE_BLOCK_SIZE) {
3143- ManagementImpl.RecordInfo rec = new ManagementImpl.RecordInfo();
3144+ final ManagementImpl.RecordInfo rec = new ManagementImpl.RecordInfo();
3145 rec._tbOffset = p;
3146 rec._garbageStatus = getInt(p + GARBAGE_BLOCK_STATUS);
3147 rec._garbageLeftPage = getLong(p + GARBAGE_BLOCK_LEFT_PAGE);
3148@@ -3973,12 +4012,12 @@
3149
3150 void assertVerify() {
3151 if (Debug.VERIFY_PAGES) {
3152- Exception verifyException = verify(null, null);
3153+ final Exception verifyException = verify(null, null);
3154 Debug.$assert1.t(verifyException == null);
3155 }
3156 }
3157
3158- boolean addGarbageChain(long left, long right, long expectedCount) {
3159+ boolean addGarbageChain(final long left, final long right, final long expectedCount) {
3160 Debug.$assert0.t(left > 0 && left <= MAX_VALID_PAGE_ADDR && left != _page && right != _page && isGarbagePage());
3161
3162 if (_alloc - GARBAGE_BLOCK_SIZE < _keyBlockEnd) {
3163@@ -4006,7 +4045,7 @@
3164 Debug.$assert0.t(isGarbagePage());
3165 if (_alloc + GARBAGE_BLOCK_SIZE > _bufferSize)
3166 return -1;
3167- long page = getLong(_alloc + GARBAGE_BLOCK_LEFT_PAGE);
3168+ final long page = getLong(_alloc + GARBAGE_BLOCK_LEFT_PAGE);
3169 Debug.$assert0.t(page > 0 && page <= MAX_VALID_PAGE_ADDR && page != _page);
3170 return page;
3171 }
3172@@ -4019,13 +4058,13 @@
3173 return getLong(_alloc + GARBAGE_BLOCK_RIGHT_PAGE);
3174 }
3175
3176- long getGarbageChainLeftPage(int p) {
3177- long page = getLong(p + GARBAGE_BLOCK_LEFT_PAGE);
3178+ long getGarbageChainLeftPage(final int p) {
3179+ final long page = getLong(p + GARBAGE_BLOCK_LEFT_PAGE);
3180 Debug.$assert1.t(page > 0 && page <= MAX_VALID_PAGE_ADDR && page != _page);
3181 return page;
3182 }
3183
3184- long getGarbageChainRightPage(int p) {
3185+ long getGarbageChainRightPage(final int p) {
3186 return getLong(p + GARBAGE_BLOCK_RIGHT_PAGE);
3187 }
3188
3189@@ -4036,18 +4075,18 @@
3190 bumpGeneration();
3191 }
3192
3193- void setGarbageLeftPage(long left) {
3194+ void setGarbageLeftPage(final long left) {
3195 Debug.$assert1.t(isMine() && isGarbagePage() && left > 0 && left <= MAX_VALID_PAGE_ADDR && left != _page
3196 && _alloc + GARBAGE_BLOCK_SIZE <= _bufferSize && _alloc >= _keyBlockEnd);
3197 putLong(_alloc + GARBAGE_BLOCK_LEFT_PAGE, left);
3198 bumpGeneration();
3199 }
3200
3201- void populateInfo(ManagementImpl.BufferInfo info) {
3202+ void populateInfo(final ManagementImpl.BufferInfo info) {
3203 info.poolIndex = _poolIndex;
3204 info.pageAddress = _page;
3205 info.rightSiblingAddress = _rightSibling;
3206- Volume vol = _vol;
3207+ final Volume vol = _vol;
3208 if (vol != null) {
3209 info.volumeName = vol.getPath();
3210 } else {
3211@@ -4064,7 +4103,7 @@
3212 info.timestamp = _timestamp;
3213 info.status = getStatus();
3214 info.statusName = getStatusCode();
3215- Thread writerThread = getWriterThread();
3216+ final Thread writerThread = getWriterThread();
3217 if (writerThread != null) {
3218 info.writerThreadName = writerThread.getName();
3219 } else {
3220@@ -4075,10 +4114,10 @@
3221
3222 void enqueuePruningAction(final int treeHandle) {
3223 if (_mvvCount > 0) {
3224- long delay = _persistit.getCleanupManager().getMinimumPruningDelay();
3225+ final long delay = _persistit.getCleanupManager().getMinimumPruningDelay();
3226 if (delay > 0) {
3227- long last = _lastPrunedTime;
3228- long now = System.currentTimeMillis();
3229+ final long last = _lastPrunedTime;
3230+ final long now = System.currentTimeMillis();
3231 if (now - last > delay) {
3232 _lastPrunedTime = now;
3233 _persistit.getCleanupManager().offer(
3234@@ -4105,9 +4144,9 @@
3235 * writes an IV record.
3236 * @throws Exception
3237 */
3238- void dump(final ByteBuffer bb, final boolean secure, boolean verbose, final Set<Volume> identifiedVolumes)
3239+ void dump(final ByteBuffer bb, final boolean secure, final boolean verbose, final Set<Volume> identifiedVolumes)
3240 throws Exception {
3241- byte[] bytes = new byte[_bufferSize];
3242+ final byte[] bytes = new byte[_bufferSize];
3243 int type;
3244 int keyBlockEnd;
3245 int alloc;
3246@@ -4120,7 +4159,7 @@
3247 /*
3248 * Copy all the information needed quickly and then release the buffer.
3249 */
3250- boolean claimed = claim(false, Persistit.SHORT_DELAY);
3251+ final boolean claimed = claim(false, Persistit.SHORT_DELAY);
3252 try {
3253 bufferSize = _bufferSize;
3254 type = _type;
3255@@ -4138,12 +4177,12 @@
3256 }
3257 }
3258
3259- String toString = toString();
3260+ final String toString = toString();
3261 if (verbose) {
3262 System.out.println(toString);
3263 }
3264
3265- int volumeHandle = volume == null ? 0 : volume.getHandle();
3266+ final int volumeHandle = volume == null ? 0 : volume.getHandle();
3267 if (volume != null && !identifiedVolumes.contains(volume)) {
3268 IV.putType(bb);
3269 IV.putHandle(bb, volumeHandle);
3270@@ -4154,9 +4193,9 @@
3271 identifiedVolumes.add(volume);
3272 }
3273
3274- boolean isDataPage = type == PAGE_TYPE_DATA;
3275- boolean isIndexPage = type >= PAGE_TYPE_INDEX_MIN && type <= PAGE_TYPE_INDEX_MAX;
3276- boolean isLongRecordPage = type == PAGE_TYPE_LONG_RECORD;
3277+ final boolean isDataPage = type == PAGE_TYPE_DATA;
3278+ final boolean isIndexPage = type >= PAGE_TYPE_INDEX_MIN && type <= PAGE_TYPE_INDEX_MAX;
3279+ final boolean isLongRecordPage = type == PAGE_TYPE_LONG_RECORD;
3280
3281 /*
3282 * Following is equivalent to the save method, except written to the
3283@@ -4187,7 +4226,7 @@
3284 } else if (secure && isLongRecordPage) {
3285 left = KEY_BLOCK_START;
3286 }
3287- int recordSize = PA.OVERHEAD + left + right;
3288+ final int recordSize = PA.OVERHEAD + left + right;
3289 PA.putLength(bb, recordSize);
3290 PA.putType(bb);
3291 PA.putVolumeHandle(bb, volumeHandle);
3292@@ -4207,7 +4246,7 @@
3293 * @param bytes
3294 * buffer image
3295 */
3296- private void dumpSecureOverwriteValues(byte[] bytes) {
3297+ private void dumpSecureOverwriteValues(final byte[] bytes) {
3298 if (bytes[0] != PAGE_TYPE_DATA) {
3299 return;
3300 }
3301@@ -4216,12 +4255,12 @@
3302 * overwrite values.
3303 */
3304 for (int p = KEY_BLOCK_START; p < Util.getInt(bytes, KEY_BLOCK_END_OFFSET); p += KEYBLOCK_LENGTH) {
3305- int kbData = Util.getInt(bytes, p);
3306- int db = decodeKeyBlockDb(kbData);
3307+ final int kbData = Util.getInt(bytes, p);
3308+ final int db = decodeKeyBlockDb(kbData);
3309 if (db == 0 && p == KEY_BLOCK_START) {
3310 continue;
3311 } else if (db == Key.TYPE_STRING) {
3312- int tail = decodeKeyBlockTail(kbData);
3313+ final int tail = decodeKeyBlockTail(kbData);
3314 if (bytes[tail + TAILBLOCK_HDR_SIZE_DATA] == '_') {
3315 // Probably a system key - don't overwrite values
3316 return;
3317@@ -4235,9 +4274,9 @@
3318
3319 int tail = Util.getChar(bytes, FREE_OFFSET);
3320 for (; tail < bytes.length;) {
3321- int tbData = Util.getInt(bytes, tail);
3322- int tbSize = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
3323- int tbKLength = decodeTailBlockKLength(tbData);
3324+ final int tbData = Util.getInt(bytes, tail);
3325+ final int tbSize = (decodeTailBlockSize(tbData) + ~TAILBLOCK_MASK) & TAILBLOCK_MASK;
3326+ final int tbKLength = decodeTailBlockKLength(tbData);
3327 //
3328 // If the tbSize field is corrupt then just dump the
3329 // remainder of the buffer
3330@@ -4250,7 +4289,7 @@
3331 // Otherwise, dump just the portion of the tailblock we
3332 // need for analysis and fill the rest with 'x's.
3333 //
3334- boolean tbInUse = decodeTailBlockInUse(tbData);
3335+ final boolean tbInUse = decodeTailBlockInUse(tbData);
3336 // Number of bytes we need to dump
3337 int keep;
3338 if (tbInUse) {
3339@@ -4272,7 +4311,8 @@
3340 }
3341 }
3342
3343- static void deallocatePrunedVersions(Persistit persistit, Volume volume, List<PrunedVersion> prunedVersions) {
3344+ static void deallocatePrunedVersions(final Persistit persistit, final Volume volume,
3345+ final List<PrunedVersion> prunedVersions) {
3346 for (final PrunedVersion pv : prunedVersions) {
3347 final TransactionStatus ts = persistit.getTransactionIndex().getStatus(pv.getTs());
3348 if (ts != null && ts.getTc() == TransactionStatus.ABORTED) {
3349@@ -4281,7 +4321,7 @@
3350 if (pv.getLongRecordPage() != 0) {
3351 try {
3352 volume.getStructure().deallocateGarbageChain(pv.getLongRecordPage(), 0);
3353- } catch (PersistitException e) {
3354+ } catch (final PersistitException e) {
3355 persistit.getLogBase().pruneException.log(e, ts);
3356 }
3357 }
3358@@ -4289,20 +4329,20 @@
3359 prunedVersions.clear();
3360 }
3361
3362- static boolean isLongRecord(byte[] bytes, int offset, int length) {
3363+ static boolean isLongRecord(final byte[] bytes, final int offset, final int length) {
3364 return (length > 0) && ((bytes[offset] & 0xFF) == LONGREC_TYPE);
3365 }
3366
3367- static boolean isLongMVV(byte[] bytes, int offset, int length) {
3368+ static boolean isLongMVV(final byte[] bytes, final int offset, final int length) {
3369 return isLongRecord(bytes, offset, length) && (length > LONGREC_PREFIX_OFFSET)
3370 && MVV.isArrayMVV(bytes, offset + LONGREC_PREFIX_OFFSET, length - LONGREC_PREFIX_OFFSET);
3371 }
3372
3373- static boolean isValueMVV(byte[] bytes, int offset, int length) {
3374+ static boolean isValueMVV(final byte[] bytes, final int offset, final int length) {
3375 return MVV.isArrayMVV(bytes, offset, length) || isLongMVV(bytes, offset, length);
3376 }
3377
3378- private void incCountIfMvv(byte[] bytes, int offset, int length) {
3379+ private void incCountIfMvv(final byte[] bytes, final int offset, final int length) {
3380 if (isValueMVV(bytes, offset, length)) {
3381 ++_mvvCount;
3382 }
3383
3384=== modified file 'src/main/java/com/persistit/BufferPool.java'
3385--- src/main/java/com/persistit/BufferPool.java 2012-08-07 21:11:28 +0000
3386+++ src/main/java/com/persistit/BufferPool.java 2012-08-24 18:21:22 +0000
3387@@ -16,9 +16,13 @@
3388 package com.persistit;
3389
3390 import java.io.DataOutputStream;
3391+import java.io.IOException;
3392 import java.nio.ByteBuffer;
3393+import java.util.ArrayList;
3394 import java.util.Arrays;
3395+import java.util.Collections;
3396 import java.util.HashSet;
3397+import java.util.List;
3398 import java.util.Set;
3399 import java.util.concurrent.atomic.AtomicBoolean;
3400 import java.util.concurrent.atomic.AtomicInteger;
3401@@ -26,6 +30,7 @@
3402 import java.util.concurrent.atomic.AtomicLongArray;
3403 import java.util.concurrent.locks.ReentrantLock;
3404
3405+import com.persistit.JournalManager.PageNode;
3406 import com.persistit.exception.InUseException;
3407 import com.persistit.exception.InvalidPageAddressException;
3408 import com.persistit.exception.InvalidPageStructureException;
3409@@ -36,7 +41,6 @@
3410 import com.persistit.exception.VolumeClosedException;
3411 import com.persistit.util.Debug;
3412 import com.persistit.util.Util;
3413-import java.io.*;
3414
3415 /**
3416 * A pool of {@link Buffer} objects, maintained on various lists that permit
3417@@ -52,7 +56,7 @@
3418 private final static long DEFAULT_WRITER_POLL_INTERVAL = 5000;
3419
3420 private final static int PAGE_WRITER_TRANCHE_SIZE = 5000;
3421-
3422+
3423 /**
3424 * Sleep time when buffers are exhausted
3425 */
3426@@ -87,6 +91,17 @@
3427 */
3428 private final static int WRITE_AGE_THRESHOLD_RATIO = 4;
3429
3430+ private final static String INVENTORY_TREE_NAME = "_buffers";
3431+ /**
3432+ * Maximum number of buffer inventory versions to retain
3433+ */
3434+ private final static int INVENTORY_VERSIONS = 3;
3435+
3436+ /**
3437+ * Preload log multiple
3438+ */
3439+ private final static int INVENTORY_PRELOAD_LOG_MESSAGE_MULTIPLE = 10000;
3440+
3441 /**
3442 * The Persistit instance that references this BufferPool.
3443 */
3444@@ -148,7 +163,7 @@
3445 /**
3446 * Count of newly created pages
3447 */
3448- private AtomicLong _newCounter = new AtomicLong();
3449+ private final AtomicLong _newCounter = new AtomicLong();
3450
3451 /**
3452 * Count of valid buffers evicted to make room for another page.
3453@@ -188,7 +203,7 @@
3454 * Timestamp to which all dirty pages should be written. PAGE_WRITER writes
3455 * any page with a lower update timestamp regardless of urgency.
3456 */
3457- private AtomicLong _flushTimestamp = new AtomicLong();
3458+ private final AtomicLong _flushTimestamp = new AtomicLong();
3459
3460 /**
3461 * Polling interval for PageWriter
3462@@ -196,24 +211,12 @@
3463 private volatile long _writerPollInterval = DEFAULT_WRITER_POLL_INTERVAL;
3464
3465 private volatile int _pageWriterTrancheSize = PAGE_WRITER_TRANCHE_SIZE;
3466-
3467- /**
3468- * Polling interval for PageCacher
3469- */
3470- private volatile long _cacherPollInterval;
3471-
3472+
3473 /**
3474 * The PAGE_WRITER IOTaskRunnable
3475 */
3476 private PageWriter _writer;
3477-
3478- /**
3479- * The PAGE_CACHER IOTaskRunnable
3480- */
3481- private PageCacher _cacher;
3482-
3483- private String _defaultLogPath;
3484-
3485+
3486 /**
3487 * Construct a BufferPool with the specified count of <code>Buffer</code>s
3488 * of the specified size.
3489@@ -223,7 +226,7 @@
3490 * @param size
3491 * The size (in bytes) of each buffer
3492 */
3493- BufferPool(int count, int size, Persistit persistit) {
3494+ BufferPool(final int count, final int size, final Persistit persistit) {
3495 _persistit = persistit;
3496 if (count < MINIMUM_POOL_COUNT) {
3497 throw new IllegalArgumentException("Buffer pool count too small: " + count);
3498@@ -250,7 +253,7 @@
3499 _hashTable = new Buffer[_bufferCount * HASH_MULTIPLE];
3500 _hashLocks = new ReentrantLock[HASH_LOCKS];
3501 _maxKeys = (_bufferSize - Buffer.HEADER_SIZE) / Buffer.MAX_KEY_RATIO;
3502-
3503+
3504 for (int index = 0; index < HASH_LOCKS; index++) {
3505 _hashLocks[index] = new ReentrantLock();
3506 }
3507@@ -263,11 +266,11 @@
3508 byte[] reserve = new byte[1024 * 1024];
3509 try {
3510 for (int index = 0; index < _bufferCount; index++) {
3511- Buffer buffer = new Buffer(size, index, this, _persistit);
3512+ final Buffer buffer = new Buffer(size, index, this, _persistit);
3513 _buffers[index] = buffer;
3514 buffers++;
3515 }
3516- } catch (OutOfMemoryError e) {
3517+ } catch (final OutOfMemoryError e) {
3518 //
3519 // Note: written this way to try to avoid another OOME.
3520 // Do not use String.format here.
3521@@ -284,38 +287,6 @@
3522 throw e;
3523 }
3524 _writer = new PageWriter();
3525- _cacher = new PageCacher();
3526- }
3527-
3528- void warmupBufferPool(String pathName, String fname) throws PersistitException {
3529- File file = new File(pathName, fname + ".log");
3530- _defaultLogPath = file.getAbsolutePath();
3531-
3532- try {
3533- if (!file.exists()) {
3534- file.createNewFile();
3535- }
3536-
3537- BufferedReader reader = new BufferedReader(new FileReader(file));
3538- String currLine;
3539- while ((currLine = reader.readLine()) != null) {
3540- String[] info = currLine.split(" ");
3541- if (info.length == 2) {
3542- Volume vol = _persistit.getVolume(info[1]);
3543- if (vol != null) {
3544- long page = Long.parseLong(info[0]);
3545- Buffer buff = get(vol, page, false, true);
3546- buff.release();
3547- }
3548- }
3549- }
3550- reader.close();
3551- _cacherPollInterval = _persistit.getConfiguration().getBufferInventoryPollingInterval();
3552- _cacher.start();
3553- }
3554- catch (IOException e) {
3555- throw new PersistitException(e);
3556- }
3557 }
3558
3559 void startThreads() throws PersistitException {
3560@@ -325,18 +296,15 @@
3561 void close() {
3562 _closed.set(true);
3563 _persistit.waitForIOTaskStop(_writer);
3564- _persistit.waitForIOTaskStop(_cacher);
3565 _writer = null;
3566- _cacher = null;
3567 }
3568
3569 /**
3570- * Abruptly stop (using {@link Thread#stop()}) the writer, cacher, and collector
3571- * threads. This method should be used only by tests.
3572+ * Abruptly stop (using {@link Thread#stop()}) the writer, cacher, and
3573+ * collector threads. This method should be used only by tests.
3574 */
3575 void crash() {
3576 IOTaskRunnable.crash(_writer);
3577- IOTaskRunnable.crash(_cacher);
3578 }
3579
3580 void flush(final long timestamp) throws PersistitInterruptedException {
3581@@ -351,14 +319,14 @@
3582 return _flushTimestamp.get() != 0;
3583 }
3584
3585- int hashIndex(Volume vol, long page) {
3586+ int hashIndex(final Volume vol, final long page) {
3587 return (int) (((page ^ vol.hashCode()) & Integer.MAX_VALUE) % _hashTable.length);
3588 }
3589
3590- int countInUse(Volume vol, boolean writer) {
3591+ int countInUse(final Volume vol, final boolean writer) {
3592 int count = 0;
3593 for (int i = 0; i < _bufferCount; i++) {
3594- Buffer buffer = _buffers[i];
3595+ final Buffer buffer = _buffers[i];
3596 if ((vol == null || buffer.getVolume() == vol)
3597 && ((buffer.getStatus() & SharedResource.CLAIMED_MASK) != 0 && (!writer || (buffer.getStatus() & SharedResource.WRITER_MASK) != 0))) {
3598 count++;
3599@@ -367,7 +335,7 @@
3600 return count;
3601 }
3602
3603- void populateBufferPoolInfo(ManagementImpl.BufferPoolInfo info) {
3604+ void populateBufferPoolInfo(final ManagementImpl.BufferPoolInfo info) {
3605 info.bufferCount = _bufferCount;
3606 info.bufferSize = _bufferSize;
3607 info.missCount = _missCounter.get();
3608@@ -383,8 +351,8 @@
3609 int writerClaimedPages = 0;
3610
3611 for (int index = 0; index < _bufferCount; index++) {
3612- Buffer buffer = _buffers[index];
3613- int status = buffer.getStatus();
3614+ final Buffer buffer = _buffers[index];
3615+ final int status = buffer.getStatus();
3616 if ((status & SharedResource.VALID_MASK) != 0)
3617 validPages++;
3618 if ((status & SharedResource.WRITER_MASK) != 0)
3619@@ -400,12 +368,13 @@
3620 info.updateAcquisitonTime();
3621 }
3622
3623- int populateInfo(ManagementImpl.BufferInfo[] array, int traveralType, int includeMask, int excludeMask) {
3624+ int populateInfo(final ManagementImpl.BufferInfo[] array, final int traveralType, final int includeMask,
3625+ final int excludeMask) {
3626 int index = 0;
3627 switch (traveralType) {
3628 case 0:
3629 for (int i = 0; i < _bufferCount; i++) {
3630- Buffer buffer = _buffers[i];
3631+ final Buffer buffer = _buffers[i];
3632 if (selected(buffer, includeMask, excludeMask)) {
3633 populateInfo1(array, index, buffer);
3634 index++;
3635@@ -420,44 +389,15 @@
3636 return index;
3637 }
3638
3639- private static void populateInfo1(ManagementImpl.BufferInfo[] array, int index, Buffer buffer) {
3640+ private static void populateInfo1(final ManagementImpl.BufferInfo[] array, final int index, final Buffer buffer) {
3641 if (index < array.length) {
3642 if (array[index] == null)
3643 array[index] = new ManagementImpl.BufferInfo();
3644 buffer.populateInfo(array[index]);
3645 }
3646 }
3647-
3648- private void populateWarmupFile() throws PersistitException {
3649- File file = new File(_defaultLogPath);
3650-
3651- try {
3652- BufferedWriter writer = new BufferedWriter(new FileWriter(file));
3653- for (int i = 0; i < _buffers.length; ++i) {
3654- Buffer b = _buffers[i];
3655- if (b != null && b.isValid() && !b.isDirty()) {
3656- long page = b.getPageAddress();
3657- Volume volume = b.getVolume();
3658- long page2 = b.getPageAddress();
3659- Volume volume2 = b.getVolume();
3660-
3661- // Check if buffer has changed while reading
3662- if (page == page2 && volume == volume2 && volume != null) {
3663- String addr = Long.toString(page);
3664- String vol = volume.getName();
3665- writer.append(addr + " " + vol);
3666- writer.newLine();
3667- writer.flush();
3668- }
3669- }
3670- }
3671- writer.close();
3672- } catch (IOException e) {
3673- throw new PersistitException(e);
3674- }
3675- }
3676
3677- private boolean selected(Buffer buffer, int includeMask, int excludeMask) {
3678+ private boolean selected(final Buffer buffer, final int includeMask, final int excludeMask) {
3679 return ((includeMask == 0) || (buffer.getStatus() & includeMask) != 0)
3680 && (buffer.getStatus() & excludeMask) == 0;
3681 }
3682@@ -599,7 +539,7 @@
3683 * The volume
3684 * @throws PersistitInterruptedException
3685 */
3686- boolean invalidate(Volume volume) throws PersistitInterruptedException {
3687+ boolean invalidate(final Volume volume) throws PersistitInterruptedException {
3688 final float ratio = (float) volume.getStorage().getNextAvailablePage() / (float) _bufferCount;
3689 if (ratio < SMALL_VOLUME_RATIO) {
3690 return invalidateSmallVolume(volume);
3691@@ -612,7 +552,7 @@
3692 boolean result = true;
3693 int markedAvailable = 0;
3694 for (long page = 1; page < volume.getStorage().getNextAvailablePage(); page++) {
3695- int hashIndex = hashIndex(volume, page);
3696+ final int hashIndex = hashIndex(volume, page);
3697 _hashLocks[hashIndex % HASH_LOCKS].lock();
3698 try {
3699 for (Buffer buffer = _hashTable[hashIndex]; buffer != null; buffer = buffer.getNext()) {
3700@@ -630,9 +570,9 @@
3701 buffer.release();
3702 }
3703 if (invalidated) {
3704- int q = buffer.getIndex() / 64;
3705- int p = buffer.getIndex() % 64;
3706- long bits = _availablePagesBits.get(q);
3707+ final int q = buffer.getIndex() / 64;
3708+ final int p = buffer.getIndex() % 64;
3709+ final long bits = _availablePagesBits.get(q);
3710 if (_availablePagesBits.compareAndSet(q, bits, bits | (1L << p))) {
3711 markedAvailable++;
3712 }
3713@@ -657,7 +597,7 @@
3714 boolean result = true;
3715 int markedAvailable = 0;
3716 for (int index = 0; index < _bufferCount; index++) {
3717- Buffer buffer = _buffers[index];
3718+ final Buffer buffer = _buffers[index];
3719 if ((buffer.getVolume() == volume || volume == null) && !buffer.isFixed() && buffer.isValid()) {
3720 if (buffer.claim(true, 0)) {
3721 // re-check after claim
3722@@ -671,9 +611,9 @@
3723 buffer.release();
3724 }
3725 if (invalidated) {
3726- int q = buffer.getIndex() / 64;
3727- int p = buffer.getIndex() % 64;
3728- long bits = _availablePagesBits.get(q);
3729+ final int q = buffer.getIndex() / 64;
3730+ final int p = buffer.getIndex() % 64;
3731+ final long bits = _availablePagesBits.get(q);
3732 if (_availablePagesBits.compareAndSet(q, bits, bits | (1L << p))) {
3733 markedAvailable++;
3734 }
3735@@ -689,29 +629,33 @@
3736 return result;
3737 }
3738
3739- private void invalidate(Buffer buffer) {
3740+ private void invalidate(final Buffer buffer) {
3741 Debug.$assert0.t(buffer.isValid() && buffer.isMine());
3742
3743 while (!detach(buffer)) {
3744 //
3745- // Spin until detach succeeds. Note: this method must not throw an Exception
3746- // because it is called in at at critical time when cleanup must be done.
3747- // It is not possible to lock the hash bucket here due to possible deadlock.
3748- // However, the likelihood of a lengthy live-lock is infinitesimal so polling
3749+ // Spin until detach succeeds. Note: this method must not throw an
3750+ // Exception
3751+ // because it is called in at at critical time when cleanup must be
3752+ // done.
3753+ // It is not possible to lock the hash bucket here due to possible
3754+ // deadlock.
3755+ // However, the likelihood of a lengthy live-lock is infinitesimal
3756+ // so polling
3757 // is acceptable.
3758 //
3759- try {
3760- Thread.sleep(1);
3761- } catch (InterruptedException ie) {
3762- // ignore
3763- }
3764+ try {
3765+ Thread.sleep(1);
3766+ } catch (final InterruptedException ie) {
3767+ // ignore
3768+ }
3769 }
3770 buffer.clearValid();
3771 buffer.clearDirty();
3772 buffer.setPageAddressAndVolume(0, null);
3773 }
3774
3775- private boolean detach(Buffer buffer) {
3776+ private boolean detach(final Buffer buffer) {
3777 final int hash = hashIndex(buffer.getVolume(), buffer.getPageAddress());
3778 if (!_hashLocks[hash % HASH_LOCKS].tryLock()) {
3779 return false;
3780@@ -756,8 +700,9 @@
3781 * @return Buffer The Buffer describing the buffer containing the page.
3782 * @throws InUseException
3783 */
3784- Buffer get(Volume vol, long page, boolean writer, boolean wantRead) throws PersistitException {
3785- int hash = hashIndex(vol, page);
3786+ Buffer get(final Volume vol, final long page, final boolean writer, final boolean wantRead)
3787+ throws PersistitException {
3788+ final int hash = hashIndex(vol, page);
3789 Buffer buffer = null;
3790
3791 for (;;) {
3792@@ -904,10 +849,10 @@
3793 * @throws RetryException
3794 * @throws IOException
3795 */
3796- public Buffer getBufferCopy(Volume vol, long page) throws InvalidPageAddressException,
3797+ public Buffer getBufferCopy(final Volume vol, final long page) throws InvalidPageAddressException,
3798 InvalidPageStructureException, VolumeClosedException, InUseException, PersistitIOException,
3799 PersistitInterruptedException {
3800- int hash = hashIndex(vol, page);
3801+ final int hash = hashIndex(vol, page);
3802 Buffer buffer = null;
3803 _hashLocks[hash % HASH_LOCKS].lock();
3804 try {
3805@@ -934,7 +879,7 @@
3806 // Didn't find it in the pool, so we'll read a copy.
3807 //
3808 buffer = new Buffer(_bufferSize, -1, this, _persistit);
3809- boolean acquired = buffer.claim(true);
3810+ final boolean acquired = buffer.claim(true);
3811 assert acquired : "buffer not unavailable";
3812 buffer.load(vol, page);
3813 buffer.setValid();
3814@@ -968,7 +913,7 @@
3815 // since no valid page will need to be evicted.
3816 //
3817 if (_availablePages.get()) {
3818- int start = (_clock.get() / 64) * 64;
3819+ final int start = (_clock.get() / 64) * 64;
3820 for (int q = start;;) {
3821 q += 64;
3822 if (q >= _bufferCount) {
3823@@ -1007,12 +952,12 @@
3824 // Look for a page to evict.
3825 //
3826 for (int retry = 0; retry < _bufferCount * 2;) {
3827- int clock = _clock.get();
3828+ final int clock = _clock.get();
3829 assert clock < _bufferCount;
3830 if (!_clock.compareAndSet(clock, (clock + 1) % _bufferCount)) {
3831 continue;
3832 }
3833- Buffer buffer = _buffers[clock];
3834+ final Buffer buffer = _buffers[clock];
3835 if (buffer.isTouched()) {
3836 buffer.clearTouched();
3837 } else {
3838@@ -1081,7 +1026,7 @@
3839
3840 void setFlushTimestamp(final long timestamp) {
3841 while (true) {
3842- long current = _flushTimestamp.get();
3843+ final long current = _flushTimestamp.get();
3844 if (timestamp > current) {
3845 if (_flushTimestamp.compareAndSet(current, timestamp)) {
3846 break;
3847@@ -1099,7 +1044,7 @@
3848 * polling cycle
3849 */
3850 boolean shouldWritePages() {
3851- int cleanCount = _bufferCount - _dirtyPageCount.get();
3852+ final int cleanCount = _bufferCount - _dirtyPageCount.get();
3853 if (getEarliestDirtyTimestamp() < _flushTimestamp.get()) {
3854 return true;
3855 }
3856@@ -1116,7 +1061,7 @@
3857 }
3858
3859 void writeDirtyBuffers(final int[] priorities, final BufferHolder[] selectedBuffers) throws PersistitException {
3860- int count = selectDirtyBuffers(priorities, selectedBuffers);
3861+ final int count = selectDirtyBuffers(priorities, selectedBuffers);
3862 if (count > 0) {
3863 Arrays.sort(selectedBuffers, 0, count);
3864 for (int index = 0; index < count; index++) {
3865@@ -1144,7 +1089,7 @@
3866 final long currentTimestamp = _persistit.getCurrentTimestamp();
3867
3868 long earliestDirtyTimestamp = currentTimestamp;
3869- long flushTimestamp = _flushTimestamp.get();
3870+ final long flushTimestamp = _flushTimestamp.get();
3871
3872 boolean flushed = true;
3873 for (int index = clock; index < clock + _bufferCount; index++) {
3874@@ -1202,8 +1147,9 @@
3875 }
3876 return count;
3877 }
3878-
3879- int addSelectedBufferByPriority(final Buffer buffer, final int priority, final int[] priorities, final BufferHolder[] holders, final int initialCount) {
3880+
3881+ int addSelectedBufferByPriority(final Buffer buffer, final int priority, final int[] priorities,
3882+ final BufferHolder[] holders, final int initialCount) {
3883 int count = initialCount;
3884 if (priority > 0) {
3885 if (count == 0 || priorities[count - 1] > priority) {
3886@@ -1214,13 +1160,13 @@
3887 }
3888 } else {
3889 count = Math.min(count, priorities.length - 1);
3890- int where = count;
3891+ int where = count;
3892 while (where > 0 && priorities[where - 1] < priority) {
3893 where--;
3894 }
3895- int move = count - where ;
3896+ final int move = count - where;
3897 if (move > 0) {
3898- BufferHolder lastHolder = holders[count];
3899+ final BufferHolder lastHolder = holders[count];
3900 System.arraycopy(priorities, where, priorities, where + 1, move);
3901 System.arraycopy(holders, where, holders, where + 1, move);
3902 holders[where] = lastHolder;
3903@@ -1240,8 +1186,8 @@
3904 *
3905 * @return priority
3906 */
3907- int writePriority(final Buffer buffer, int clock, long checkpointTimestamp, final long currentTimestamp) {
3908- int status = buffer.getStatus();
3909+ int writePriority(final Buffer buffer, final int clock, final long checkpointTimestamp, final long currentTimestamp) {
3910+ final int status = buffer.getStatus();
3911 if ((status & Buffer.VALID_MASK) == 0 || (status & Buffer.DIRTY_MASK) == 0) {
3912 // ineligible
3913 return 0;
3914@@ -1336,7 +1282,7 @@
3915 * address order.
3916 */
3917 @Override
3918- public int compareTo(BufferHolder buffer) {
3919+ public int compareTo(final BufferHolder buffer) {
3920 return _volumeId > buffer._volumeId ? 1 : _volumeId < buffer._volumeId ? -1 : _page > buffer._page ? 1
3921 : _page < buffer._page ? -1 : 0;
3922
3923@@ -1367,7 +1313,7 @@
3924
3925 @Override
3926 public void runTask() throws PersistitException {
3927- int size = _pageWriterTrancheSize;
3928+ final int size = _pageWriterTrancheSize;
3929 if (size != _priorities.length) {
3930 _priorities = new int[size];
3931 _selectedBuffers = new BufferHolder[size];
3932@@ -1391,35 +1337,6 @@
3933 return isFlushing() ? 0 : _writerPollInterval;
3934 }
3935 }
3936-
3937- /**
3938- * Implementation of PAGE_CACHER thread
3939- */
3940- class PageCacher extends IOTaskRunnable {
3941-
3942- PageCacher() {
3943- super(BufferPool.this._persistit);
3944- }
3945-
3946- void start() {
3947- start("PAGE_CACHER:" + _bufferSize, _cacherPollInterval);
3948- }
3949-
3950- @Override
3951- public void runTask() throws Exception {
3952- populateWarmupFile();
3953- }
3954-
3955- @Override
3956- protected boolean shouldStop() {
3957- return _closed.get() && !isFlushing();
3958- }
3959-
3960- @Override
3961- protected long pollInterval() {
3962- return isFlushing() ? 0 : _cacherPollInterval;
3963- }
3964- }
3965
3966 @Override
3967 public String toString() {
3968@@ -1431,7 +1348,7 @@
3969 * @param detail
3970 * @return toString value for buffer at index <code>i</code>.
3971 */
3972- String toString(int i, boolean detail) {
3973+ String toString(final int i, final boolean detail) {
3974 if (detail) {
3975 return _buffers[i].toStringDetail();
3976 } else {
3977@@ -1475,4 +1392,133 @@
3978 }
3979 stream.flush();
3980 }
3981+
3982+ void recordBufferInventory(final long timestamp) throws PersistitException {
3983+ final Exchange exchange = getBufferInventoryExchange();
3984+ /*
3985+ * Advisory only - transaction integrity not needed
3986+ */
3987+ exchange.ignoreTransactions();
3988+ try {
3989+ int total = 0;
3990+ exchange.clear().append(_bufferSize).append(timestamp).append(Key.BEFORE);
3991+ final Value value = exchange.getValue();
3992+ final int clockValueBefore = _clock.get();
3993+ for (int index = 0; index < _buffers.length; index++) {
3994+ final Buffer buffer = _buffers[index];
3995+ long page1 = -1, page2 = -1;
3996+ Volume volume1 = null, volume2 = null;
3997+ if (buffer != null && buffer.isValid()) {
3998+ while (true) {
3999+ page1 = buffer.getPageAddress();
4000+ volume1 = buffer.getVolume();
4001+ page2 = buffer.getPageAddress();
4002+ volume2 = buffer.getVolume();
4003+ if (page1 == page2 && volume1 == volume2) {
4004+ break;
4005+ }
4006+ Util.spinSleep();
4007+ }
4008+ if (volume1 != null && !volume1.isTemporary()) {
4009+ value.clear().setStreamMode(true);
4010+ value.put(volume1.getHandle());
4011+ value.put(page1);
4012+ exchange.to(index).store();
4013+ total++;
4014+ }
4015+ }
4016+ }
4017+ final int clockValueAfter = _clock.get();
4018+ exchange.cut();
4019+ value.clear().setStreamMode(true);
4020+ value.put(_bufferCount);
4021+ value.put(total);
4022+ value.put(clockValueBefore);
4023+ value.put(clockValueAfter);
4024+ value.put(System.currentTimeMillis());
4025+ exchange.store();
4026+ int count = 0;
4027+ while (exchange.previous()) {
4028+ if (++count > INVENTORY_VERSIONS) {
4029+ exchange.remove(Key.GTEQ);
4030+ }
4031+ }
4032+ } catch (final PersistitException e) {
4033+ _persistit.getLogBase().bufferInventoryException.log(e);
4034+ }
4035+ }
4036+
4037+ void preloadBufferInventory() {
4038+ int count = 0;
4039+ int total = 0;
4040+ try {
4041+ final JournalManager jman = _persistit.getJournalManager();
4042+ final Exchange exchange = getBufferInventoryExchange();
4043+ final Value value = exchange.getValue();
4044+ final List<PageNode> pageNodes = new ArrayList<PageNode>();
4045+ boolean foundInventory = false;
4046+ exchange.clear().append(_bufferSize).append(Key.AFTER);
4047+ while (exchange.previous()) {
4048+ if (exchange.getValue().isDefined()) {
4049+ foundInventory = true;
4050+ break;
4051+ }
4052+ }
4053+ if (!foundInventory) {
4054+ return;
4055+ }
4056+ value.setStreamMode(true);
4057+ /* int bufferCount = */value.getInt();
4058+ total = value.getInt();
4059+ /* int clockValueBefore = */value.getInt();
4060+ /* int clockValueAfter = */value.getInt();
4061+ final long systemTime = value.getLong();
4062+
4063+ _persistit.getLogBase().bufferInventoryLoad.log(systemTime);
4064+
4065+ exchange.append(Key.BEFORE);
4066+
4067+ while (exchange.next()) {
4068+ value.setStreamMode(true);
4069+ final int volumeHandle = value.getInt();
4070+ final long pageAddress = value.getLong();
4071+ final PageNode pn = new PageNode(volumeHandle, pageAddress);
4072+ pageNodes.add(pn);
4073+ }
4074+
4075+ Collections.sort(pageNodes, PageNode.READ_COMPARATOR);
4076+ for (final PageNode pn : pageNodes) {
4077+ final Volume vol = jman.volumeForHandle(pn.getVolumeHandle());
4078+ if (vol == null) {
4079+ continue;
4080+ }
4081+ try {
4082+ final Buffer buff = get(vol, pn.getPageAddress(), false, true);
4083+ buff.release();
4084+ count++;
4085+ if ((count % INVENTORY_PRELOAD_LOG_MESSAGE_MULTIPLE) == 0) {
4086+ _persistit.getLogBase().bufferInventoryProgress.log(count, total);
4087+ }
4088+ if (count >= _bufferCount) {
4089+ //
4090+ // If the buffer pool is now smaller, no need to load
4091+ // more pages
4092+ //
4093+ break;
4094+ }
4095+ } catch (final PersistitException e) {
4096+ // ignore it
4097+ }
4098+ }
4099+ } catch (final PersistitException e) {
4100+ _persistit.getLogBase().bufferInventoryException.log(e);
4101+ } finally {
4102+ _persistit.getLogBase().bufferInventoryProgress.log(count, total);
4103+ }
4104+ }
4105+
4106+ private Exchange getBufferInventoryExchange() throws PersistitException {
4107+ final Volume sysvol = _persistit.getSystemVolume();
4108+ return _persistit.getExchange(sysvol, INVENTORY_TREE_NAME, true);
4109+ }
4110 }
4111
4112=== modified file 'src/main/java/com/persistit/BufferPoolMXBeanImpl.java'
4113--- src/main/java/com/persistit/BufferPoolMXBeanImpl.java 2012-08-02 04:45:28 +0000
4114+++ src/main/java/com/persistit/BufferPoolMXBeanImpl.java 2012-08-24 18:21:22 +0000
4115@@ -23,8 +23,9 @@
4116
4117 /**
4118 * MXBean that exposes information about a {@link BufferPool}.
4119+ *
4120 * @author peter
4121- *
4122+ *
4123 */
4124 class BufferPoolMXBeanImpl implements BufferPoolMXBean {
4125
4126@@ -47,16 +48,16 @@
4127 }
4128
4129 private BufferPoolInfo recent() {
4130- long now = System.currentTimeMillis();
4131+ final long now = System.currentTimeMillis();
4132 if (_recent.getAcquisitionTime() < now - MAX_STALE) {
4133 try {
4134- BufferPoolInfo[] array = _persistit.getManagement().getBufferPoolInfoArray();
4135- for (BufferPoolInfo info : array) {
4136+ final BufferPoolInfo[] array = _persistit.getManagement().getBufferPoolInfoArray();
4137+ for (final BufferPoolInfo info : array) {
4138 if (info.getBufferSize() == _bufferSize) {
4139 _recent = info;
4140 }
4141 }
4142- } catch (RemoteException e) {
4143+ } catch (final RemoteException e) {
4144 // TODO Auto-generated catch block
4145 e.printStackTrace();
4146 }
4147
4148=== modified file 'src/main/java/com/persistit/CLI.java'
4149--- src/main/java/com/persistit/CLI.java 2012-08-02 04:45:28 +0000
4150+++ src/main/java/com/persistit/CLI.java 2012-08-24 18:21:22 +0000
4151@@ -168,12 +168,12 @@
4152 public static void registerCommands(final Class<?> clazz) {
4153 for (final Method method : clazz.getDeclaredMethods()) {
4154 if (method.isAnnotationPresent(Cmd.class)) {
4155- String name = method.getAnnotation(Cmd.class).value();
4156- Annotation[][] parameters = method.getParameterAnnotations();
4157- String[] argTemplate = new String[parameters.length];
4158+ final String name = method.getAnnotation(Cmd.class).value();
4159+ final Annotation[][] parameters = method.getParameterAnnotations();
4160+ final String[] argTemplate = new String[parameters.length];
4161 int index = 0;
4162- for (Annotation[] annotations : parameters) {
4163- Arg argAnnotation = (Arg) annotations[0];
4164+ for (final Annotation[] annotations : parameters) {
4165+ final Arg argAnnotation = (Arg) annotations[0];
4166 argTemplate[index++] = argAnnotation.value();
4167 }
4168 COMMANDS.put(name, new Command(name, argTemplate, method));
4169@@ -228,7 +228,7 @@
4170 int port = -1;
4171 String host = null;
4172
4173- String[] hostPieces = args[0].split(":");
4174+ final String[] hostPieces = args[0].split(":");
4175 switch (hostPieces.length) {
4176 case 1:
4177 port = Integer.parseInt(hostPieces[0]);
4178@@ -275,7 +275,7 @@
4179 */
4180 public static void runScript(final Persistit persistit, final BufferedReader reader, final PrintWriter writer)
4181 throws Exception {
4182- CLI cli = new CLI(persistit, reader, writer);
4183+ final CLI cli = new CLI(persistit, reader, writer);
4184 cli.commandLoop();
4185 cli.close(false);
4186 writer.println();
4187@@ -307,7 +307,7 @@
4188
4189 boolean quoted = false;
4190 for (int index = 0; index < commandLine.length(); index++) {
4191- char c = commandLine.charAt(index);
4192+ final char c = commandLine.charAt(index);
4193 if (index == 0 && !Character.isLetter(c)) {
4194 commandDelimiter = c;
4195 continue;
4196@@ -342,17 +342,17 @@
4197 }
4198
4199 static Task parseTask(final Persistit persistit, final String line) throws Exception {
4200- List<String> pieces = pieces(line);
4201+ final List<String> pieces = pieces(line);
4202 if (pieces.isEmpty()) {
4203 return null;
4204 }
4205 final String commandName = pieces.remove(0);
4206- Command command = COMMANDS.get(commandName);
4207+ final Command command = COMMANDS.get(commandName);
4208 if (command == null) {
4209 return null;
4210 }
4211- Task task = command.createTask(persistit, new ArgParser(commandName, pieces.toArray(new String[pieces.size()]),
4212- command.argTemplate).strict());
4213+ final Task task = command.createTask(persistit,
4214+ new ArgParser(commandName, pieces.toArray(new String[pieces.size()]), command.argTemplate).strict());
4215 if (task != null) {
4216 task.setPersistit(persistit);
4217 }
4218@@ -433,14 +433,14 @@
4219 private final BufferedReader _reader;
4220 private final PrintWriter _writer;
4221
4222- private ScriptReader(final BufferedReader reader, PrintWriter writer) {
4223+ private ScriptReader(final BufferedReader reader, final PrintWriter writer) {
4224 _reader = reader;
4225 _writer = writer;
4226 }
4227
4228 @Override
4229 public String readLine() throws IOException {
4230- String line = _reader.readLine();
4231+ final String line = _reader.readLine();
4232 if (line != null) {
4233 _writer.println();
4234 _writer.println(">> " + line);
4235@@ -476,10 +476,10 @@
4236 private String execute(final CLI cli, final ArgParser ap) throws Exception {
4237 final Object[] args = invocationArgs(ap);
4238 if (method.getReturnType() == String.class) {
4239- String result = (String) method.invoke(cli, args);
4240+ final String result = (String) method.invoke(cli, args);
4241 return result;
4242 } else if (Task.class.isAssignableFrom(method.getReturnType())) {
4243- Task task = (Task) method.invoke(cli, args);
4244+ final Task task = (Task) method.invoke(cli, args);
4245 task.setPersistit(cli._persistit);
4246 task.setMaximumTime(-1);
4247 task.setMessageWriter(cli._writer);
4248@@ -493,9 +493,9 @@
4249
4250 private Task createTask(final Persistit persistit, final ArgParser ap) throws Exception {
4251 if (Task.class.isAssignableFrom(method.getReturnType())) {
4252- CLI cli = persistit.getSessionCLI();
4253+ final CLI cli = persistit.getSessionCLI();
4254 final Object[] args = invocationArgs(ap);
4255- Task task = (Task) method.invoke(cli, args);
4256+ final Task task = (Task) method.invoke(cli, args);
4257 return task;
4258 } else {
4259 return null;
4260@@ -503,10 +503,10 @@
4261 }
4262
4263 private Object[] invocationArgs(final ArgParser ap) {
4264- Class<?>[] types = method.getParameterTypes();
4265+ final Class<?>[] types = method.getParameterTypes();
4266 final Object[] args = new Object[types.length];
4267 for (int index = 0; index < types.length; index++) {
4268- Class<?> type = types[index];
4269+ final Class<?> type = types[index];
4270 if (String.class.equals(type)) {
4271 args[index] = ap.stringValue(index);
4272 } else if (int.class.equals(type)) {
4273@@ -525,7 +525,7 @@
4274
4275 @Override
4276 public String toString() {
4277- StringBuilder sb = new StringBuilder(name);
4278+ final StringBuilder sb = new StringBuilder(name);
4279 sb.append(Util.NEW_LINE);
4280 sb.append(new ArgParser(name, new String[0], argTemplate).strict());
4281 return sb.toString();
4282@@ -540,7 +540,7 @@
4283
4284 private LineReader _lineReader;
4285 PrintWriter _writer = new PrintWriter(System.out);
4286- private Stack<BufferedReader> _sourceStack = new Stack<BufferedReader>();
4287+ private final Stack<BufferedReader> _sourceStack = new Stack<BufferedReader>();
4288 private Persistit _persistit;
4289 private boolean _stop = false;
4290 private Volume _currentVolume;
4291@@ -635,19 +635,19 @@
4292 final String[] args = list.toArray(new String[list.size()]);
4293 final ArgParser ap = new ArgParser(commandName, args, command.argTemplate).strict();
4294 if (!ap.isUsageOnly()) {
4295- String result = command.execute(this, ap);
4296+ final String result = command.execute(this, ap);
4297 if (result != null) {
4298 _writer.println(result);
4299 }
4300 _lastStatus += " - done";
4301 }
4302- } catch (InvocationTargetException e) {
4303+ } catch (final InvocationTargetException e) {
4304 _lastStatus += e.getTargetException();
4305 _writer.println(e.getTargetException());
4306- } catch (RuntimeException e) {
4307+ } catch (final RuntimeException e) {
4308 _lastStatus += e;
4309 e.printStackTrace(_writer);
4310- } catch (Exception e) {
4311+ } catch (final Exception e) {
4312 _lastStatus += e;
4313 _writer.println(e);
4314 }
4315@@ -680,28 +680,28 @@
4316 * @throws Exception
4317 */
4318 @Cmd("open")
4319- String open(@Arg("datapath|string|Data path") String datapath,
4320- @Arg("journalpath|string|Journal path") String journalpath,
4321- @Arg("volumepath|string|Volume file") String volumepath,
4322- @Arg("rmiport|int:1099:0:99999|RMI Management port") int rmiport,
4323- @Arg("_flag|y|Recover committed transactions") boolean y) throws Exception {
4324+ String open(@Arg("datapath|string|Data path") final String datapath,
4325+ @Arg("journalpath|string|Journal path") final String journalpath,
4326+ @Arg("volumepath|string|Volume file") final String volumepath,
4327+ @Arg("rmiport|int:1099:0:99999|RMI Management port") final int rmiport,
4328+ @Arg("_flag|y|Recover committed transactions") final boolean y) throws Exception {
4329
4330 if (_live) {
4331 return "Cannot open another Persistit instance within a live system";
4332 }
4333 close(false);
4334
4335- String jpath = journalPath(filesOnPath(journalpath.isEmpty() ? datapath : journalpath));
4336- List<VolumeSpecification> volumeSpecifications = volumeSpecifications(
4337+ final String jpath = journalPath(filesOnPath(journalpath.isEmpty() ? datapath : journalpath));
4338+ final List<VolumeSpecification> volumeSpecifications = volumeSpecifications(
4339 filesOnPath(volumepath.isEmpty() ? datapath : volumepath), Long.MAX_VALUE);
4340- Set<Integer> bufferSizes = new HashSet<Integer>();
4341+ final Set<Integer> bufferSizes = new HashSet<Integer>();
4342 for (final VolumeSpecification vs : volumeSpecifications) {
4343 bufferSizes.add(vs.getPageSize());
4344 }
4345 final Properties properties = new Properties();
4346- long bpoolMemory = availableMemory() / 2;
4347+ final long bpoolMemory = availableMemory() / 2;
4348 for (final Integer size : bufferSizes) {
4349- int alloc = (int) (size * 1.25);
4350+ final int alloc = (int) (size * 1.25);
4351 final int count = (int) ((bpoolMemory / bufferSizes.size()) / alloc);
4352 properties.put(Persistit.BUFFERS_PROPERTY_NAME + size, Integer.toString(count));
4353 }
4354@@ -747,7 +747,7 @@
4355 }
4356 }
4357 if (sysvol != null) {
4358- properties.put(Persistit.SYSTEM_VOLUME_PROPERTY, sysvol.getName());
4359+ persistit.getConfiguration().setSysVolume(sysvol.getName());
4360 }
4361
4362 _persistit = persistit;
4363@@ -755,7 +755,7 @@
4364 }
4365
4366 @Cmd("close")
4367- String close(@Arg("_flag|f|Flush modifications to disk") boolean flush) throws Exception {
4368+ String close(@Arg("_flag|f|Flush modifications to disk") final boolean flush) throws Exception {
4369 if (_persistit != null) {
4370 try {
4371 if (_live) {
4372@@ -764,7 +764,7 @@
4373 _persistit.shutdownGUI();
4374 _persistit.close(flush);
4375 }
4376- } catch (Exception e) {
4377+ } catch (final Exception e) {
4378 return e.toString();
4379 } finally {
4380 _persistit = null;
4381@@ -832,6 +832,7 @@
4382 public void runTask() throws Exception {
4383 final JournalTool jt = new JournalTool(_persistit);
4384 jt.setAction(jt.new SimpleDumpAction() {
4385+ @Override
4386 protected void write(final String msg) {
4387 postMessage(msg, LOG_NORMAL);
4388 }
4389@@ -923,7 +924,7 @@
4390 return;
4391 }
4392
4393- List<Object> selected = new ArrayList<Object>();
4394+ final List<Object> selected = new ArrayList<Object>();
4395 final TreeSelector selector = TreeSelector.parseSelector(tstring, r, '\\');
4396
4397 for (final Volume volume : _persistit.getVolumes()) {
4398@@ -988,10 +989,10 @@
4399 if (!keyString.isEmpty()) {
4400 new KeyParser(keyString).parseKey(exchange.getKey());
4401 }
4402- StringBuilder sb = new StringBuilder();
4403- int depth = _currentTree.getDepth();
4404+ final StringBuilder sb = new StringBuilder();
4405+ final int depth = _currentTree.getDepth();
4406 for (int level = depth; --level >= 0;) {
4407- Buffer copy = exchange.fetchBufferCopy(level);
4408+ final Buffer copy = exchange.fetchBufferCopy(level);
4409 if (sb.length() > 0) {
4410 sb.append(Util.NEW_LINE);
4411 }
4412@@ -1051,7 +1052,7 @@
4413 return;
4414 }
4415 if (index >= 0) {
4416- BufferPool pool = _persistit.getBufferPool(pageSize);
4417+ final BufferPool pool = _persistit.getBufferPool(pageSize);
4418 buffer = pool.getBufferCopy(index);
4419 } else if (journalAddress >= 0) {
4420 buffer = _persistit.getJournalManager().readPageBuffer(journalAddress);
4421@@ -1088,12 +1089,13 @@
4422 }
4423 }
4424
4425+ @Override
4426 public String getStatus() {
4427 return "";
4428 }
4429 };
4430 }
4431-
4432+
4433 @Cmd("pviewchain")
4434 Task pviewchain(final @Arg("page|long:0:0:99999999999999999|Starting page address") long pageAddress,
4435 final @Arg("find|long:-1:0:99999999999999999|Optional page pointer to find") long findPointer,
4436@@ -1102,7 +1104,7 @@
4437 final @Arg("maxvalue|int:42:4:100000|Maximum displayed value length") int maxvalue,
4438 final @Arg("context|int:3:0:100000|Context lines") int context,
4439 final @Arg("_flag|a|All lines") boolean allLines, final @Arg("_flag|s|Summary only") boolean summary) {
4440-
4441+
4442 return new Task() {
4443
4444 @Override
4445@@ -1121,15 +1123,15 @@
4446 postMessage(buffer.toStringDetail(findPointer, maxkey, maxvalue, context, allLines), LOG_NORMAL);
4447 }
4448 currentPage = buffer.getRightSibling();
4449- }
4450+ }
4451 }
4452
4453 @Override
4454 public String getStatus() {
4455 return "";
4456 }
4457-
4458- };
4459+
4460+ };
4461 }
4462
4463 @Cmd("jquery")
4464@@ -1140,6 +1142,7 @@
4465 final @Arg("_flag|V|Show volume handle map") boolean showTreeMap,
4466 final @Arg("_flag|T|Show tree handle map") boolean showVolumeMap) {
4467 return new Task() {
4468+ @Override
4469 public void runTask() throws Exception {
4470 if (!showVolumeMap && !showTreeMap && pageAddress == -1 && ts == -1) {
4471 postMessage("No items requested", LOG_NORMAL);
4472@@ -1147,20 +1150,20 @@
4473 }
4474 if (showVolumeMap) {
4475 postMessage("Volume Handle Map", LOG_NORMAL);
4476- Map<Integer, Volume> map = _persistit.getJournalManager().queryVolumeMap();
4477+ final Map<Integer, Volume> map = _persistit.getJournalManager().queryVolumeMap();
4478 for (final Map.Entry<Integer, Volume> entry : map.entrySet()) {
4479 postMessage(String.format("%,5d -> %s", entry.getKey(), entry.getValue()), LOG_NORMAL);
4480 }
4481 }
4482 if (showVolumeMap) {
4483 postMessage("Tree Handle Map", LOG_NORMAL);
4484- Map<Integer, TreeDescriptor> map = _persistit.getJournalManager().queryTreeMap();
4485+ final Map<Integer, TreeDescriptor> map = _persistit.getJournalManager().queryTreeMap();
4486 for (final Map.Entry<Integer, TreeDescriptor> entry : map.entrySet()) {
4487 postMessage(String.format("%,5d -> %s", entry.getKey(), entry.getValue()), LOG_NORMAL);
4488 }
4489 }
4490 if (ts != -1) {
4491- TransactionMapItem item = _persistit.getJournalManager().queryTransactionMap(ts);
4492+ final TransactionMapItem item = _persistit.getJournalManager().queryTransactionMap(ts);
4493 postMessage(String.format("TransactionMapItem for ts=%,d -> %s", ts, item), LOG_NORMAL);
4494 }
4495 if (pageAddress != -1) {
4496@@ -1168,7 +1171,7 @@
4497 if (volumeHandle != -1) {
4498 queryPageNode(volumeHandle, pageAddress, verbose);
4499 } else {
4500- Map<Integer, Volume> volumeMap = _persistit.getJournalManager().queryVolumeMap();
4501+ final Map<Integer, Volume> volumeMap = _persistit.getJournalManager().queryVolumeMap();
4502 for (final int handle : volumeMap.keySet()) {
4503 queryPageNode(handle, pageAddress, verbose);
4504 }
4505@@ -1202,6 +1205,7 @@
4506 final @Arg("_flag|v|Verbose") boolean verbose) throws Exception {
4507
4508 return new Task() {
4509+ @Override
4510 public void runTask() throws Exception {
4511 final File target = new File(file);
4512 if (target.exists() && !ovewrite) {
4513@@ -1255,12 +1259,12 @@
4514 zos.closeEntry();
4515 bb.clear();
4516
4517- PrintWriter writer = new PrintWriter(zos);
4518+ final PrintWriter writer = new PrintWriter(zos);
4519 ze = new ZipEntry(basePath + ".txt");
4520 ze.setSize(Integer.MAX_VALUE);
4521 ze.setTime(baseTime);
4522 zos.putNextEntry(ze);
4523- List<Volume> volumes = _persistit.getVolumes();
4524+ final List<Volume> volumes = _persistit.getVolumes();
4525
4526 writer.printf("@volumes=%d\n", volumes.size());
4527 for (final Volume volume : volumes) {
4528@@ -1314,7 +1318,7 @@
4529
4530 @Cmd("cliserver")
4531 static Task cliserver(final @Arg("port|int:9999:1024:99999999") int port) throws Exception {
4532- Task task = new Task() {
4533+ final Task task = new Task() {
4534 CLI _cli;
4535
4536 @Override
4537@@ -1325,9 +1329,9 @@
4538
4539 @Override
4540 public String getStatus() {
4541- CLI cli = _cli;
4542+ final CLI cli = _cli;
4543 if (cli != null) {
4544- String status = cli._lastStatus;
4545+ final String status = cli._lastStatus;
4546 if (status != null) {
4547 return status;
4548 }
4549@@ -1339,12 +1343,12 @@
4550 return task;
4551 }
4552
4553- private static String journalPath(List<String> files) {
4554+ private static String journalPath(final List<String> files) {
4555 String journalPath = null;
4556 for (final String file : files) {
4557- Matcher matcher = JournalManager.PATH_PATTERN.matcher(file);
4558+ final Matcher matcher = JournalManager.PATH_PATTERN.matcher(file);
4559 if (matcher.matches()) {
4560- String path = matcher.group(1);
4561+ final String path = matcher.group(1);
4562 if (journalPath == null) {
4563 journalPath = path;
4564 } else if (!journalPath.equals(path)) {
4565@@ -1355,7 +1359,7 @@
4566 return journalPath;
4567 }
4568
4569- private static List<VolumeSpecification> volumeSpecifications(List<String> files, long systemTimestamp) {
4570+ private static List<VolumeSpecification> volumeSpecifications(final List<String> files, final long systemTimestamp) {
4571 final List<VolumeSpecification> list = new ArrayList<VolumeSpecification>();
4572 for (final String path : files) {
4573 if (JournalManager.PATH_PATTERN.matcher(path).matches()) {
4574@@ -1366,7 +1370,7 @@
4575 if (VolumeHeader.verifyVolumeHeader(specification, systemTimestamp)) {
4576 list.add(specification);
4577 }
4578- } catch (PersistitException e) {
4579+ } catch (final PersistitException e) {
4580 // ignore this file
4581 }
4582 }
4583
4584=== modified file 'src/main/java/com/persistit/CheckpointManager.java'
4585--- src/main/java/com/persistit/CheckpointManager.java 2012-08-02 04:45:28 +0000
4586+++ src/main/java/com/persistit/CheckpointManager.java 2012-08-24 18:21:22 +0000
4587@@ -43,7 +43,7 @@
4588 private final long _systemTime;
4589
4590 private volatile boolean _completed = false;
4591-
4592+
4593 Checkpoint(final long timestamp, final long systemTime) {
4594 _timestamp = timestamp;
4595 _systemTime = systemTime;
4596@@ -72,8 +72,8 @@
4597
4598 @Override
4599 public String toString() {
4600- return String.format("Checkpoint %,d%s @ %s", _timestamp, isCompleted() ? "c" : "u", SDF.format(new Date(
4601- _systemTime)));
4602+ return String.format("Checkpoint %,d%s @ %s", _timestamp, isCompleted() ? "c" : "u",
4603+ SDF.format(new Date(_systemTime)));
4604 }
4605
4606 @Override
4607@@ -81,7 +81,7 @@
4608 if (!(object instanceof Checkpoint)) {
4609 return false;
4610 }
4611- Checkpoint cp = (Checkpoint) object;
4612+ final Checkpoint cp = (Checkpoint) object;
4613 return cp._systemTime == _systemTime && cp._timestamp == _timestamp;
4614 }
4615 }
4616@@ -92,9 +92,9 @@
4617 * Default interval in nanoseconds between checkpoints - two minutes.
4618 */
4619 private final static long DEFAULT_CHECKPOINT_INTERVAL = 120;
4620-
4621+
4622 private final static long MINIMUM_CHECKPOINT_INTERVAL = 10;
4623-
4624+
4625 private final static long MAXIMUM_CHECKPOINT_INTERVAL = 1800;
4626
4627 private final static Checkpoint UNAVALABLE_CHECKPOINT = new Checkpoint(0, 0);
4628@@ -110,13 +110,12 @@
4629 private final static long FLUSH_CHECKPOINT_INTERVAL = 5000;
4630
4631 private volatile Checkpoint _currentCheckpoint = new Checkpoint(0, 0, true);
4632-
4633- private List<Checkpoint> _outstandingCheckpoints = new ArrayList<Checkpoint>();
4634-
4635-
4636- private AtomicBoolean _closed = new AtomicBoolean();
4637-
4638- private AtomicBoolean _fastClose = new AtomicBoolean();
4639+
4640+ private final List<Checkpoint> _outstandingCheckpoints = new ArrayList<Checkpoint>();
4641+
4642+ private final AtomicBoolean _closed = new AtomicBoolean();
4643+
4644+ private final AtomicBoolean _fastClose = new AtomicBoolean();
4645
4646 CheckpointManager(final Persistit persistit) {
4647 super(persistit);
4648@@ -139,12 +138,12 @@
4649 Checkpoint getCurrentCheckpoint() {
4650 return _currentCheckpoint;
4651 }
4652-
4653+
4654 long getCheckpointIntervalNanos() {
4655 return _checkpointIntervalNanos;
4656 }
4657
4658- void setCheckpointIntervalNanos(long interval) {
4659+ void setCheckpointIntervalNanos(final long interval) {
4660 _checkpointIntervalNanos = interval;
4661 }
4662
4663@@ -159,19 +158,19 @@
4664 }
4665
4666 @Override
4667- public void setCheckpointInterval(long interval) {
4668+ public void setCheckpointInterval(final long interval) {
4669 Util.rangeCheck(interval, MINIMUM_CHECKPOINT_INTERVAL, MAXIMUM_CHECKPOINT_INTERVAL);
4670 _checkpointIntervalNanos = interval * NS_PER_S;
4671 }
4672-
4673+
4674 @Override
4675- public synchronized int getOutstandingCheckpointCount() {
4676+ public synchronized int getOutstandingCheckpointCount() {
4677 return _outstandingCheckpoints.size();
4678 }
4679-
4680+
4681 @Override
4682 public synchronized String outstandingCheckpointReport() {
4683- StringBuilder sb = new StringBuilder();
4684+ final StringBuilder sb = new StringBuilder();
4685 for (final Checkpoint cp : _outstandingCheckpoints) {
4686 sb.append(cp);
4687 sb.append(Util.NEW_LINE);
4688@@ -180,7 +179,7 @@
4689 }
4690
4691 Checkpoint checkpoint() throws PersistitException {
4692- Checkpoint checkpoint = createCheckpoint();
4693+ final Checkpoint checkpoint = createCheckpoint();
4694 _persistit.flushBuffers(checkpoint.getTimestamp());
4695
4696 while (true) {
4697@@ -202,6 +201,7 @@
4698 void pollCreateCheckpoint() throws PersistitException {
4699 final long now = System.nanoTime();
4700 if (_lastCheckpointNanos + _checkpointIntervalNanos < now) {
4701+ _persistit.recordBufferPoolInventory();
4702 createCheckpoint();
4703 }
4704 }
4705@@ -239,26 +239,26 @@
4706 final SessionId saveSessionId = _persistit.getSessionId();
4707 try {
4708 _persistit.setSessionId(_checkpointTxnSessionId);
4709- Transaction txn = _persistit.getTransaction();
4710+ final Transaction txn = _persistit.getTransaction();
4711
4712 _lastCheckpointNanos = System.nanoTime();
4713
4714 txn.beginCheckpoint();
4715 try {
4716 _persistit.flushTransactions(txn.getStartTimestamp());
4717- List<Accumulator> accumulators = _persistit.getCheckpointAccumulators();
4718+ final List<Accumulator> accumulators = _persistit.getCheckpointAccumulators();
4719 _persistit.getTransactionIndex().checkpointAccumulatorSnapshots(txn.getStartTimestamp(), accumulators);
4720 Accumulator.saveAccumulatorCheckpointValues(accumulators);
4721 txn.commit(CommitPolicy.HARD);
4722 _currentCheckpoint = new Checkpoint(txn.getStartTimestamp(), System.currentTimeMillis());
4723 _outstandingCheckpoints.add(_currentCheckpoint);
4724 _persistit.getLogBase().checkpointProposed.log(_currentCheckpoint);
4725- return _currentCheckpoint;
4726- } catch (InterruptedException ie) {
4727+ } catch (final InterruptedException ie) {
4728 throw new PersistitInterruptedException(ie);
4729 } finally {
4730 txn.end();
4731 }
4732+ return _currentCheckpoint;
4733 } finally {
4734 _persistit.setSessionId(saveSessionId);
4735 }
4736@@ -272,9 +272,9 @@
4737 void pollFlushCheckpoint() {
4738 final long earliestDirtyTimestamp = _persistit.earliestDirtyTimestamp();
4739 Checkpoint checkpoint = null;
4740- synchronized(this) {
4741+ synchronized (this) {
4742 while (!_outstandingCheckpoints.isEmpty()) {
4743- Checkpoint cp = _outstandingCheckpoints.get(0);
4744+ final Checkpoint cp = _outstandingCheckpoints.get(0);
4745 if (cp.getTimestamp() <= earliestDirtyTimestamp) {
4746 checkpoint = cp;
4747 _outstandingCheckpoints.remove(0);
4748@@ -286,7 +286,7 @@
4749 if (checkpoint != null) {
4750 try {
4751 _persistit.getJournalManager().writeCheckpointToJournal(checkpoint);
4752- } catch (PersistitException e) {
4753+ } catch (final PersistitException e) {
4754 _persistit.getLogBase().exception.log(e);
4755 }
4756 }
4757
4758=== modified file 'src/main/java/com/persistit/ClassIndex.java'
4759--- src/main/java/com/persistit/ClassIndex.java 2012-08-02 04:45:28 +0000
4760+++ src/main/java/com/persistit/ClassIndex.java 2012-08-24 18:21:22 +0000
4761@@ -71,8 +71,8 @@
4762 INITIAL_CAPACITY);
4763
4764 private int _testIdFloor = Integer.MIN_VALUE;
4765- private AtomicInteger _cacheMisses = new AtomicInteger();
4766- private AtomicInteger _discardedDuplicates = new AtomicInteger();
4767+ private final AtomicInteger _cacheMisses = new AtomicInteger();
4768+ private final AtomicInteger _discardedDuplicates = new AtomicInteger();
4769
4770 /**
4771 * A structure holding a ClassInfo, plus links to other related
4772@@ -82,7 +82,7 @@
4773 final ClassInfoEntry _next;
4774 final ClassInfo _classInfo;
4775
4776- ClassInfoEntry(ClassInfo ci, ClassInfoEntry next) {
4777+ ClassInfoEntry(final ClassInfo ci, final ClassInfoEntry next) {
4778 _classInfo = ci;
4779 _next = next;
4780 }
4781@@ -95,7 +95,7 @@
4782 * @param persistit
4783 * Owning Persistit instance.
4784 */
4785- ClassIndex(Persistit persistit) {
4786+ ClassIndex(final Persistit persistit) {
4787 _persistit = persistit;
4788 }
4789
4790@@ -117,8 +117,8 @@
4791 * The handle
4792 * @return The associated ClassInfo, or <i>null</i> if there is none.
4793 */
4794- public ClassInfo lookupByHandle(int handle) {
4795- AtomicReferenceArray<ClassInfoEntry> hashTable = _hashTable;
4796+ public ClassInfo lookupByHandle(final int handle) {
4797+ final AtomicReferenceArray<ClassInfoEntry> hashTable = _hashTable;
4798 ClassInfoEntry cie = hashTable.get(handle % hashTable.length());
4799 while (cie != null) {
4800 if (cie._classInfo.getHandle() == handle)
4801@@ -138,43 +138,44 @@
4802 try {
4803 ex.clear().append(BY_HANDLE).append(handle).fetch();
4804 txn.commit();
4805- } catch (Exception e) {
4806+ } catch (final Exception e) {
4807 _persistit.getLogBase().exception.log(e);
4808 throw new ConversionException(e);
4809 } finally {
4810 txn.end();
4811 }
4812- Value value = ex.getValue();
4813+ final Value value = ex.getValue();
4814 if (value.isDefined()) {
4815 value.setStreamMode(true);
4816- int storedId = value.getInt();
4817- String storedName = value.getString();
4818- long storedSuid = value.getLong();
4819+ final int storedId = value.getInt();
4820+ final String storedName = value.getString();
4821+ final long storedSuid = value.getLong();
4822 if (storedId != handle) {
4823 throw new IllegalStateException("ClassInfo stored for handle=" + handle
4824 + " has invalid stored handle=" + storedId);
4825 }
4826- Class<?> cl = Class.forName(storedName, false, Thread.currentThread().getContextClassLoader());
4827+ final Class<?> cl = Class
4828+ .forName(storedName, false, Thread.currentThread().getContextClassLoader());
4829
4830 long suid = 0;
4831- ObjectStreamClass osc = ObjectStreamClass.lookupAny(cl);
4832+ final ObjectStreamClass osc = ObjectStreamClass.lookupAny(cl);
4833 if (osc != null)
4834 suid = osc.getSerialVersionUID();
4835 if (storedSuid != suid) {
4836 throw new ConversionException("Class " + cl.getName() + " persistent SUID=" + storedSuid
4837 + " does not match current class SUID=" + suid);
4838 }
4839- ClassInfo ci = new ClassInfo(cl, suid, handle, osc);
4840+ final ClassInfo ci = new ClassInfo(cl, suid, handle, osc);
4841 hashClassInfo(ci);
4842 return ci;
4843 } else {
4844- ClassInfo ci = new ClassInfo(null, 0, handle, null);
4845+ final ClassInfo ci = new ClassInfo(null, 0, handle, null);
4846 hashClassInfo(ci);
4847 return ci;
4848 }
4849- } catch (ClassNotFoundException cnfe) {
4850+ } catch (final ClassNotFoundException cnfe) {
4851 throw new ConversionException(cnfe);
4852- } catch (PersistitException pe) {
4853+ } catch (final PersistitException pe) {
4854 throw new ConversionException(pe);
4855 } finally {
4856 if (ex != null)
4857@@ -191,13 +192,13 @@
4858 * The <code>Class</code>
4859 * @return The ClassInfo for the specified Class.
4860 */
4861- public ClassInfo lookupByClass(Class<?> clazz) {
4862- AtomicReferenceArray<ClassInfoEntry> hashTable = _hashTable;
4863+ public ClassInfo lookupByClass(final Class<?> clazz) {
4864+ final AtomicReferenceArray<ClassInfoEntry> hashTable = _hashTable;
4865
4866 ObjectStreamClass osc = null;
4867 long suid = 0;
4868
4869- int nh = clazz.getName().hashCode() & 0x7FFFFFFF;
4870+ final int nh = clazz.getName().hashCode() & 0x7FFFFFFF;
4871 ClassInfoEntry cie = hashTable.get(nh % hashTable.length());
4872
4873 while (cie != null) {
4874@@ -260,14 +261,14 @@
4875 final int handle;
4876 txn.begin();
4877 ex.clear().append(BY_NAME).append(clazz.getName()).append(suid).fetch();
4878- Value value = ex.getValue();
4879+ final Value value = ex.getValue();
4880 try {
4881 if (value.isDefined()) {
4882 value.setStreamMode(true);
4883
4884 handle = value.getInt();
4885- String storedName = value.getString();
4886- long storedSuid = value.getLong();
4887+ final String storedName = value.getString();
4888+ final long storedSuid = value.getLong();
4889
4890 if (storedSuid != suid || !clazz.getName().equals(storedName)) {
4891 throw new ConversionException("Class " + clazz.getName() + " persistent SUID=" + storedSuid
4892@@ -301,7 +302,7 @@
4893 } finally {
4894 txn.end();
4895 }
4896- } catch (PersistitException pe) {
4897+ } catch (final PersistitException pe) {
4898 throw new ConversionException(pe);
4899 } finally {
4900 if (ex != null) {
4901@@ -322,16 +323,16 @@
4902 * @param clazz
4903 * Class instance to register.
4904 */
4905- public void registerClass(Class<?> clazz) {
4906+ public void registerClass(final Class<?> clazz) {
4907 lookupByClass(clazz);
4908 }
4909
4910- private void hashClassInfo(ClassInfo ci) {
4911- int size = _size.get();
4912+ private void hashClassInfo(final ClassInfo ci) {
4913+ final int size = _size.get();
4914 if (size * EXTRA_FACTOR > _hashTable.length()) {
4915- int discarded = _discardedDuplicates.get();
4916- AtomicReferenceArray<ClassInfoEntry> newHashTable = new AtomicReferenceArray<ClassInfoEntry>(EXTRA_FACTOR
4917- * 2 * size);
4918+ final int discarded = _discardedDuplicates.get();
4919+ final AtomicReferenceArray<ClassInfoEntry> newHashTable = new AtomicReferenceArray<ClassInfoEntry>(
4920+ EXTRA_FACTOR * 2 * size);
4921 for (int i = 0; i < _hashTable.length(); i++) {
4922 ClassInfoEntry cie = _hashTable.get(i);
4923 while (cie != null) {
4924@@ -345,7 +346,7 @@
4925 addHashEntry(_hashTable, ci);
4926 }
4927
4928- private void addHashEntry(final AtomicReferenceArray<ClassInfoEntry> hashTable, ClassInfo ci) {
4929+ private void addHashEntry(final AtomicReferenceArray<ClassInfoEntry> hashTable, final ClassInfo ci) {
4930 final int hh = ci.getHandle() % hashTable.length();
4931 final int nh = ci.getDescribedClass() == null ? -1
4932 : ((ci.getDescribedClass().getName().hashCode() & 0x7FFFFFFF) % hashTable.length());
4933@@ -358,7 +359,8 @@
4934 }
4935 }
4936
4937- private boolean addHashEntry(final AtomicReferenceArray<ClassInfoEntry> hashTable, ClassInfo ci, final int hash) {
4938+ private boolean addHashEntry(final AtomicReferenceArray<ClassInfoEntry> hashTable, final ClassInfo ci,
4939+ final int hash) {
4940 ClassInfoEntry cie = hashTable.get(hash);
4941 while (cie != null) {
4942 if (ci.equals(cie._classInfo)) {
4943@@ -367,7 +369,7 @@
4944 cie = cie._next;
4945 }
4946 cie = hashTable.get(hash);
4947- ClassInfoEntry newCie = new ClassInfoEntry(ci, cie);
4948+ final ClassInfoEntry newCie = new ClassInfoEntry(ci, cie);
4949 hashTable.set(hash, newCie);
4950 _size.incrementAndGet();
4951 return true;
4952@@ -375,14 +377,14 @@
4953
4954 private Exchange getExchange() throws PersistitException {
4955 try {
4956- Volume volume = _persistit.getSystemVolume();
4957+ final Volume volume = _persistit.getSystemVolume();
4958 return _persistit.getExchange(volume, CLASS_INDEX_TREE_NAME, true);
4959- } catch (PersistitException pe) {
4960+ } catch (final PersistitException pe) {
4961 throw new ConversionException(pe);
4962 }
4963 }
4964
4965- private void releaseExchange(Exchange ex) {
4966+ private void releaseExchange(final Exchange ex) {
4967 _persistit.releaseExchange(ex);
4968 }
4969
4970
4971=== modified file 'src/main/java/com/persistit/ClassInfo.java'
4972--- src/main/java/com/persistit/ClassInfo.java 2012-08-02 04:45:28 +0000
4973+++ src/main/java/com/persistit/ClassInfo.java 2012-08-24 18:21:22 +0000
4974@@ -24,21 +24,22 @@
4975 */
4976
4977 class ClassInfo {
4978- private Class<?> _class;
4979- private long _suid;
4980- private int _handle;
4981- private ObjectStreamClass _osc;
4982+ private final Class<?> _class;
4983+ private final long _suid;
4984+ private final int _handle;
4985+ private final ObjectStreamClass _osc;
4986
4987- ClassInfo(Class<?> cl, long suid, int handle, ObjectStreamClass osc) {
4988+ ClassInfo(final Class<?> cl, final long suid, final int handle, final ObjectStreamClass osc) {
4989 _class = cl;
4990 _suid = suid;
4991 _handle = handle;
4992 _osc = osc;
4993 }
4994
4995+ @Override
4996 public boolean equals(final Object object) {
4997 if (object instanceof ClassInfo) {
4998- ClassInfo ci = (ClassInfo) object;
4999+ final ClassInfo ci = (ClassInfo) object;
5000 if (equals(_class, ci._class) && _handle == ci._handle && _suid == ci._suid) {
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches