You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2012/02/09 16:42:47 UTC
svn commit: r1242366 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/client/
main/java/org/apache/jackrabbit/mk/cluster/
main/java/org/apache/jackrabbit/mk/json/fast/
test/java/org/apache/jackrabbit/mk/cluster/ test/java/or...
Author: dpfister
Date: Thu Feb 9 15:42:46 2012
New Revision: 1242366
URL: http://svn.apache.org/viewvc?rev=1242366&view=rev
Log:
Add hot backup as clustering use-case
- move Jsop Parser from test to main
- return Request from Request.addXXX methods to allow chaining
Added:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java (with props)
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/fast/
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/fast/Jsop.java
- copied unchanged from r1242363, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/Jsop.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java
- copied unchanged from r1242363, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java
- copied unchanged from r1242363, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java (with props)
Removed:
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/Jsop.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopArray.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/fast/JsopObject.java
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/client/Request.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/client/Request.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/client/Request.java?rev=1242366&r1=1242365&r2=1242366&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/client/Request.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/client/Request.java Thu Feb 9 15:42:46 2012
@@ -61,10 +61,11 @@ class Request implements Closeable {
* @param name name
* @param value value, if <code>null</code> the call is ignored
*/
- public void addParameter(String name, String value) {
+ public Request addParameter(String name, String value) {
if (value != null) {
params.put(name, value);
}
+ return this;
}
/**
@@ -74,8 +75,9 @@ class Request implements Closeable {
* @param name name
* @param value value
*/
- public void addParameter(String name, int value) {
+ public Request addParameter(String name, int value) {
params.put(name, String.valueOf(value));
+ return this;
}
/**
@@ -85,8 +87,9 @@ class Request implements Closeable {
* @param name name
* @param value value
*/
- public void addParameter(String name, long value) {
+ public Request addParameter(String name, long value) {
params.put(name, String.valueOf(value));
+ return this;
}
/**
@@ -95,8 +98,9 @@ class Request implements Closeable {
* @param name name
* @param in input stream
*/
- public void addFileParameter(String name, InputStream in) {
+ public Request addFileParameter(String name, InputStream in) {
this.in = in;
+ return this;
}
/**
Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java?rev=1242366&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java Thu Feb 9 15:42:46 2012
@@ -0,0 +1,105 @@
+/*
+ * 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.mk.cluster;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.json.JsopBuilder;
+import org.apache.jackrabbit.mk.json.fast.Jsop;
+import org.apache.jackrabbit.mk.json.fast.JsopArray;
+import org.apache.jackrabbit.mk.json.fast.JsopObject;
+import org.apache.jackrabbit.mk.util.PathUtils;
+
+/**
+ * This class connects two <code>MicroKernel</code> instances, where one
+ * instance will periodically commit the changes made to the other.
+ *
+ * TODO do a full sync on first call
+ * TODO add periodic background check
+ */
+public class HotBackup {
+
+ private static final String PATH_PROPERTY_LASTREV = "/:lastrev";
+ private final MicroKernel source;
+ private final MicroKernel target;
+ private String lastRev;
+
+ /**
+ * Create a new instance of this class.
+ *
+ * @param source source microkernel where changes are read
+ * @param target target microkernel where changes are committed
+ */
+ public HotBackup(MicroKernel source, MicroKernel target) {
+ this.source = source;
+ this.target = target;
+
+ init();
+ }
+
+ private void init() {
+ lastRev = getProperty(target, PATH_PROPERTY_LASTREV);
+ if (lastRev == null) {
+ lastRev = source.getHeadRevision();
+
+ // TODO never sync'ed, so do a full copy
+
+
+ setProperty(target, PATH_PROPERTY_LASTREV, lastRev);
+ }
+ sync();
+ }
+
+ /**
+ * Read all changes from the source microkernel and commit them to
+ * the target microkernel.
+ */
+ public void sync() {
+ String headRev = source.getHeadRevision();
+ if (lastRev != headRev) {
+ JsopArray journal = (JsopArray) Jsop.parse(source.getJournal(lastRev, headRev));
+ for (int i = 0; i < journal.size(); i++) {
+ JsopObject record = (JsopObject) journal.get(i);
+ String diff = (String) record.get("changes");
+ String message = (String) record.get("msg");
+ target.commit("", diff, target.getHeadRevision(), message);
+ }
+ lastRev = headRev;
+ setProperty(target, PATH_PROPERTY_LASTREV, lastRev);
+ }
+ }
+
+ private static String getProperty(MicroKernel mk, String path) {
+ String parent = PathUtils.getParentPath(path);
+ String name = PathUtils.getName(path);
+
+ JsopObject props = (JsopObject) Jsop.parse(mk.getNodes(parent, mk.getHeadRevision(), -1, 0, -1));
+ return (String) props.get(name);
+ }
+
+ private static void setProperty(MicroKernel mk, String path, String value) {
+ String parent = PathUtils.getParentPath(path);
+ String name = PathUtils.getName(path);
+
+ if (value == null) {
+ String diff = new JsopBuilder().tag('-').key(name).value(null).toString();
+ mk.commit(parent, diff, mk.getHeadRevision(), null);
+ } else {
+ String diff = new JsopBuilder().tag('+').key(name).value(value).toString();
+ mk.commit(parent, diff, mk.getHeadRevision(), null);
+ }
+ }
+}
Propchange: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/cluster/HotBackup.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev Url
Added: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java?rev=1242366&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java (added)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java Thu Feb 9 15:42:46 2012
@@ -0,0 +1,53 @@
+/*
+ * 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.mk.cluster;
+
+import org.apache.jackrabbit.mk.MicroKernelFactory;
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HotBackupTest {
+
+ private MicroKernel source;
+ private MicroKernel target;
+
+ @Before
+ public void setUp() throws Exception {
+ source = MicroKernelFactory.getInstance("fs:{homeDir}/target/mk1;clean");
+ target = MicroKernelFactory.getInstance("fs:{homeDir}/target/mk2;clean");
+ }
+
+ @After
+ public void tearDown() {
+ if (source != null) {
+ source.dispose();
+ }
+ if (target != null) {
+ target.dispose();
+ }
+ }
+
+ @Test
+ public void test() {
+ HotBackup hotbackup = new HotBackup(source, target);
+ source.commit("/", "+\"test\":{}", source.getHeadRevision(), null);
+ hotbackup.sync();
+ target.getNodes("/test", target.getHeadRevision());
+ }
+}
Propchange: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/cluster/HotBackupTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev Url