com.jivesoftware.os.amza.service.AmzaGetStress.java Source code

Java tutorial

Introduction

Here is the source code for com.jivesoftware.os.amza.service.AmzaGetStress.java

Source

/*
 * Copyright 2013 Jive Software, Inc
 *
 * Licensed 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 com.jivesoftware.os.amza.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.google.common.base.Charsets;
import com.google.common.collect.Sets;
import com.google.common.io.BaseEncoding;
import de.svenjacobs.loremipsum.LoremIpsum;
import java.io.IOException;
import java.util.Random;
import java.util.Set;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class AmzaGetStress {

    private static final Random rand = new Random();
    private static final LoremIpsum loremIpsum = new LoremIpsum();
    private static final ObjectMapper mapper = new ObjectMapper();

    public static void main(String[] args) throws IOException {

        args = new String[] { "soa-integ-data11.phx1.jivehosted.com", "1185", "1", "10000" };

        final String hostName = args[0];
        final int port = Integer.parseInt(args[1]);
        final int firstDocId = Integer.parseInt(args[2]);
        final int count = Integer.parseInt(args[3]);
        final int batchSize = 100;

        String partitionName = "lorem";

        for (int i = 0; i < 1024; i++) {
            final String rname = partitionName + i;
            final org.apache.http.client.HttpClient httpClient = HttpClients.createDefault();

            Thread t = new Thread() {
                @Override
                public void run() {
                    try {
                        get(httpClient, hostName, port, rname, 0, count, batchSize);
                    } catch (Exception x) {
                        x.printStackTrace();
                    }
                }
            };
            t.start();
        }
    }

    private static void get(org.apache.http.client.HttpClient httpClient, String hostName, int port,
            String partitionName, int firstDocId, int count, int batchSize)
            throws IOException, InterruptedException {
        long start = System.currentTimeMillis();
        for (int key = firstDocId; key < count; key++) {
            StringBuilder url = new StringBuilder();
            url.append("http://");
            url.append(hostName).append(":").append(port);
            url.append("/amza/get");
            url.append("?partition=").append(partitionName);
            url.append("&key=");

            Set<String> expectedValues = Sets.newHashSet();
            for (int b = 0; b < batchSize; b++) {
                if (b > 0) {
                    url.append(',');
                }
                url.append(b).append('k').append(key);
                expectedValues.add(b + "v" + key);
            }

            while (true) {
                HttpGet method = new HttpGet(url.toString());
                StatusLine statusLine;
                try {
                    try {
                        HttpResponse response = httpClient.execute(method);

                        statusLine = response.getStatusLine();
                        if (statusLine.getStatusCode() == 200) {
                            //System.out.println("Got:" + new String(method.getResponseBody()));
                            ArrayNode node = mapper.readValue(EntityUtils.toString(response.getEntity()),
                                    ArrayNode.class);
                            for (JsonNode value : node) {
                                if (!value.isNull()) {
                                    expectedValues.remove(new String(
                                            BaseEncoding.base64().decode(value.textValue()), Charsets.UTF_8));
                                }
                            }
                            if (!expectedValues.isEmpty()) {
                                System.out.println("Missing values in " + partitionName + " for key " + key + ": "
                                        + expectedValues);
                            }
                            break;
                        }
                    } catch (Exception x) {
                        x.printStackTrace();
                    }
                    Thread.sleep(1000);
                } finally {
                    method.releaseConnection();
                }
            }

            if (key % 100 == 0) {
                long elapse = System.currentTimeMillis() - start;
                double millisPerAdd = ((double) elapse / (double) key);
                System.out.println(partitionName + " millisPerGet:" + millisPerAdd + " getsPerSec:"
                        + (1000d / millisPerAdd) + " key:" + key);
            }
        }
    }

}