Merge lp:~nfernandez/akiban-persistit/persistit-warmup-capability into lp:akiban-persistit

Proposed by Nohemi Fernandez
Status: Merged
Approved by: Peter Beaman
Approved revision: 363
Merged at revision: 352
Proposed branch: lp:~nfernandez/akiban-persistit/persistit-warmup-capability
Merge into: lp:akiban-persistit
Diff against target: 438 lines (+259/-11)
6 files modified
src/main/java/com/persistit/BufferPool.java (+114/-9)
src/main/java/com/persistit/Configuration.java (+66/-1)
src/main/java/com/persistit/Persistit.java (+10/-0)
src/test/java/com/persistit/WarmupTest.java (+66/-0)
src/test/java/com/persistit/unit/PersistitUnitTestCase.java (+2/-1)
src/test/java/com/persistit/unit/UnitTestProperties.java (+1/-0)
To merge this branch: bzr merge lp:~nfernandez/akiban-persistit/persistit-warmup-capability
Reviewer Review Type Date Requested Status
Peter Beaman Approve
Nohemi Fernandez (community) Needs Resubmitting
Review via email: mp+117780@code.launchpad.net

Description of the change

Optimization: Creates a file of sample page data to insert into the next 'cold' start of Persistit.

To post a comment you must log in.
Revision history for this message
Nohemi Fernandez (nfernandez) wrote :

Some optimizations to consider for this branch:

1. Add checks for corrupt files
2. Store temporary back-up file of data in case of a system crash
3. Define names for multiple buffer pools-- this will be implemented if we switch from the current file I/O implementation to one using Exchange objects.

356. By Nohemi Fernandez

revert changes to irrelevant files

357. By Nohemi Fernandez

merge from trunk

358. By Nohemi Fernandez

clean-up diff

Revision history for this message
Peter Beaman (pbeaman) wrote :

I've been thinking some more about the general problem and have some suggestions.

This version represents good progress. It passes all tests and makes the warmup process optional.

Here are some additional issues I'd like to address, perhaps over time:

Writing the buffer pool inventory should be optional. I suggest using the same configuration property, isBufferWarmupEnabled(), to control the polling action. I also think we might be able to put the inventory-writing activity on the CHECKPOINT_MANAGER thread since it does work only about once every two minutes. The Javadoc for setBufferWarmupEnabled(boolean) says the property is settable from the Management class. We would want to actually make it so.

When we load a large buffer pool, say 1M pages of 16Kb each (which we already have on largish machines) it will be important to optimize the order in which these are read to reduce physical I/O delays. About the best we can do is to read pages in file offset order which is approximately linear with page address order - "approximately" because some pages may be read from the journal instead of the volume file. We probably want to sort the list of pages being read by physical file address order before reading anything.

We may benefit from repopulating the BufferPool in "clock" order. This will generally not be the same order in which we load the pages. The idea would be to read the pages in physical file order but put them in the _buffers array in an order that approximates their distance from the "clock" pointer at the time the inventory was taken. To do this we'll need a method other than BufferPool#get(...) to read and install the pages. I'm giving this some thought and will probably propose something later. We can do without this for now.

I wonder if there is any benefit in reloading only pages that have been in the BufferPool for awhile. For example, if we inventory the BufferPool during a data load operating we'll record lots of pages in the warmup file that when reloaded will never be used again. One possibility is to snapshot the inventory somewhat more frequently, say once per minute, and only include pages that have been in place for two or three cycles.

Small detail - should have brought this up earlier. Each Volume in the BufferPool has a small integer handle available through Volume#getHandle(). This is a good alternative to recording the volume name.

Finally, we can't put this in trunk without resolving where the warmup file goes; clearly we can't keep it in a fixed location in the /tmp directory. I think if we can resolve the file location, make the writing of the file optional through configuration, fix the Javadoc for setBufferWarmupEnabled not to refer to a method that currently does not exist in Management, we could probably merge this and at least try it in some of our bigger tests.

359. By Nohemi Fernandez

change configuration property for buffer pools

360. By Nohemi Fernandez

add configuration setting for warm-up polling time

Revision history for this message
Nohemi Fernandez (nfernandez) wrote :

I added configuration properties for the buffer pool warm-up as follows:
1. "bufferinventory" --> path name where buffer pool information will be stored, if null then pool does not get warmed up
2. "bufferpollinginterval" -> number of seconds for polling

review: Needs Resubmitting
Revision history for this message
Peter Beaman (pbeaman) wrote :

Does the PAGE_CACHER thread try to call populateWarmuFile using a path of null when? I didn't see logic to disable the thread when the bufferinventoryfile property is missing.

review: Needs Information
Revision history for this message
Nohemi Fernandez (nfernandez) wrote :

316 + if (_configuration.getBufferInventoryPathName() != null) {
317 + warmupBufferPools();
318 + }

The page cacher thread is not started unless the above method is called, so the path in BufferPool is unnecessary (null) if there is no path name in the configuration.

Revision history for this message
Peter Beaman (pbeaman) wrote :

Suggestions:

- Merge from trunk
- Range-check the buffer poll interval - buffer inventory poll interval. Decide and document in javadoc whether it is specified in ms, seconds or minutes.
- Move property from PersistitUnitTestCase to UnitTestProperties

361. By Nohemi Fernandez

range check buffer inventory poll interval

362. By Nohemi Fernandez

merge from trunk

363. By Nohemi Fernandez

update WarmupTest header

Revision history for this message
Nohemi Fernandez (nfernandez) wrote :

Suggestions followed.

review: Needs Resubmitting
Revision history for this message
Peter Beaman (pbeaman) wrote :

Looks okay to me. Thanks for the changes.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/main/java/com/persistit/BufferPool.java'
--- src/main/java/com/persistit/BufferPool.java 2012-08-04 19:19:44 +0000
+++ src/main/java/com/persistit/BufferPool.java 2012-08-07 21:14:18 +0000
@@ -16,7 +16,6 @@
16package com.persistit;16package com.persistit;
1717
18import java.io.DataOutputStream;18import java.io.DataOutputStream;
19import java.io.IOException;
20import java.nio.ByteBuffer;19import java.nio.ByteBuffer;
21import java.util.Arrays;20import java.util.Arrays;
22import java.util.HashSet;21import java.util.HashSet;
@@ -37,6 +36,7 @@
37import com.persistit.exception.VolumeClosedException;36import com.persistit.exception.VolumeClosedException;
38import com.persistit.util.Debug;37import com.persistit.util.Debug;
39import com.persistit.util.Util;38import com.persistit.util.Util;
39import java.io.*;
4040
41/**41/**
42 * A pool of {@link Buffer} objects, maintained on various lists that permit42 * A pool of {@link Buffer} objects, maintained on various lists that permit
@@ -52,7 +52,7 @@
52 private final static long DEFAULT_WRITER_POLL_INTERVAL = 5000;52 private final static long DEFAULT_WRITER_POLL_INTERVAL = 5000;
5353
54 private final static int PAGE_WRITER_TRANCHE_SIZE = 5000;54 private final static int PAGE_WRITER_TRANCHE_SIZE = 5000;
5555
56 /**56 /**
57 * Sleep time when buffers are exhausted57 * Sleep time when buffers are exhausted
58 */58 */
@@ -196,11 +196,24 @@
196 private volatile long _writerPollInterval = DEFAULT_WRITER_POLL_INTERVAL;196 private volatile long _writerPollInterval = DEFAULT_WRITER_POLL_INTERVAL;
197197
198 private volatile int _pageWriterTrancheSize = PAGE_WRITER_TRANCHE_SIZE;198 private volatile int _pageWriterTrancheSize = PAGE_WRITER_TRANCHE_SIZE;
199
200 /**
201 * Polling interval for PageCacher
202 */
203 private volatile long _cacherPollInterval;
204
199 /**205 /**
200 * The PAGE_WRITER IOTaskRunnable206 * The PAGE_WRITER IOTaskRunnable
201 */207 */
202 private PageWriter _writer;208 private PageWriter _writer;
203209
210 /**
211 * The PAGE_CACHER IOTaskRunnable
212 */
213 private PageCacher _cacher;
214
215 private String _defaultLogPath;
216
204 /**217 /**
205 * Construct a BufferPool with the specified count of <code>Buffer</code>s218 * Construct a BufferPool with the specified count of <code>Buffer</code>s
206 * of the specified size.219 * of the specified size.
@@ -237,7 +250,7 @@
237 _hashTable = new Buffer[_bufferCount * HASH_MULTIPLE];250 _hashTable = new Buffer[_bufferCount * HASH_MULTIPLE];
238 _hashLocks = new ReentrantLock[HASH_LOCKS];251 _hashLocks = new ReentrantLock[HASH_LOCKS];
239 _maxKeys = (_bufferSize - Buffer.HEADER_SIZE) / Buffer.MAX_KEY_RATIO;252 _maxKeys = (_bufferSize - Buffer.HEADER_SIZE) / Buffer.MAX_KEY_RATIO;
240253
241 for (int index = 0; index < HASH_LOCKS; index++) {254 for (int index = 0; index < HASH_LOCKS; index++) {
242 _hashLocks[index] = new ReentrantLock();255 _hashLocks[index] = new ReentrantLock();
243 }256 }
@@ -271,25 +284,59 @@
271 throw e;284 throw e;
272 }285 }
273 _writer = new PageWriter();286 _writer = new PageWriter();
274287 _cacher = new PageCacher();
275 }288 }
276289
277 void startThreads() {290 void warmupBufferPool(String pathName, String fname) throws PersistitException {
291 File file = new File(pathName, fname + ".log");
292 _defaultLogPath = file.getAbsolutePath();
293
294 try {
295 if (!file.exists()) {
296 file.createNewFile();
297 }
298
299 BufferedReader reader = new BufferedReader(new FileReader(file));
300 String currLine;
301 while ((currLine = reader.readLine()) != null) {
302 String[] info = currLine.split(" ");
303 if (info.length == 2) {
304 Volume vol = _persistit.getVolume(info[1]);
305 if (vol != null) {
306 long page = Long.parseLong(info[0]);
307 Buffer buff = get(vol, page, false, true);
308 buff.release();
309 }
310 }
311 }
312 reader.close();
313 _cacherPollInterval = _persistit.getConfiguration().getBufferInventoryPollingInterval();
314 _cacher.start();
315 }
316 catch (IOException e) {
317 throw new PersistitException(e);
318 }
319 }
320
321 void startThreads() throws PersistitException {
278 _writer.start();322 _writer.start();
279 }323 }
280324
281 void close() {325 void close() {
282 _closed.set(true);326 _closed.set(true);
283 _persistit.waitForIOTaskStop(_writer);327 _persistit.waitForIOTaskStop(_writer);
328 _persistit.waitForIOTaskStop(_cacher);
284 _writer = null;329 _writer = null;
330 _cacher = null;
285 }331 }
286332
287 /**333 /**
288 * Abruptly stop (using {@link Thread#stop()}) the writer and collector334 * Abruptly stop (using {@link Thread#stop()}) the writer, cacher, and collector
289 * threads. This method should be used only by tests.335 * threads. This method should be used only by tests.
290 */336 */
291 void crash() {337 void crash() {
292 IOTaskRunnable.crash(_writer);338 IOTaskRunnable.crash(_writer);
339 IOTaskRunnable.crash(_cacher);
293 }340 }
294341
295 void flush(final long timestamp) throws PersistitInterruptedException {342 void flush(final long timestamp) throws PersistitInterruptedException {
@@ -380,6 +427,35 @@
380 buffer.populateInfo(array[index]);427 buffer.populateInfo(array[index]);
381 }428 }
382 }429 }
430
431 private void populateWarmupFile() throws PersistitException {
432 File file = new File(_defaultLogPath);
433
434 try {
435 BufferedWriter writer = new BufferedWriter(new FileWriter(file));
436 for (int i = 0; i < _buffers.length; ++i) {
437 Buffer b = _buffers[i];
438 if (b != null && b.isValid() && !b.isDirty()) {
439 long page = b.getPageAddress();
440 Volume volume = b.getVolume();
441 long page2 = b.getPageAddress();
442 Volume volume2 = b.getVolume();
443
444 // Check if buffer has changed while reading
445 if (page == page2 && volume == volume2 && volume != null) {
446 String addr = Long.toString(page);
447 String vol = volume.getName();
448 writer.append(addr + " " + vol);
449 writer.newLine();
450 writer.flush();
451 }
452 }
453 }
454 writer.close();
455 } catch (IOException e) {
456 throw new PersistitException(e);
457 }
458 }
383459
384 private boolean selected(Buffer buffer, int includeMask, int excludeMask) {460 private boolean selected(Buffer buffer, int includeMask, int excludeMask) {
385 return ((includeMask == 0) || (buffer.getStatus() & includeMask) != 0)461 return ((includeMask == 0) || (buffer.getStatus() & includeMask) != 0)
@@ -1315,6 +1391,35 @@
1315 return isFlushing() ? 0 : _writerPollInterval;1391 return isFlushing() ? 0 : _writerPollInterval;
1316 }1392 }
1317 }1393 }
1394
1395 /**
1396 * Implementation of PAGE_CACHER thread
1397 */
1398 class PageCacher extends IOTaskRunnable {
1399
1400 PageCacher() {
1401 super(BufferPool.this._persistit);
1402 }
1403
1404 void start() {
1405 start("PAGE_CACHER:" + _bufferSize, _cacherPollInterval);
1406 }
1407
1408 @Override
1409 public void runTask() throws Exception {
1410 populateWarmupFile();
1411 }
1412
1413 @Override
1414 protected boolean shouldStop() {
1415 return _closed.get() && !isFlushing();
1416 }
1417
1418 @Override
1419 protected long pollInterval() {
1420 return isFlushing() ? 0 : _cacherPollInterval;
1421 }
1422 }
13181423
1319 @Override1424 @Override
1320 public String toString() {1425 public String toString() {
13211426
=== modified file 'src/main/java/com/persistit/Configuration.java'
--- src/main/java/com/persistit/Configuration.java 2012-08-02 14:19:26 +0000
+++ src/main/java/com/persistit/Configuration.java 2012-08-07 21:14:18 +0000
@@ -264,15 +264,23 @@
264 * Property name for the "append only" property.264 * Property name for the "append only" property.
265 */265 */
266 public final static String APPEND_ONLY_PROPERTY = "appendonly";266 public final static String APPEND_ONLY_PROPERTY = "appendonly";
267267
268 /**268 /**
269 * Property name for the "ignore missing volumes" property.269 * Property name for the "ignore missing volumes" property.
270 */270 */
271 public final static String IGNORE_MISSING_VOLUMES_PROPERTY = "ignoremissingvolumes";271 public final static String IGNORE_MISSING_VOLUMES_PROPERTY = "ignoremissingvolumes";
272
272 /**273 /**
273 * Property name to specify the default {@link SplitPolicy}.274 * Property name to specify the default {@link SplitPolicy}.
274 */275 */
275 public final static String SPLIT_POLICY_PROPERTY_NAME = "splitpolicy";276 public final static String SPLIT_POLICY_PROPERTY_NAME = "splitpolicy";
277
278 /**
279 * Property name to specify the"buffer inventory" property name.
280 */
281 public final static String BUFFER_INVENTORY_PROPERTY_NAME = "bufferinventory";
282
283 public final static String BUFFER_POLLING_INTERVAL_PROPERTY = "bufferpollinginterval";
276284
277 /**285 /**
278 * Property name to specify the default {@link JoinPolicy}.286 * Property name to specify the default {@link JoinPolicy}.
@@ -624,6 +632,8 @@
624 private int rmiServerPort;632 private int rmiServerPort;
625 private boolean jmx = true;633 private boolean jmx = true;
626 private boolean appendOnly;634 private boolean appendOnly;
635 private String bufferInventoryPathName;
636 private long bufferInventoryPollInterval = 3000000; // default five minute polling
627 private boolean ignoreMissingVolumes;637 private boolean ignoreMissingVolumes;
628 private String tmpVolDir;638 private String tmpVolDir;
629 private int tmpVolPageSize;639 private int tmpVolPageSize;
@@ -702,6 +712,8 @@
702 }712 }
703713
704 void loadProperties() throws InvalidVolumeSpecificationException {714 void loadProperties() throws InvalidVolumeSpecificationException {
715 setBufferInventoryPathName(getProperty(BUFFER_INVENTORY_PROPERTY_NAME));
716 setBufferInventoryPollingInterval(getLongProperty(BUFFER_POLLING_INTERVAL_PROPERTY, bufferInventoryPollInterval));
705 setAppendOnly(getBooleanProperty(APPEND_ONLY_PROPERTY, false));717 setAppendOnly(getBooleanProperty(APPEND_ONLY_PROPERTY, false));
706 setCommitPolicy(getProperty(COMMIT_POLICY_PROPERTY_NAME));718 setCommitPolicy(getProperty(COMMIT_POLICY_PROPERTY_NAME));
707 setConstructorOverride(getBooleanProperty(CONSTRUCTOR_OVERRIDE_PROPERTY_NAME, false));719 setConstructorOverride(getBooleanProperty(CONSTRUCTOR_OVERRIDE_PROPERTY_NAME, false));
@@ -1802,6 +1814,59 @@
1802 }1814 }
18031815
1804 /**1816 /**
1817 * Return the path name defined by {@link #getBufferInventoryPathName}
1818 * @return the path where file to warm-up Persistit with sample buffer data is stored
1819 */
1820 public String getBufferInventoryPathName() {
1821 return bufferInventoryPathName;
1822 }
1823
1824 /**
1825 * <p>
1826 * Control where Persistit stores its buffer inventory. In this mode
1827 * Persistit restarts with information from the last run. This method initializes
1828 * the warm-up file at the specified location, if none is specified the buffer
1829 * pool is not warmed up on start-up.
1830 * </p>
1831 * <p>
1832 * Default value is <code>null</code><br />
1833 * Property name is {@value #BUFFER_INVENTORY_PROPERTY_NAME}
1834 * </p>
1835 *
1836 * @param pathName
1837 * the name of the path to the warm-up file
1838 */
1839 public void setBufferInventoryPathName(String pathName) {
1840 bufferInventoryPathName = pathName;
1841
1842 }
1843
1844 /**
1845 * Return polling interval defined by {@link #getBufferInventoryPollingInterval}
1846 * @return the number of seconds wait between warm-up polls
1847 */
1848 public long getBufferInventoryPollingInterval() {
1849 return bufferInventoryPollInterval;
1850 }
1851
1852 /**
1853 * <p>
1854 * Control the number of seconds between each poll for the
1855 * cache warm-up option in Persistit.
1856 * </p>
1857 * <p>
1858 * Default value is <code>3000</code><br />
1859 * Property name is {@value #BUFFER_POLLING_INTERVAL_PROPERTY}
1860 * </p>
1861 *
1862 * @param seconds
1863 * the number of seconds between polls
1864 */
1865 public void setBufferInventoryPollingInterval(long seconds) {
1866 bufferInventoryPollInterval = Util.rangeCheck(seconds, 60L, Long.MAX_VALUE) * 1000L;
1867 }
1868
1869 /**
1805 * Return the value defined by {@link #setIgnoreMissingVolumes(boolean)}1870 * Return the value defined by {@link #setIgnoreMissingVolumes(boolean)}
1806 * 1871 *
1807 * @return the whether to start Persistit in ignore-missing-volumes mode1872 * @return the whether to start Persistit in ignore-missing-volumes mode
18081873
=== modified file 'src/main/java/com/persistit/Persistit.java'
--- src/main/java/com/persistit/Persistit.java 2012-08-02 14:19:26 +0000
+++ src/main/java/com/persistit/Persistit.java 2012-08-07 21:14:18 +0000
@@ -589,6 +589,9 @@
589 initializeVolumes();589 initializeVolumes();
590 startJournal();590 startJournal();
591 startBufferPools();591 startBufferPools();
592 if (_configuration.getBufferInventoryPathName() != null) {
593 warmupBufferPools();
594 }
592 finishRecovery();595 finishRecovery();
593 startCheckpointManager();596 startCheckpointManager();
594 startTransactionIndexPollTask();597 startTransactionIndexPollTask();
@@ -716,6 +719,13 @@
716 pool.startThreads();719 pool.startThreads();
717 }720 }
718 }721 }
722
723 void warmupBufferPools() throws PersistitException {
724 String pathName = _configuration.getBufferInventoryPathName();
725 for (final BufferPool pool : _bufferPoolTable.values()) {
726 pool.warmupBufferPool(pathName, pool.toString());
727 }
728 }
719729
720 void startJournal() throws PersistitException {730 void startJournal() throws PersistitException {
721 _journalManager.startJournal();731 _journalManager.startJournal();
722732
=== added file 'src/test/java/com/persistit/WarmupTest.java'
--- src/test/java/com/persistit/WarmupTest.java 1970-01-01 00:00:00 +0000
+++ src/test/java/com/persistit/WarmupTest.java 2012-08-07 21:14:18 +0000
@@ -0,0 +1,66 @@
1/**
2 * Copyright © 2012 Akiban Technologies, Inc. All rights reserved.
3 *
4 * This program and the accompanying materials are made available
5 * under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * This program may also be available under different license terms.
10 * For more information, see www.akiban.com or contact licensing@akiban.com.
11 *
12 * Contributors:
13 * Akiban Technologies, Inc.
14 */
15
16package com.persistit;
17
18import static org.junit.Assert.*;
19import java.util.Properties;
20
21import org.junit.Test;
22
23import com.persistit.unit.PersistitUnitTestCase;
24
25public class WarmupTest extends PersistitUnitTestCase {
26
27 @Test
28 public void testWarmup() throws Exception {
29 Exchange ex = _persistit.getExchange("persistit", "WarmupTest", true);
30 for (int i = 1; i <= 1000; i++) {
31 ex.getValue().put(RED_FOX);
32 ex.clear().append(i).store();
33 }
34
35 // Assumption: only one buffer pool is created
36 int poolCount = 0;
37 String pathName = "";
38 Buffer[] buff = new Buffer[100];
39 for (BufferPool p: _persistit.getBufferPoolHashMap().values()) {
40 poolCount = p.getBufferCount();
41 pathName = p.toString();
42 for (int i = 0; i < poolCount; ++i) {
43 buff[i] = p.getBufferCopy(i);
44 }
45 }
46
47 Properties properties = _persistit.getProperties();
48 ex = null;
49 _persistit.close();
50
51 _persistit = new Persistit();
52 _persistit.initialize(properties);
53
54 int poolCount1 = 0;
55 for (BufferPool p: _persistit.getBufferPoolHashMap().values()) {
56 poolCount1 = p.getBufferCount();
57 for (int i = 0; i < poolCount1; ++i) {
58 Buffer bufferCopy = p.getBufferCopy(i);
59 assertEquals(bufferCopy.getPageAddress(), buff[i].getPageAddress());
60 assertEquals(bufferCopy.getPageType(), buff[i].getPageType());
61 assertEquals(bufferCopy.getBufferSize(), buff[i].getBufferSize());
62 }
63 }
64 assertEquals(poolCount, poolCount1);
65 }
66}
067
=== modified file 'src/test/java/com/persistit/unit/PersistitUnitTestCase.java'
--- src/test/java/com/persistit/unit/PersistitUnitTestCase.java 2012-08-02 04:45:28 +0000
+++ src/test/java/com/persistit/unit/PersistitUnitTestCase.java 2012-08-07 21:14:18 +0000
@@ -53,6 +53,7 @@
53 @Before53 @Before
54 public void setUp() throws Exception {54 public void setUp() throws Exception {
55 checkNoPersistitThreads();55 checkNoPersistitThreads();
56
56 _persistit.initialize(getProperties(true));57 _persistit.initialize(getProperties(true));
57 }58 }
5859
@@ -83,7 +84,7 @@
83 } catch (final Throwable t) {84 } catch (final Throwable t) {
84 t.printStackTrace();85 t.printStackTrace();
85 } finally {86 } finally {
86 tearDown();87 tearDown();
87 }88 }
88 }89 }
8990
9091
=== modified file 'src/test/java/com/persistit/unit/UnitTestProperties.java'
--- src/test/java/com/persistit/unit/UnitTestProperties.java 2012-08-02 04:45:28 +0000
+++ src/test/java/com/persistit/unit/UnitTestProperties.java 2012-08-07 21:14:18 +0000
@@ -43,6 +43,7 @@
43 p.setProperty("tmpvoldir", "${datapath}");43 p.setProperty("tmpvoldir", "${datapath}");
44 p.setProperty("rmiport", System.getProperty("rmiport", "8081"));44 p.setProperty("rmiport", System.getProperty("rmiport", "8081"));
45 p.setProperty("jmx", "true");45 p.setProperty("jmx", "true");
46 p.setProperty("bufferinventory", "/tmp/persistit_test_data");
46 return p;47 return p;
47 }48 }
4849

Subscribers

People subscribed via source and target branches