1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002,2010 Oracle. All rights reserved.
*
* $Id: RMWLockingTest.java,v 1.9.2.2 2010/01/04 15:30:42 cwl Exp $
*/
package com.sleepycat.je.cleaner;
import java.io.File;
import java.io.IOException;
import junit.framework.TestCase;
import com.sleepycat.bind.tuple.IntegerBinding;
import com.sleepycat.je.CheckpointConfig;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.DbInternal;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;
import com.sleepycat.je.log.FileManager;
import com.sleepycat.je.util.TestUtils;
/**
* Use LockMode.RMW and verify that the FileSummaryLNs accurately reflect only
* those LNs that have been made obsolete.
*/
public class RMWLockingTest extends TestCase {
private static final int NUM_RECS = 5;
private File envHome;
private Environment env;
private Database db;
private DatabaseEntry key;
private DatabaseEntry data;
public RMWLockingTest() {
envHome = new File(System.getProperty(TestUtils.DEST_DIR));
}
public void setUp()
throws IOException, DatabaseException {
TestUtils.removeLogFiles("Setup", envHome, false);
TestUtils.removeFiles("Setup", envHome, FileManager.DEL_SUFFIX);
}
public void tearDown()
throws IOException, DatabaseException {
try {
if (db != null) {
db.close();
}
if (env != null) {
env.close();
}
} catch (Throwable e) {
System.out.println("tearDown: " + e);
}
try {
TestUtils.removeLogFiles("tearDown", envHome, true);
TestUtils.removeFiles("tearDown", envHome, FileManager.DEL_SUFFIX);
} catch (Throwable e) {
System.out.println("tearDown: " + e);
}
db = null;
env = null;
envHome = null;
}
public void testBasic()
throws DatabaseException {
init();
insertRecords();
rmwModify();
UtilizationProfile up =
DbInternal.envGetEnvironmentImpl(env).getUtilizationProfile();
/*
* Checkpoint the environment to flush all utilization tracking
* information before verifying.
*/
CheckpointConfig ckptConfig = new CheckpointConfig();
ckptConfig.setForce(true);
env.checkpoint(ckptConfig);
assertTrue(up.verifyFileSummaryDatabase());
}
/**
* Tests that we can load a log file containing offsets that correspond to
* non-obsolete LNs. The bad log file was created using testBasic run
* against JE 2.0.54. It contains version 1 FSLNs, one of which has an
* offset which is not obsolete.
*/
public void testBadLog()
throws DatabaseException, IOException {
/* Copy a log file with bad offsets to log file zero. */
String resName = "rmw_bad_offsets.jdb";
TestUtils.loadLog(getClass(), resName, envHome);
/* Open the log we just copied. */
EnvironmentConfig envConfig = TestUtils.initEnvConfig();
envConfig.setAllowCreate(false);
envConfig.setReadOnly(true);
env = new Environment(envHome, envConfig);
/*
* Verify the UP of the bad log. Prior to adding the code in
* FileSummaryLN.postFetchInit that discards version 1 offsets, this
* assertion failed.
*/
UtilizationProfile up =
DbInternal.envGetEnvironmentImpl(env).getUtilizationProfile();
assertTrue(up.verifyFileSummaryDatabase());
env.close();
env = null;
}
private void init()
throws DatabaseException {
EnvironmentConfig envConfig = TestUtils.initEnvConfig();
envConfig.setAllowCreate(true);
envConfig.setTransactional(true);
env = new Environment(envHome, envConfig);
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(true);
db = env.openDatabase(null, "foo", dbConfig);
}
/* Insert records. */
private void insertRecords()
throws DatabaseException {
key = new DatabaseEntry();
data = new DatabaseEntry();
IntegerBinding.intToEntry(100, data);
for (int i = 0; i < NUM_RECS; i++) {
IntegerBinding.intToEntry(i, key);
assertEquals(OperationStatus.SUCCESS, db.put(null, key, data));
}
}
/* lock two records with RMW, only modify one. */
private void rmwModify()
throws DatabaseException {
Transaction txn = env.beginTransaction(null, null);
IntegerBinding.intToEntry(0, key);
assertEquals(OperationStatus.SUCCESS,
db.get(txn, key, data, LockMode.RMW));
IntegerBinding.intToEntry(1, key);
assertEquals(OperationStatus.SUCCESS,
db.get(txn, key, data, LockMode.RMW));
IntegerBinding.intToEntry(200, data);
assertEquals(OperationStatus.SUCCESS,
db.put(txn, key, data));
txn.commit();
}
}
|