in oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/PersistentCache.java [101:217]
public PersistentCache(String url) {
LOG.info("start, url={}", url);
String[] parts = url.split(",");
String dir = parts[0];
String broadcast = "disabled";
for (String p : parts) {
if (p.equals("+docs")) {
logUnsupportedWarning("docs");
} else if (p.equals("-prevDocs")) {
cachePrevDocs = false;
} else if (p.equals("+docChildren")) {
logUnsupportedWarning("docChildren");
} else if (p.equals("-nodes")) {
cacheNodes = false;
} else if (p.equals("-children")) {
cacheChildren = false;
} else if (p.equals("-diff")) {
cacheDiff = false;
} else if (p.equals("-localDiff")) {
cacheLocalDiff = false;
} else if (p.equals("+all")) {
logUnsupportedWarning("all");
} else if (p.equals("-compact")) {
compactOnClose = false;
} else if (p.equals("+compact")) {
compactOnClose = true;
} else if (p.equals("-compress")) {
compress = false;
} else if (p.endsWith("time")) {
dir += "-" + System.currentTimeMillis() + "-" + COUNTER.getAndIncrement();
} else if (p.startsWith("size=")) {
maxSizeMB = Integer.parseInt(p.split("=")[1]);
} else if (p.startsWith("memCache=")) {
memCache = Integer.parseInt(p.split("=")[1]);
} else if (p.startsWith("binary=")) {
logUnsupportedWarning("binary");
} else if (p.startsWith("autoCompact=")) {
autoCompact = Integer.parseInt(p.split("=")[1]);
} else if (p.equals("appendOnly")) {
appendOnly = true;
} else if (p.equals("manualCommit")) {
manualCommit = true;
} else if (p.startsWith("broadcast=")) {
broadcast = p.split("=")[1];
} else if (p.equals("-async")) {
asyncCache = false;
} else if (p.equals("+asyncDiff")) {
asyncDiffCache = true;
}
}
this.directory = dir;
if (dir.length() == 0) {
readGeneration = -1;
writeGeneration = 0;
writeStore = createMapFactory(writeGeneration, false);
return;
}
File dr = new File(dir);
if (!dr.exists()) {
dr.mkdirs();
}
if (dr.exists() && !dr.isDirectory()) {
throw new IllegalArgumentException("A file exists at cache directory " + dir);
}
File[] list = dr.listFiles();
TreeSet<Integer> generations = new TreeSet<Integer>();
if (list != null) {
for (File f : list) {
String fn = f.getName();
if (fn.startsWith(FILE_PREFIX) && fn.endsWith(FILE_SUFFIX)) {
String g = fn.substring(FILE_PREFIX.length(), fn.indexOf(FILE_SUFFIX));
try {
int gen = Integer.parseInt(g);
if (gen >= 0) {
File f2 = new File(getFileName(gen));
if (fn.equals(f2.getName())) {
// ignore things like "cache-000.data"
generations.add(gen);
}
}
} catch (Exception e) {
// ignore this file
}
}
}
}
while (generations.size() > 2) {
Integer oldest = generations.first();
File oldFile = new File(getFileName(oldest));
if (!oldFile.canWrite()) {
LOG.info("Ignoring old, read-only generation " + oldFile.getAbsolutePath());
} else {
LOG.info("Removing old generation " + oldFile.getAbsolutePath());
oldFile.delete();
}
generations.remove(oldest);
}
try {
readGeneration = generations.size() > 1 ? generations.first() : -1;
writeGeneration = generations.size() > 0 ? generations.last() : 0;
if (readGeneration >= 0) {
readStore = createMapFactory(readGeneration, true);
}
writeStore = createMapFactory(writeGeneration, false);
initBroadcast(broadcast);
writeDispatcher = new CacheActionDispatcher();
writeDispatcherThread = new Thread(writeDispatcher, "Oak CacheWriteQueue");
writeDispatcherThread.setDaemon(true);
writeDispatcherThread.start();
} catch (RuntimeException ex) {
// OAK-8052: cleanup stores in case of failure
LOG.error("Exception during PersistentCache instantiation for {}.", url);
close();
}
}