[ https://issues.apache.org/jira/browse/GEODE-2632?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15967841#comment-15967841 ]
ASF GitHub Bot commented on GEODE-2632: --------------------------------------- Github user kirklund commented on a diff in the pull request: https://github.com/apache/geode/pull/450#discussion_r111432477 --- Diff: geode-core/src/jmh/java/org/apache/geode/internal/cache/tier/sockets/command/ClientCachePutBench.java --- @@ -0,0 +1,199 @@ +/* + * 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.geode.internal.cache.tier.sockets.command; + +import static java.lang.System.*; +import static java.util.concurrent.TimeUnit.*; +import static org.apache.commons.io.FileUtils.*; +import static org.apache.commons.lang.StringUtils.*; +import static org.apache.geode.cache.client.ClientRegionShortcut.*; +import static org.apache.geode.distributed.AbstractLauncher.Status.*; +import static org.apache.geode.distributed.ConfigurationProperties.*; +import static org.apache.geode.distributed.internal.DistributionConfig.*; +import static org.apache.geode.internal.AvailablePort.*; +import static org.apache.geode.test.dunit.NetworkUtils.*; +import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; + +import org.apache.geode.cache.Region; +import org.apache.geode.cache.client.ClientCache; +import org.apache.geode.cache.client.ClientCacheFactory; +import org.apache.geode.distributed.ServerLauncher; +import org.apache.geode.internal.process.ProcessStreamReader; +import org.junit.rules.TemporaryFolder; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +/** + * Benchmark that measures throughput of client performing puts to a loner server. + */ +@Measurement(iterations = 3, time = 3, timeUnit = MINUTES) +@Warmup(iterations = 3, time = 1, timeUnit = MINUTES) +@Fork(3) +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Thread) +@SuppressWarnings("unused") +public class ClientCachePutBench { + + static final long PROCESS_READER_TIMEOUT = 60 * 1000; + static final String CLASS_NAME = ClientCachePutBench.class.getSimpleName(); + static final String PACKAGE_NAME = + replace(ClientCachePutBench.class.getPackage().getName(), ".", "/"); + static final String REGION_NAME = CLASS_NAME + "-region"; + static final String SERVER_XML_NAME = "/" + PACKAGE_NAME + "/" + CLASS_NAME + "-server.xml"; + + @State(Scope.Benchmark) + public static class ClientState { + + Random random; + Region<String, String> region; + + private Process process; + private volatile ProcessStreamReader processOutReader; + private volatile ProcessStreamReader processErrReader; + + private int serverPort; + private ServerLauncher launcher; + private File serverDirectory; + private ClientCache clientCache; + + private TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Setup(Level.Trial) + public void startServer() throws Exception { + System.out.println("\n" + "[ClientCachePutBench] startServer"); + + this.random = new Random(nanoTime()); + + this.temporaryFolder.create(); + this.serverDirectory = this.temporaryFolder.getRoot(); + + startServerProcess(); + + try { + startProcessReaders(); + + ServerLauncher serverLauncher = new ServerLauncher.Builder() + .setWorkingDirectory(this.serverDirectory.getAbsolutePath()).build(); + + await("Starting server in " + this.serverDirectory).atMost(2, MINUTES) + .until(() -> assertThat(serverLauncher.status().getStatus()).isEqualTo(ONLINE)); + + this.clientCache = new ClientCacheFactory().set(LOG_LEVEL, "warn") + .addPoolServer(getIPLiteral(), this.serverPort).create(); + this.region = + this.clientCache.<String, String>createClientRegionFactory(PROXY).create(REGION_NAME); + + } finally { + stopProcessReaders(); + } + } + + private void startServerProcess() throws IOException { + File destServerXml = copyXmlToServerDirectory(); + + this.serverPort = getRandomAvailablePort(SOCKET); + + List<String> command = new ArrayList<>(); + command.add(new File(new File(getProperty("java.home"), "bin"), "java").getCanonicalPath()); + command.add("-D" + GEMFIRE_PREFIX + CACHE_XML_FILE + "=" + destServerXml.getAbsolutePath()); + command.add("-D" + GEMFIRE_PREFIX + MCAST_PORT + "=0"); + command.add("-D" + GEMFIRE_PREFIX + LOCATORS + "="); + command.add("-D" + GEMFIRE_PREFIX + LOG_LEVEL + "=warn"); + command.add("-cp"); + command.add(getProperty("java.class.path")); + command.add(ServerLauncher.class.getName()); + command.add(ServerLauncher.Command.START.getName()); + command.add("server1"); + command.add("--server-port=" + this.serverPort); + + System.out.println("[ClientCachePutBench] Launching server with command: " + command); + + this.process = new ProcessBuilder(command).directory(this.serverDirectory).start(); + } + + private File copyXmlToServerDirectory() throws IOException { + URL srcServerXml = getClass().getResource(SERVER_XML_NAME); + assertThat(srcServerXml).isNotNull(); + File destServerXml = new File(this.serverDirectory, SERVER_XML_NAME); + copyURLToFile(srcServerXml, destServerXml); + return destServerXml; + } + + private void startProcessReaders() { + this.processOutReader = + new ProcessStreamReader.Builder(this.process).inputStream(this.process.getInputStream()) + .inputListener((line) -> System.out.println("[ClientCachePutBench][stdout] " + line)) + .build().start(); + this.processErrReader = + new ProcessStreamReader.Builder(this.process).inputStream(this.process.getErrorStream()) + .inputListener((line) -> System.out.println("[ClientCachePutBench][stderr] " + line)) + .build().start(); + } + + private void stopProcessReaders() throws InterruptedException { + if (this.processOutReader != null) { + this.processOutReader.stop().join(PROCESS_READER_TIMEOUT); + } + if (this.processErrReader != null) { + this.processErrReader.stop().join(PROCESS_READER_TIMEOUT); + } + } + + @TearDown(Level.Trial) + public void stopServer() throws Exception { + System.out.println("\n" + "[ClientCachePutBench] stopServer"); + try { + this.clientCache.close(false); + new ServerLauncher.Builder().setWorkingDirectory(this.serverDirectory.getAbsolutePath()) + .build().stop(); + } finally { + if (this.process != null) { + this.process.destroyForcibly(); + } + this.temporaryFolder.delete(); + } + } + } + + @Benchmark + public String performPutFromClient(final ClientState state) throws Exception { + return state.region.put(createRandomString(state), createRandomString(state)); + } --- End diff -- What would you prefer to see for key and value? > Integrated Security performance improvements > -------------------------------------------- > > Key: GEODE-2632 > URL: https://issues.apache.org/jira/browse/GEODE-2632 > Project: Geode > Issue Type: Improvement > Components: security > Reporter: Jinmei Liao > Assignee: Kirk Lund > Labels: performance > > There is a security check in Put65.cmdExecute() that, if removed, improved > the performance. > The expense of this security call needs to be reduced in order to get the > performance back. -- This message was sent by Atlassian JIRA (v6.3.15#6346)