/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.bookkeeper.bookie;
import org.apache.bookkeeper.conf.ServerConfiguration;
import org.apache.bookkeeper.stats.NullStatsLogger;
import org.apache.bookkeeper.util.SnapshotMap;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import static com.google.common.base.Charsets.UTF_8;
import static org.junit.Assert.*;
/**
* Test cases for IndexPersistenceMgr
*/
public class IndexPersistenceMgrTest {
static final Logger logger = LoggerFactory.getLogger(IndexPersistenceMgr.class);
ServerConfiguration conf;
File journalDir, ledgerDir;
LedgerDirsManager ledgerDirsManager;
@Before
public void setUp() throws Exception {
journalDir = File.createTempFile("IndexPersistenceMgr", "Journal");
journalDir.delete();
journalDir.mkdir();
ledgerDir = File.createTempFile("IndexPersistenceMgr", "Ledger");
ledgerDir.delete();
ledgerDir.mkdir();
// Create current directories
Bookie.getCurrentDirectory(journalDir).mkdir();
Bookie.getCurrentDirectory(ledgerDir).mkdir();
conf = new ServerConfiguration();
conf.setZkServers(null);
conf.setJournalDirName(journalDir.getPath());
conf.setLedgerDirNames(new String[] { ledgerDir.getPath() });
ledgerDirsManager = new LedgerDirsManager(conf, conf.getLedgerDirs());
}
@After
public void tearDown() throws Exception {
ledgerDirsManager.shutdown();
FileUtils.deleteDirectory(journalDir);
FileUtils.deleteDirectory(ledgerDir);
}
private IndexPersistenceMgr createIndexPersistenceManager(int openFileLimit) throws Exception {
ServerConfiguration newConf = new ServerConfiguration();
newConf.addConfiguration(conf);
newConf.setOpenFileLimit(openFileLimit);
return new IndexPersistenceMgr(
newConf.getPageSize(), newConf.getPageSize() / LedgerEntryPage.getIndexEntrySize(),
newConf, new SnapshotMap<Long, Boolean>(), ledgerDirsManager, NullStatsLogger.INSTANCE);
}
private static void getNumFileInfos(IndexPersistenceMgr indexPersistenceMgr,
int numFiles, byte[] masterKey) throws Exception {
for (int i = 0; i < numFiles; i++) {
indexPersistenceMgr.getFileInfo((long) i, masterKey);
}
}
@Test(timeout = 60000)
public void testEvictFileInfoWhenUnderlyingFileExists() throws Exception {
evictFileInfoTest(true);
}
@Test(timeout = 60000)
public void testEvictFileInfoWhenUnderlyingFileDoesntExist() throws Exception {
evictFileInfoTest(false);
}
private void evictFileInfoTest(boolean createFile) throws Exception {
IndexPersistenceMgr indexPersistenceMgr = createIndexPersistenceManager(5);
try {
long lid = 99999L;
byte[] masterKey = "evict-file-info".getBytes(UTF_8);
// get file info and make sure the file created
FileInfo fi = indexPersistenceMgr.getFileInfo(lid, masterKey);
if (createFile) {
fi.checkOpen(true);
}
fi.setFenced();
// fill up the cache to evict file infos
getNumFileInfos(indexPersistenceMgr, 10, masterKey);
// get the file info again, state should have been flushed
fi = indexPersistenceMgr.getFileInfo(lid, masterKey);
assertTrue("Fence bit should be persisted", fi.isFenced());
} finally {
indexPersistenceMgr.close();
}
}
}