This is an automated email from the ASF dual-hosted git repository.
sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new fdb35d4 Integration test for s3offload (#1829)
fdb35d4 is described below
commit fdb35d449ceae8ec9859bdbf077fd1bbe87d5bad
Author: Ivan Kelly <[email protected]>
AuthorDate: Wed May 23 19:11:22 2018 +0100
Integration test for s3offload (#1829)
Starts a cluster with s3offload enabled. Write enough entries to roll
the ledger. Offload. Manually delete the first ledger. Reboot cluster
to clear caches. Then read back the whole topic.
Master issue: #1511
---
...luster-2-bookie-1-broker-unstarted-with-s3.yaml | 156 +++++++++++++++++++
tests/integration/pom.xml | 1 +
tests/integration/s3-offload/pom.xml | 57 +++++++
.../pulsar/tests/integration/TestS3Offload.java | 173 +++++++++++++++++++++
.../src/test/resources/arquillian.xml} | 30 ++--
5 files changed, 398 insertions(+), 19 deletions(-)
diff --git
a/tests/integration-tests-topologies/src/main/resources/cube-definitions/single-cluster-2-bookie-1-broker-unstarted-with-s3.yaml
b/tests/integration-tests-topologies/src/main/resources/cube-definitions/single-cluster-2-bookie-1-broker-unstarted-with-s3.yaml
new file mode 100644
index 0000000..b80ef7c
--- /dev/null
+++
b/tests/integration-tests-topologies/src/main/resources/cube-definitions/single-cluster-2-bookie-1-broker-unstarted-with-s3.yaml
@@ -0,0 +1,156 @@
+#
+# 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.
+#
+
+networks:
+ pulsarnet*:
+ driver: bridge
+
+zookeeper*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env: [ZOOKEEPER_SERVERS=zookeeper]
+ labels:
+ cluster: test
+ service: zookeeper
+ entryPoint: [bin/run-local-zk.sh]
+ aliases:
+ - zookeeper
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+configuration-store*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env: [ZOOKEEPER_SERVERS=configuration-store]
+ labels:
+ cluster: test
+ service: configuration-store
+ entryPoint: [bin/run-global-zk.sh]
+ aliases:
+ - configuration-store
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+init*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env:
+ - cluster=test
+ - zkServers=zookeeper
+ - configurationStore=configuration-store:2184
+ - pulsarNode=pulsar-broker1
+ labels:
+ cluster: test
+ service: init
+ entryPoint: [bin/init-cluster.sh]
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.LogToTargetDirStopAction
+ networkMode: pulsarnet*
+
+bookkeeper1*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env:
+ - zkServers=zookeeper
+ - useHostNameAsBookieID=true
+ labels:
+ cluster: test
+ service: bookie
+ entryPoint: [bin/run-bookie.sh]
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+bookkeeper2*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env:
+ - zkServers=zookeeper
+ - useHostNameAsBookieID=true
+ labels:
+ cluster: test
+ service: bookie
+ entryPoint: [bin/run-bookie.sh]
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+pulsar-broker1*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ aliases:
+ - pulsar-broker1
+ env:
+ - zookeeperServers=zookeeper
+ - configurationStoreServers=configuration-store:2184
+ - clusterName=test
+ - NO_AUTOSTART=true
+ labels:
+ cluster: test
+ service: pulsar-broker
+ entryPoint: [bin/run-broker.sh]
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+pulsar-proxy*:
+ image: apachepulsar/pulsar-test-latest-version:latest
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env:
+ - zookeeperServers=zookeeper
+ - configurationStoreServers=configuration-store:2184
+ - clusterName=test
+ - NO_AUTOSTART=true
+ labels:
+ cluster: test
+ service: pulsar-proxy
+ entryPoint: [bin/run-proxy.sh]
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.PulsarLogsToTargetDirStopAction
+ networkMode: pulsarnet*
+
+s3*:
+ image: adobe/s3mock
+ await:
+ strategy: org.apache.pulsar.tests.NoopAwaitStrategy
+ env:
+ - initialBuckets=pulsar-integtest
+ labels:
+ cluster: test
+ service: s3
+ beforeStop:
+ - customBeforeStopAction:
+ strategy: org.apache.pulsar.tests.LogToTargetDirStopAction
+ networkMode: pulsarnet*
diff --git a/tests/integration/pom.xml b/tests/integration/pom.xml
index 1245571..1dd3ad3 100644
--- a/tests/integration/pom.xml
+++ b/tests/integration/pom.xml
@@ -36,5 +36,6 @@
<module>smoke</module>
<module>compaction</module>
<module>cli</module>
+ <module>s3-offload</module>
</modules>
</project>
diff --git a/tests/integration/s3-offload/pom.xml
b/tests/integration/s3-offload/pom.xml
new file mode 100644
index 0000000..2d4812a
--- /dev/null
+++ b/tests/integration/s3-offload/pom.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.pulsar.tests</groupId>
+ <artifactId>integration-tests-base</artifactId>
+ <version>2.1.0-incubating-SNAPSHOT</version>
+ <relativePath>../../integration-tests-base</relativePath>
+ </parent>
+
+ <groupId>org.apache.pulsar.tests.integration</groupId>
+ <artifactId>s3-offload</artifactId>
+ <packaging>jar</packaging>
+ <name>Apache Pulsar :: Tests :: Integration Tests :: S3 Offload</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-client</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-client-admin-original</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>managed-ledger</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/tests/integration/s3-offload/src/test/java/org/apache/pulsar/tests/integration/TestS3Offload.java
b/tests/integration/s3-offload/src/test/java/org/apache/pulsar/tests/integration/TestS3Offload.java
new file mode 100644
index 0000000..c5b27f0
--- /dev/null
+++
b/tests/integration/s3-offload/src/test/java/org/apache/pulsar/tests/integration/TestS3Offload.java
@@ -0,0 +1,173 @@
+/**
+ * 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.pulsar.tests.integration;
+
+import com.github.dockerjava.api.DockerClient;
+import com.google.common.collect.ImmutableMap;
+
+import java.net.URL;
+
+import org.apache.bookkeeper.client.BookKeeper;
+import org.apache.bookkeeper.conf.ClientConfiguration;
+
+import org.apache.bookkeeper.mledger.ManagedLedgerFactory;
+import org.apache.bookkeeper.mledger.ManagedLedgerInfo;
+import org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl;
+
+import org.apache.pulsar.client.admin.LongRunningProcessStatus;
+import org.apache.pulsar.client.admin.PulsarAdmin;
+import org.apache.pulsar.client.api.Consumer;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageId;
+import org.apache.pulsar.client.api.Producer;
+import org.apache.pulsar.client.api.PulsarClient;
+
+import org.apache.pulsar.tests.DockerUtils;
+import org.apache.pulsar.tests.PulsarClusterUtils;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.arquillian.testng.Arquillian;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class TestS3Offload extends Arquillian {
+ private static final Logger log =
LoggerFactory.getLogger(TestS3Offload.class);
+
+ private static final String CLUSTER_NAME = "test";
+ private static final int ENTRIES_PER_LEDGER = 10;
+
+ @ArquillianResource
+ DockerClient docker;
+
+ @BeforeMethod
+ public void configureAndStartBrokers() throws Exception {
+
+ String s3ip = DockerUtils.cubeIdsWithLabels(
+ docker, ImmutableMap.of("service", "s3", "cluster",
CLUSTER_NAME))
+ .stream().map((c) -> DockerUtils.getContainerIP(docker,
c)).findFirst().get();
+
+ String brokerConfFile = "/pulsar/conf/broker.conf";
+ for (String b : PulsarClusterUtils.brokerSet(docker, CLUSTER_NAME)) {
+ PulsarClusterUtils.updateConf(docker, b, brokerConfFile,
+ "managedLedgerMaxEntriesPerLedger",
String.valueOf(ENTRIES_PER_LEDGER));
+ PulsarClusterUtils.updateConf(docker, b, brokerConfFile,
+ "managedLedgerMinLedgerRolloverTimeMinutes", "0");
+ PulsarClusterUtils.updateConf(docker, b, brokerConfFile,
+ "managedLedgerOffloadDriver", "s3");
+ PulsarClusterUtils.updateConf(docker, b, brokerConfFile,
+ "s3ManagedLedgerOffloadBucket", "pulsar-integtest");
+ PulsarClusterUtils.updateConf(docker, b, brokerConfFile,
+ "s3ManagedLedgerOffloadServiceEndpoint", "http://" + s3ip
+ ":9090");
+ }
+
+ Assert.assertTrue(PulsarClusterUtils.startAllBrokers(docker,
CLUSTER_NAME));
+ Assert.assertTrue(PulsarClusterUtils.startAllProxies(docker,
CLUSTER_NAME));
+ }
+
+ @AfterMethod
+ public void teardownBrokers() throws Exception {
+ PulsarClusterUtils.stopAllProxies(docker, CLUSTER_NAME);
+ Assert.assertTrue(PulsarClusterUtils.stopAllBrokers(docker,
CLUSTER_NAME));
+
+ }
+
+ @Test
+ public void testPublishOffloadAndConsumeViaAdmin() throws Exception {
+ PulsarClusterUtils.runOnAnyBroker(docker, CLUSTER_NAME,
+ "/pulsar/bin/pulsar-admin", "tenants",
+ "create", "--allowed-clusters", CLUSTER_NAME,
+ "--admin-roles", "offload-admin", "s3-offload-test");
+ PulsarClusterUtils.runOnAnyBroker(docker, CLUSTER_NAME,
+ "/pulsar/bin/pulsar-admin", "namespaces",
+ "create", "--clusters", CLUSTER_NAME, "s3-offload-test/ns1");
+
+ String brokerIp = PulsarClusterUtils.brokerSet(docker, CLUSTER_NAME)
+ .stream().map((c) -> DockerUtils.getContainerIP(docker,
c)).findFirst().get();
+ String proxyIp = PulsarClusterUtils.proxySet(docker, CLUSTER_NAME)
+ .stream().map((c) -> DockerUtils.getContainerIP(docker,
c)).findFirst().get();
+ String serviceUrl = "pulsar://" + proxyIp + ":6650";
+ String adminUrl = "http://" + brokerIp + ":8080";
+ String topic = "persistent://s3-offload-test/ns1/topic1";
+
+ ClientConfiguration bkConf = new ClientConfiguration();
+ bkConf.setZkServers(PulsarClusterUtils.zookeeperConnectString(docker,
CLUSTER_NAME));
+
+ long firstLedger = -1;
+ try(PulsarClient client = PulsarClient.create(serviceUrl);
+ Producer producer = client.createProducer(topic)) {
+ client.subscribe(topic, "my-sub").close();
+ // write enough to topic to make it roll
+ int i = 0;
+ for (; i < ENTRIES_PER_LEDGER*1.5; i++) {
+ producer.send(("offload-message"+i).getBytes());
+ }
+ MessageId latestMessage =
producer.send(("offload-message"+i).getBytes());
+
+ // read managed ledger info, check ledgers exist
+ ManagedLedgerFactory mlf = new ManagedLedgerFactoryImpl(bkConf);
+ ManagedLedgerInfo info =
mlf.getManagedLedgerInfo("s3-offload-test/ns1/persistent/topic1");
+ Assert.assertEquals(info.ledgers.size(), 2);
+
+ firstLedger = info.ledgers.get(0).ledgerId;
+
+ // trigger offload
+ try (PulsarAdmin admin = new PulsarAdmin(new URL(adminUrl), "",
"")) {
+ log.info("Trigger offload");
+
+ admin.topics().triggerOffload(topic, latestMessage);
+
+ LongRunningProcessStatus status =
admin.topics().offloadStatus(topic);
+ while (status.status ==
LongRunningProcessStatus.Status.RUNNING) {
+ Thread.sleep(100);
+ status = admin.topics().offloadStatus(topic);
+ }
+ Assert.assertEquals(status.status,
LongRunningProcessStatus.Status.SUCCESS);
+
+ log.info("Offload complete");
+ }
+ }
+
+ log.info("Kill ledger");
+ // stop brokers to clear all caches, open handles, etc
+ Assert.assertTrue(PulsarClusterUtils.stopAllBrokers(docker,
CLUSTER_NAME));
+
+ // delete the first ledger, so that we cannot possibly read from it
+ try (BookKeeper bk = new BookKeeper(bkConf)) {
+ bk.deleteLedger(firstLedger);
+ }
+
+ // start all brokers again
+ Assert.assertTrue(PulsarClusterUtils.startAllBrokers(docker,
CLUSTER_NAME));
+
+ log.info("Read back the data (which would be in that first ledger)");
+ try(PulsarClient client = PulsarClient.create(serviceUrl);
+ Consumer consumer = client.subscribe(topic, "my-sub")) {
+ // read back from topic
+ for (int i = 0; i < ENTRIES_PER_LEDGER*1.5; i++) {
+ Message m = consumer.receive();
+ Assert.assertEquals("offload-message"+i, new
String(m.getData()));
+ }
+ }
+ }
+}
diff --git a/tests/integration/pom.xml
b/tests/integration/s3-offload/src/test/resources/arquillian.xml
similarity index 52%
copy from tests/integration/pom.xml
copy to tests/integration/s3-offload/src/test/resources/arquillian.xml
index 1245571..14714d2 100644
--- a/tests/integration/pom.xml
+++ b/tests/integration/s3-offload/src/test/resources/arquillian.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,14 @@
under the License.
-->
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <packaging>pom</packaging>
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.apache.pulsar.tests</groupId>
- <artifactId>tests-parent</artifactId>
- <version>2.1.0-incubating-SNAPSHOT</version>
- </parent>
+<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://jboss.org/schema/arquillian"
+ xsi:schemaLocation="http://jboss.org/schema/arquillian
+
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
- <groupId>org.apache.pulsar.tests</groupId>
- <artifactId>integration</artifactId>
- <name>Apache Pulsar :: Tests :: Integration</name>
- <modules>
- <module>smoke</module>
- <module>compaction</module>
- <module>cli</module>
- </modules>
-</project>
+ <extension qualifier="docker">
+ <property name="definitionFormat">CUBE</property>
+ <property
name="dockerContainersResource">cube-definitions/single-cluster-2-bookie-1-broker-unstarted-with-s3.yaml</property>
+ </extension>
+
+</arquillian>
--
To stop receiving notification emails like this one, please contact
[email protected].