You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2019/04/24 11:10:26 UTC
[lucene-solr] branch branch_8x updated: SOLR-13423: Upgrade RRD4j
to version 3.5.
This is an automated email from the ASF dual-hosted git repository.
ab pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/branch_8x by this push:
new 60af5df SOLR-13423: Upgrade RRD4j to version 3.5.
60af5df is described below
commit 60af5dfcfc1e5eda19db0b9e89059e987bb31e46
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Wed Apr 24 12:01:05 2019 +0200
SOLR-13423: Upgrade RRD4j to version 3.5.
---
lucene/ivy-versions.properties | 2 +-
solr/CHANGES.txt | 2 +
.../solr/handler/admin/MetricsHistoryHandler.java | 3 +-
.../apache/solr/metrics/rrd/SolrRrdBackend.java | 161 +++++++++++++++++++--
.../solr/metrics/rrd/SolrRrdBackendFactory.java | 22 ++-
.../metrics/rrd/SolrRrdBackendFactoryTest.java | 2 +
solr/licenses/rrd4j-3.2.jar.sha1 | 1 -
solr/licenses/rrd4j-3.5.jar.sha1 | 1 +
8 files changed, 171 insertions(+), 23 deletions(-)
diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties
index d1994c2..98c94d7 100644
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@ -285,7 +285,7 @@ org.restlet.jee.version = 2.3.0
/org.restlet.jee/org.restlet = ${org.restlet.jee.version}
/org.restlet.jee/org.restlet.ext.servlet = ${org.restlet.jee.version}
-/org.rrd4j/rrd4j = 3.2
+/org.rrd4j/rrd4j = 3.5
/org.simpleframework/simple-xml = 2.7.1
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index ab49a4d..9ff5f72 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -274,6 +274,8 @@ Other Changes
* SOLR-13400: Replace Observable pattern in TransientSolrCoreCache (Erick Erickson)
+* SOLR-13423: Upgrade RRD4j to version 3.5. (ab)
+
================== 8.0.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
index bac0b6b..51bad59 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
@@ -25,6 +25,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -754,7 +755,7 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
}
if (factory.exists(name)) {
// get a throwaway copy (safe to close and discard)
- RrdDb db = new RrdDb(URI_PREFIX + name, true, factory);
+ RrdDb db = RrdDb.getBuilder().setBackendFactory(factory).setReadOnly(true).setPath(new URI(URI_PREFIX + name)).build();
SimpleOrderedMap<Object> status = new SimpleOrderedMap<>();
status.add("status", getDbStatus(db));
status.add("node", nodeName);
diff --git a/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackend.java b/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackend.java
index d0aa3e2..643f315 100644
--- a/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackend.java
+++ b/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackend.java
@@ -56,7 +56,7 @@ public class SolrRrdBackend extends RrdByteArrayBackend implements Closeable {
try {
SyncData syncData = factory.getData(path);
if (syncData != null) {
- this.buffer = syncData.data;
+ setBuffer(syncData.data);
this.lastModifiedTime = syncData.timestamp;
}
} catch (IOException e) {
@@ -75,9 +75,10 @@ public class SolrRrdBackend extends RrdByteArrayBackend implements Closeable {
readOnly = true;
factory = null;
this.lastModifiedTime = other.lastModifiedTime;
- byte[] otherBuffer = other.buffer;
- buffer = new byte[otherBuffer.length];
- System.arraycopy(otherBuffer, 0, buffer, 0, otherBuffer.length);
+ byte[] otherBuffer = other.getBuffer();
+ byte[] newBuffer = new byte[otherBuffer.length];
+ System.arraycopy(otherBuffer, 0, newBuffer, 0, otherBuffer.length);
+ super.setBuffer(newBuffer);
}
public boolean isReadOnly() {
@@ -88,6 +89,11 @@ public class SolrRrdBackend extends RrdByteArrayBackend implements Closeable {
return lastModifiedTime;
}
+ private void markDirty() {
+ lastModifiedTime = TimeUnit.MILLISECONDS.convert(factory.getTimeSource().getEpochTimeNs(), TimeUnit.NANOSECONDS);
+ dirty = true;
+ }
+
@Override
protected void write(long offset, byte[] bytes) throws IOException {
if (readOnly || closed) {
@@ -96,14 +102,144 @@ public class SolrRrdBackend extends RrdByteArrayBackend implements Closeable {
lock.lock();
try {
super.write(offset, bytes);
- lastModifiedTime = TimeUnit.MILLISECONDS.convert(factory.getTimeSource().getEpochTimeNs(), TimeUnit.NANOSECONDS);
- dirty = true;
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeShort(long offset, short value) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeShort(offset, value);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeInt(long offset, int value) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeInt(offset, value);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeLong(long offset, long value) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeLong(offset, value);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeDouble(long offset, double value) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeDouble(offset, value);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeDouble(long offset, double value, int count) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeDouble(offset, value, count);
+ markDirty();
} finally {
lock.unlock();
}
}
- public SyncData getSyncData() {
+ @Override
+ protected void writeDouble(long offset, double[] values) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeDouble(offset, values);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void writeString(long offset, String value, int length) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.writeString(offset, value, length);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected boolean isDirty() {
+ return dirty;
+ }
+
+ @Override
+ protected void setBuffer(byte[] buffer) {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.setBuffer(buffer);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ protected void setLength(long length) throws IOException {
+ if (readOnly || closed) {
+ return;
+ }
+ lock.lock();
+ try {
+ super.setLength(length);
+ markDirty();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public SyncData getSyncDataAndMarkClean() {
if (readOnly || closed) {
return null;
}
@@ -113,18 +249,17 @@ public class SolrRrdBackend extends RrdByteArrayBackend implements Closeable {
// hold a lock to block writes so that we get consistent data
lock.lock();
try {
- byte[] bufferCopy = new byte[buffer.length];
- System.arraycopy(buffer, 0, bufferCopy, 0, buffer.length);
+ byte[] oldBuffer = getBuffer();
+ byte[] bufferCopy = new byte[oldBuffer.length];
+ System.arraycopy(oldBuffer, 0, bufferCopy, 0, oldBuffer.length);
return new SyncData(bufferCopy, lastModifiedTime);
} finally {
+ // reset the dirty flag
+ dirty = false;
lock.unlock();
}
}
- public void markClean() {
- dirty = false;
- }
-
@Override
public void close() throws IOException {
super.close();
diff --git a/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackendFactory.java b/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackendFactory.java
index 5448d8f..ac12885 100644
--- a/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackendFactory.java
+++ b/solr/core/src/java/org/apache/solr/metrics/rrd/SolrRrdBackendFactory.java
@@ -152,6 +152,20 @@ public class SolrRrdBackendFactory extends RrdBackendFactory implements SolrClos
}
}
+ @Override
+ public URI getCanonicalUri(URI uri) {
+ return uri;
+ }
+
+// @Override
+// protected URI getRootUri() {
+// try {
+// return new URI("solr", null, null, null);
+// } catch (URISyntaxException e) {
+// throw new RuntimeException("Impossible error", e);
+// }
+// }
+//
/**
* Open (or get) a backend.
* @param path backend path (without URI scheme)
@@ -336,7 +350,7 @@ public class SolrRrdBackendFactory extends RrdBackendFactory implements SolrClos
log.debug("-- maybe sync backends: " + backends.keySet());
Map<String, SolrRrdBackend.SyncData> syncDatas = new HashMap<>();
backends.forEach((path, backend) -> {
- SolrRrdBackend.SyncData syncData = backend.getSyncData();
+ SolrRrdBackend.SyncData syncData = backend.getSyncDataAndMarkClean();
if (syncData != null) {
syncDatas.put(backend.getPath(), syncData);
}
@@ -367,12 +381,6 @@ public class SolrRrdBackendFactory extends RrdBackendFactory implements SolrClos
} catch (SolrServerException e) {
log.warn("Error committing RRD data updates", e);
}
- syncDatas.forEach((path, data) -> {
- SolrRrdBackend backend = backends.get(path);
- if (backend != null) {
- backend.markClean();
- }
- });
} catch (IOException e) {
log.warn("Error sending RRD data updates", e);
}
diff --git a/solr/core/src/test/org/apache/solr/metrics/rrd/SolrRrdBackendFactoryTest.java b/solr/core/src/test/org/apache/solr/metrics/rrd/SolrRrdBackendFactoryTest.java
index cdc1b61..955c256 100644
--- a/solr/core/src/test/org/apache/solr/metrics/rrd/SolrRrdBackendFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/rrd/SolrRrdBackendFactoryTest.java
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.CollectionAdminParams;
import org.apache.solr.common.util.Pair;
import org.apache.solr.common.util.TimeSource;
import org.apache.solr.common.util.Utils;
+import org.apache.solr.util.LogLevel;
import org.apache.solr.util.MockSearchableSolrClient;
import org.junit.After;
import org.junit.Before;
@@ -42,6 +43,7 @@ import org.rrd4j.core.Sample;
/**
*
*/
+@LogLevel("org.apache.solr.metrics.rrd=DEBUG")
public class SolrRrdBackendFactoryTest extends SolrTestCaseJ4 {
private SolrRrdBackendFactory factory;
diff --git a/solr/licenses/rrd4j-3.2.jar.sha1 b/solr/licenses/rrd4j-3.2.jar.sha1
deleted file mode 100644
index 5304919..0000000
--- a/solr/licenses/rrd4j-3.2.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8d480d5aa87b3d358862b78d6fa3660396220dc7
diff --git a/solr/licenses/rrd4j-3.5.jar.sha1 b/solr/licenses/rrd4j-3.5.jar.sha1
new file mode 100644
index 0000000..8277f7e
--- /dev/null
+++ b/solr/licenses/rrd4j-3.5.jar.sha1
@@ -0,0 +1 @@
+540c946b471dc915b0beb7c07069e3946665ef5d