Author: frm
Date: Fri Feb 3 09:10:07 2017
New Revision: 1781515
URL: http://svn.apache.org/viewvc?rev=1781515&view=rev
Log:
OAK-5572 - Enable instrumentation of I/O operations
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
Fri Feb 3 09:10:07 2017
@@ -37,6 +37,7 @@ import java.util.regex.Pattern;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
+import com.google.common.base.Supplier;
import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
import org.apache.jackrabbit.oak.segment.CachingSegmentReader;
import org.apache.jackrabbit.oak.segment.RecordType;
@@ -56,8 +57,6 @@ import org.apache.jackrabbit.oak.spi.blo
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Supplier;
-
/**
* The storage implementation for tar files.
*/
@@ -120,6 +119,8 @@ public abstract class AbstractFileStore
};
+ protected final IOMonitor ioMonitor;
+
AbstractFileStore(final FileStoreBuilder builder) {
this.directory = builder.getDirectory();
this.tracker = new SegmentTracker();
@@ -132,6 +133,7 @@ public abstract class AbstractFileStore
}
}, blobStore, builder.getStringCacheSize(),
builder.getTemplateCacheSize());
this.memoryMapping = builder.getMemoryMapping();
+ this.ioMonitor = builder.getIOMonitor();
}
File getManifestFile() {
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
Fri Feb 3 09:10:07 2017
@@ -168,7 +168,7 @@ public class FileStore extends AbstractF
private final FileStoreStats stats;
@Nonnull
- private final SegmentNotFoundExceptionListener snfeListener;
+ private final SegmentNotFoundExceptionListener snfeListener;
FileStore(final FileStoreBuilder builder) throws
InvalidFileStoreVersionException, IOException {
super(builder);
@@ -209,7 +209,7 @@ public class FileStore extends AbstractF
Integer[] indices = map.keySet().toArray(new Integer[map.size()]);
Arrays.sort(indices);
for (int i = indices.length - 1; i >= 0; i--) {
- readers.add(TarReader.open(map.get(indices[i]), memoryMapping,
recovery));
+ readers.add(TarReader.open(map.get(indices[i]), memoryMapping,
recovery, ioMonitor));
}
this.stats = new FileStoreStats(builder.getStatsProvider(), this,
size());
@@ -684,7 +684,7 @@ public class FileStore extends AbstractF
File writeFile = tarWriter.getFile();
List<TarReader> list =
newArrayListWithCapacity(1 + readers.size());
- list.add(TarReader.open(writeFile, memoryMapping));
+ list.add(TarReader.open(writeFile, memoryMapping, ioMonitor));
list.addAll(readers);
readers = list;
tarWriter = newWriter;
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
Fri Feb 3 09:10:07 2017
@@ -113,6 +113,8 @@ public class FileStoreBuilder {
@Nonnull
private SegmentNotFoundExceptionListener snfeListener = LOG_SNFE;
+
+ private IOMonitor ioMonitor = new IOMonitorAdapter();
private boolean built;
@@ -283,6 +285,11 @@ public class FileStoreBuilder {
this.snfeListener = checkNotNull(snfeListener);
return this;
}
+
+ public FileStoreBuilder withIOMonitor(IOMonitor ioMonitor) {
+ this.ioMonitor = checkNotNull(ioMonitor);
+ return this;
+ }
/**
* Create a new {@link FileStore} instance with the settings specified in
this
@@ -421,6 +428,10 @@ public class FileStoreBuilder {
return cacheManager;
}
+ IOMonitor getIOMonitor() {
+ return ioMonitor;
+ }
+
@Override
public String toString() {
return "FileStoreBuilder{" +
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java?rev=1781515&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
Fri Feb 3 09:10:07 2017
@@ -0,0 +1,26 @@
+/*
+ * 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.jackrabbit.oak.segment.file;
+
+import java.io.File;
+
+public interface IOMonitor {
+
+ void onSegmentRead(File file, long msb, long lsb, int length);
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java?rev=1781515&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
Fri Feb 3 09:10:07 2017
@@ -0,0 +1,29 @@
+/*
+ * 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.jackrabbit.oak.segment.file;
+
+import java.io.File;
+
+public class IOMonitorAdapter implements IOMonitor {
+
+ @Override
+ public void onSegmentRead(File file, long msb, long lsb, int length) {
+ // Intentionally left blank
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
Fri Feb 3 09:10:07 2017
@@ -86,7 +86,7 @@ public class ReadOnlyFileStore extends A
// only try to read-only recover the latest file as that might
// be the *only* one still being accessed by a writer
boolean recover = i == indices.length - 1;
- readers.add(TarReader.openRO(map.get(indices[i]), memoryMapping,
recover, recovery));
+ readers.add(TarReader.openRO(map.get(indices[i]), memoryMapping,
recover, recovery, ioMonitor));
}
writer = segmentWriterBuilder("read-only").withoutCache().build(this);
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
Fri Feb 3 09:10:07 2017
@@ -86,9 +86,8 @@ class TarReader implements Closeable {
return BLOCK_SIZE + size + TarWriter.getPaddingSize(size);
}
- static TarReader open(File file, boolean memoryMapping) throws IOException
{
- TarReader reader = openFirstFileWithValidIndex(
- singletonList(file), memoryMapping);
+ static TarReader open(File file, boolean memoryMapping, IOMonitor
ioMonitor) throws IOException {
+ TarReader reader = openFirstFileWithValidIndex(singletonList(file),
memoryMapping, ioMonitor);
if (reader != null) {
return reader;
} else {
@@ -111,14 +110,14 @@ class TarReader implements Closeable {
* @return
* @throws IOException
*/
- static TarReader open(Map<Character, File> files, boolean memoryMapping,
TarRecovery recovery) throws IOException {
+ static TarReader open(Map<Character, File> files, boolean memoryMapping,
TarRecovery recovery, IOMonitor ioMonitor) throws IOException {
SortedMap<Character, File> sorted = newTreeMap();
sorted.putAll(files);
List<File> list = newArrayList(sorted.values());
Collections.reverse(list);
- TarReader reader = openFirstFileWithValidIndex(list, memoryMapping);
+ TarReader reader = openFirstFileWithValidIndex(list, memoryMapping,
ioMonitor);
if (reader != null) {
return reader;
}
@@ -134,7 +133,7 @@ class TarReader implements Closeable {
File file = sorted.values().iterator().next();
generateTarFile(entries, file, recovery);
- reader = openFirstFileWithValidIndex(singletonList(file),
memoryMapping);
+ reader = openFirstFileWithValidIndex(singletonList(file),
memoryMapping, ioMonitor);
if (reader != null) {
return reader;
} else {
@@ -142,13 +141,12 @@ class TarReader implements Closeable {
}
}
- static TarReader openRO(Map<Character, File> files, boolean memoryMapping,
boolean recover, TarRecovery recovery) throws IOException {
+ static TarReader openRO(Map<Character, File> files, boolean memoryMapping,
boolean recover, TarRecovery recovery, IOMonitor ioMonitor) throws IOException {
// for readonly store only try the latest generation of a given
// tar file to prevent any rollback or rewrite
File file = files.get(Collections.max(files.keySet()));
- TarReader reader = openFirstFileWithValidIndex(singletonList(file),
- memoryMapping);
+ TarReader reader = openFirstFileWithValidIndex(singletonList(file),
memoryMapping, ioMonitor);
if (reader != null) {
return reader;
}
@@ -162,8 +160,7 @@ class TarReader implements Closeable {
collectFileEntries(file, entries, false);
file = findAvailGen(file, ".ro.bak");
generateTarFile(entries, file, recovery);
- reader = openFirstFileWithValidIndex(singletonList(file),
- memoryMapping);
+ reader = openFirstFileWithValidIndex(singletonList(file),
memoryMapping, ioMonitor);
if (reader != null) {
return reader;
}
@@ -259,7 +256,7 @@ class TarReader implements Closeable {
return backup;
}
- private static TarReader openFirstFileWithValidIndex(List<File> files,
boolean memoryMapping) {
+ private static TarReader openFirstFileWithValidIndex(List<File> files,
boolean memoryMapping, IOMonitor ioMonitor) {
for (File file : files) {
String name = file.getName();
try {
@@ -285,7 +282,7 @@ class TarReader implements Closeable {
index = mapped.read(
mapped.length() - indexSize - 16 -
1024,
indexSize);
- return new TarReader(file, mapped, index);
+ return new TarReader(file, mapped, index,
ioMonitor);
} catch (IOException e) {
log.warn("Failed to mmap tar file {}. Falling
back to normal file " +
"IO, which will negatively impact
repository performance. " +
@@ -301,7 +298,7 @@ class TarReader implements Closeable {
// prevent the finally block from closing the file
// as the returned TarReader will take care of that
access = null;
- return new TarReader(file, random, index);
+ return new TarReader(file, random, index, ioMonitor);
}
} finally {
if (access != null) {
@@ -504,10 +501,13 @@ class TarReader implements Closeable {
private volatile boolean hasGraph;
- private TarReader(File file, FileAccess access, ByteBuffer index) {
+ private final IOMonitor ioMonitor;
+
+ private TarReader(File file, FileAccess access, ByteBuffer index,
IOMonitor ioMonitor) {
this.file = file;
this.access = access;
this.index = index;
+ this.ioMonitor = ioMonitor;
}
long size() {
@@ -572,9 +572,10 @@ class TarReader implements Closeable {
ByteBuffer readEntry(long msb, long lsb) throws IOException {
int position = findEntry(msb, lsb);
if (position != -1) {
- return access.read(
- index.getInt(position + 16),
- index.getInt(position + 20));
+ int pos = index.getInt(position + 16);
+ int len = index.getInt(position + 20);
+ ioMonitor.onSegmentRead(file, msb, lsb, len);
+ return access.read(pos, len);
} else {
return null;
}
@@ -845,9 +846,9 @@ class TarReader implements Closeable {
for (TarEntry entry : entries) {
if (entry != null) {
byte[] data = new byte[entry.size()];
+ ioMonitor.onSegmentRead(file, entry.msb(), entry.lsb(),
entry.size());
access.read(entry.offset(), entry.size()).get(data);
- writer.writeEntry(
- entry.msb(), entry.lsb(), data, 0, entry.size(),
entry.generation());
+ writer.writeEntry(entry.msb(), entry.lsb(), data, 0,
entry.size(), entry.generation());
}
}
@@ -893,8 +894,7 @@ class TarReader implements Closeable {
writer.close();
- TarReader reader = openFirstFileWithValidIndex(
- singletonList(newFile), access.isMemoryMapped());
+ TarReader reader = openFirstFileWithValidIndex(singletonList(newFile),
access.isMemoryMapped(), ioMonitor);
if (reader != null) {
reclaimed.addAll(cleaned);
return reader;
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
Fri Feb 3 09:10:07 2017
@@ -68,14 +68,14 @@ public class TarFileTest {
assertEquals(5120, file.length());
- TarReader reader = TarReader.open(file, false);
+ TarReader reader = TarReader.open(file, false, new IOMonitorAdapter());
try {
assertEquals(ByteBuffer.wrap(data), reader.readEntry(msb, lsb));
} finally {
reader.close();
}
- reader = TarReader.open(file, false);
+ reader = TarReader.open(file, false, new IOMonitorAdapter());
try {
assertEquals(ByteBuffer.wrap(data), reader.readEntry(msb, lsb));
} finally {
@@ -125,7 +125,7 @@ public class TarFileTest {
expected.put(2, two);
expected.put(3, three);
- try (TarReader reader = TarReader.open(file, false)) {
+ try (TarReader reader = TarReader.open(file, false, new
IOMonitorAdapter())) {
assertEquals(expected, reader.getBinaryReferences());
}
}
@@ -147,7 +147,7 @@ public class TarFileTest {
Set<UUID> sweep = newSet(new UUID(1, 1), new UUID(2, 2));
- try (TarReader reader = TarReader.open(file, false)) {
+ try (TarReader reader = TarReader.open(file, false, new
IOMonitorAdapter())) {
try (TarReader swept = reader.sweep(sweep, new HashSet<UUID>())) {
assertNotNull(swept);
@@ -184,7 +184,7 @@ public class TarFileTest {
Set<UUID> sweep = newSet(new UUID(1, 2), new UUID(2, 3));
- try (TarReader reader = TarReader.open(file, false)) {
+ try (TarReader reader = TarReader.open(file, false, new
IOMonitorAdapter())) {
try (TarReader swept = reader.sweep(sweep, new HashSet<UUID>())) {
assertNotNull(swept);