Author: frm
Date: Fri Sep 9 17:12:13 2016
New Revision: 1760082
URL: http://svn.apache.org/viewvc?rev=1760082&view=rev
Log:
OAK-4785 - Implement request parsing in a new handler
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/SegmentLoaderHandler.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientHandler.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/codec/Messages.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/SegmentLoaderHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/SegmentLoaderHandler.java?rev=1760082&r1=1760081&r2=1760082&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/SegmentLoaderHandler.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/SegmentLoaderHandler.java
Fri Sep 9 17:12:13 2016
@@ -19,8 +19,8 @@
package org.apache.jackrabbit.oak.segment.standby.client;
import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
-import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetBlobReq;
-import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetSegmentReq;
+import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetBlobRequest;
+import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetSegmentRequest;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
@@ -180,7 +180,7 @@ public class SegmentLoaderHandler extend
@Override
public Segment readSegment(final String id) {
// Use the I/O thread to write the request to the server
- ctx.writeAndFlush(newGetSegmentReq(this.clientID, id));
+ ctx.writeAndFlush(newGetSegmentRequest(this.clientID, id));
// Wait on the sync thread for the response.
return getSegment(id);
}
@@ -188,7 +188,7 @@ public class SegmentLoaderHandler extend
@Override
public Blob readBlob(String blobId) {
// Use the I/O thread to write the request to the server
- ctx.writeAndFlush(newGetBlobReq(this.clientID, blobId));
+ ctx.writeAndFlush(newGetBlobRequest(this.clientID, blobId));
// Wait on the sync thread for the response.
return getBlob(blobId);
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientHandler.java?rev=1760082&r1=1760081&r2=1760082&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientHandler.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientHandler.java
Fri Sep 9 17:12:13 2016
@@ -19,7 +19,7 @@
package org.apache.jackrabbit.oak.segment.standby.client;
-import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetHeadReq;
+import static
org.apache.jackrabbit.oak.segment.standby.codec.Messages.newGetHeadRequest;
import java.io.Closeable;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -57,7 +57,7 @@ public class StandbyClientHandler extend
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.debug("sending head request");
- ctx.writeAndFlush(newGetHeadReq(this.observer.getID()));
+ ctx.writeAndFlush(newGetHeadRequest(this.observer.getID()));
log.debug("did send head request");
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/codec/Messages.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/codec/Messages.java?rev=1760082&r1=1760081&r2=1760082&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/codec/Messages.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/codec/Messages.java
Fri Sep 9 17:12:13 2016
@@ -31,20 +31,45 @@ public class Messages {
private static final String MAGIC = "Standby-CMD@";
private static final String SEPARATOR = ":";
- private static String newRequest(String clientID, String body) {
- return MAGIC + (clientID == null ? "" : clientID.replace(SEPARATOR,
"#")) + SEPARATOR + body + "\r\n";
+ private static String newRequest(String clientId, String body, boolean
delimited) {
+ StringBuilder builder = new StringBuilder(MAGIC);
+
+ if (clientId != null) {
+ builder.append(clientId.replace(SEPARATOR, "#"));
+ }
+
+ builder.append(SEPARATOR);
+ builder.append(body);
+
+ if (delimited) {
+ builder.append("\r\n");
+ }
+
+ return builder.toString();
+ }
+
+ public static String newGetHeadRequest(String clientId, boolean delimited)
{
+ return newRequest(clientId, GET_HEAD, delimited);
+ }
+
+ public static String newGetHeadRequest(String clientId) {
+ return newGetHeadRequest(clientId, true);
+ }
+
+ public static String newGetSegmentRequest(String clientId, String
segmentId, boolean delimited) {
+ return newRequest(clientId, GET_SEGMENT + segmentId, delimited);
}
- public static String newGetHeadReq(String clientID) {
- return newRequest(clientID, GET_HEAD);
+ public static String newGetSegmentRequest(String clientId, String
segmentId) {
+ return newGetSegmentRequest(clientId, segmentId, true);
}
- public static String newGetSegmentReq(String clientID, String sid) {
- return newRequest(clientID, GET_SEGMENT + sid);
+ public static String newGetBlobRequest(String clientId, String blobId,
boolean delimited) {
+ return newRequest(clientId, GET_BLOB + blobId, delimited);
}
- public static String newGetBlobReq(String clientID, String blobId) {
- return newRequest(clientID, GET_BLOB + blobId);
+ public static String newGetBlobRequest(String clientId, String blobId) {
+ return newGetBlobRequest(clientId, blobId, true);
}
public static String extractMessageFrom(String payload) {
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java?rev=1760082&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java
Fri Sep 9 17:12:13 2016
@@ -0,0 +1,39 @@
+/*
+ * 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.standby.server;
+
+class GetBlobRequest {
+
+ private final String clientId;
+
+ private final String blobId;
+
+ GetBlobRequest(String clientId, String blobId) {
+ this.clientId = clientId;
+ this.blobId = blobId;
+ }
+
+ String getClientId() {
+ return clientId;
+ }
+
+ String getBlobId() {
+ return blobId;
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetBlobRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java?rev=1760082&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java
Fri Sep 9 17:12:13 2016
@@ -0,0 +1,32 @@
+/*
+ * 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.standby.server;
+
+class GetHeadRequest {
+
+ private String clientId;
+
+ GetHeadRequest(String clientId) {
+ this.clientId = clientId;
+ }
+
+ String getClientId() {
+ return clientId;
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetHeadRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java?rev=1760082&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java
Fri Sep 9 17:12:13 2016
@@ -0,0 +1,39 @@
+/*
+ * 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.standby.server;
+
+class GetSegmentRequest {
+
+ private final String clientId;
+
+ private final String segmentId;
+
+ GetSegmentRequest(String clientId, String segmentId) {
+ this.clientId = clientId;
+ this.segmentId = segmentId;
+ }
+
+ public String getClientId() {
+ return clientId;
+ }
+
+ public String getSegmentId() {
+ return segmentId;
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/GetSegmentRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java?rev=1760082&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java
Fri Sep 9 17:12:13 2016
@@ -0,0 +1,58 @@
+/*
+ * 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.standby.server;
+
+import java.util.List;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageDecoder;
+import org.apache.jackrabbit.oak.segment.standby.codec.Messages;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implements the logic for parsing input messages and failing when an
incorrect
+ * or unrecognized message is received.
+ */
+class RequestDecoder extends MessageToMessageDecoder<String> {
+
+ private static final Logger log =
LoggerFactory.getLogger(RequestDecoder.class);
+
+ @Override
+ protected void decode(ChannelHandlerContext ctx, String msg, List<Object>
out) throws Exception {
+ String request = Messages.extractMessageFrom(msg);
+
+ if (request == null) {
+ log.debug("Unable to parse message '{}'", msg);
+ ctx.close();
+ } else if (request.equalsIgnoreCase(Messages.GET_HEAD)) {
+ log.debug("Parsed 'get head' message");
+ out.add(new GetHeadRequest(Messages.extractClientFrom(msg)));
+ } else if (request.startsWith(Messages.GET_SEGMENT)) {
+ log.debug("Parsed 'get segment' message");
+ out.add(new GetSegmentRequest(Messages.extractClientFrom(msg),
request.substring(Messages.GET_SEGMENT.length())));
+ } else if (request.startsWith(Messages.GET_BLOB)) {
+ log.debug("Parsed 'get blob' message");
+ out.add(new GetBlobRequest(Messages.extractClientFrom(msg),
request.substring(Messages.GET_BLOB.length())));
+ } else {
+ log.debug("Unrecognized message '{}'", msg);
+ ctx.close();
+ }
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoder.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java?rev=1760082&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java
Fri Sep 9 17:12:13 2016
@@ -0,0 +1,69 @@
+/*
+ * 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.standby.server;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import io.netty.channel.embedded.EmbeddedChannel;
+import org.apache.jackrabbit.oak.segment.standby.codec.Messages;
+import org.junit.Test;
+
+public class RequestDecoderTest {
+
+ @Test
+ public void shouldDecodeGetHeadRequests() throws Exception {
+ EmbeddedChannel channel = new EmbeddedChannel(new RequestDecoder());
+ channel.writeInbound(Messages.newGetHeadRequest("clientId", false));
+ GetHeadRequest request = (GetHeadRequest) channel.readInbound();
+ assertEquals("clientId", request.getClientId());
+ }
+
+ @Test
+ public void shouldDecodeGetSegmentRequests() throws Exception {
+ EmbeddedChannel channel = new EmbeddedChannel(new RequestDecoder());
+ channel.writeInbound(Messages.newGetSegmentRequest("clientId",
"segmentId", false));
+ GetSegmentRequest request = (GetSegmentRequest) channel.readInbound();
+ assertEquals("clientId", request.getClientId());
+ assertEquals("segmentId", request.getSegmentId());
+ }
+
+ @Test
+ public void shouldDecodeGetBlobRequests() throws Exception {
+ EmbeddedChannel channel = new EmbeddedChannel(new RequestDecoder());
+ channel.writeInbound(Messages.newGetBlobRequest("clientId", "blobId",
false));
+ GetBlobRequest request = (GetBlobRequest) channel.readInbound();
+ assertEquals("clientId", request.getClientId());
+ assertEquals("blobId", request.getBlobId());
+ }
+
+ @Test
+ public void shouldCloseConnectionOnGarbage() throws Exception {
+ EmbeddedChannel channel = new EmbeddedChannel(new RequestDecoder());
+ channel.writeInbound("this is garbage");
+ assertFalse(channel.isOpen());
+ }
+
+ @Test
+ public void shouldCloseConnectionOnUnrecognizedMessageTypes() throws
Exception {
+ EmbeddedChannel channel = new EmbeddedChannel(new RequestDecoder());
+ channel.writeInbound("Standby-CMD@clientId:z");
+ assertFalse(channel.isOpen());
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/RequestDecoderTest.java
------------------------------------------------------------------------------
svn:eol-style = native