| package org.apache.bigtop.bigpetstore.qstream; |
| |
| import java.net.URL; |
| import java.nio.file.Paths; |
| import java.util.Random; |
| |
| /* |
| * 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. |
| */ |
| |
| /** |
| * Build a load generator based on command line args. |
| * This class decides, i.e. wether to use HTTP, FileLoadGen, and so on. |
| * |
| * We avoided using reflection for this, for all the obvious reasons :). |
| */ |
| public class LoadGenFactory { |
| |
| static final String[] DEFAULT = new String[]{"/tmp","1000","100000","1500","13241234"}; |
| static final String DEFAULT_EXPECTED = "10 to 25K transactions per second on i7 chip w/ SSD"; |
| |
| public static void printUsage() { |
| String usage = |
| "BigPetStore Data Generator.\n" + |
| "Usage: outputDir nStores nCustomers simulationLength [seed]\n" + |
| "outputDir - (string) directory to write files\n" + |
| "nStores - (int) number of stores to generate\n" + |
| "nCustomers - (int) number of customers to generate\n" + |
| "simulationLength - (float) number of days to simulate\n" + |
| "seed - (long) seed for RNG. If not given, one is reandomly generated.\n"; |
| System.err.println(usage); |
| } |
| |
| public static LoadGen parseArgs(String[] args) throws Throwable { |
| if(args.length==0){ |
| System.out.println("Running default simulation, which should result in " + DEFAULT_EXPECTED); |
| return parseArgs(DEFAULT); |
| } |
| int nStores = 1000; |
| int nCustomers = 1000; |
| double simulationLength = -1; |
| long seed = System.currentTimeMillis(); |
| String outputARG = "/shared"; |
| |
| int PARAMS=5; |
| if (args.length != PARAMS && args.length != (PARAMS - 1)) { |
| printUsage(); |
| System.exit(1); |
| } |
| //Was Dir, now ARG, since we can support http or file paths. |
| outputARG = args[0]; |
| try { |
| nStores = Integer.parseInt(args[1]); |
| } catch (Throwable t) { |
| System.err.println("Unable to parse '" + args[1] + "' as an integer for nStores.\n"); |
| printUsage(); |
| System.exit(1); |
| } |
| try { |
| nCustomers = Integer.parseInt(args[2]); |
| } catch (Throwable t) { |
| System.err.println("Unable to parse '" + args[2] + "' as an integer for nCustomers.\n"); |
| printUsage(); |
| System.exit(1); |
| } |
| try { |
| simulationLength = Double.parseDouble(args[3]); |
| } catch (Throwable t) { |
| System.err.println("Unable to parse '" + args[3] + "' as a float for simulationLength.\n"); |
| printUsage(); |
| System.exit(1); |
| } |
| |
| //If seed isnt present, then no is used seed. |
| if (args.length == PARAMS) { |
| try { |
| seed = Long.parseLong(args[4]); |
| } catch (Throwable t) { |
| System.err.println("Unable to parse '" + args[4] + "' as a long for seed.\n"); |
| printUsage(); |
| System.exit(1); |
| } |
| } else { |
| seed = new Random().nextLong(); |
| } |
| if(outputARG.startsWith("http://")){ |
| return new HttpLoadGen(nStores,nCustomers,simulationLength,seed, new URL(outputARG)); |
| } |
| else{ |
| return new FileLoadGen(nStores,nCustomers,simulationLength,seed, Paths.get(outputARG)); |
| } |
| } |
| } |