diff --git a/src/main/java/de/flapdoodle/embed/mongo/config/IMongoCmdOptions.java b/src/main/java/de/flapdoodle/embed/mongo/config/IMongoCmdOptions.java index e4b30ad93d85831db7d8a8c652214ff38e1e02a6..3053aa1373ba62ddb25636f37c5375e663a0c9f8 100644 --- a/src/main/java/de/flapdoodle/embed/mongo/config/IMongoCmdOptions.java +++ b/src/main/java/de/flapdoodle/embed/mongo/config/IMongoCmdOptions.java @@ -26,4 +26,10 @@ public interface IMongoCmdOptions { Integer syncDelay(); boolean isVerbose(); + + boolean useNoPrealloc(); + + boolean useSmallFiles(); + + boolean useNoJournal(); } diff --git a/src/main/java/de/flapdoodle/embed/mongo/config/MongoCmdOptionsBuilder.java b/src/main/java/de/flapdoodle/embed/mongo/config/MongoCmdOptionsBuilder.java index 4cd9d229bb6aee292f80880d1bb514e175fd9631..eb9f0e9ea66ad25f11e0c68942001e19986c2d94 100644 --- a/src/main/java/de/flapdoodle/embed/mongo/config/MongoCmdOptionsBuilder.java +++ b/src/main/java/de/flapdoodle/embed/mongo/config/MongoCmdOptionsBuilder.java @@ -28,13 +28,33 @@ public class MongoCmdOptionsBuilder extends AbstractBuilder<IMongoCmdOptions> { protected static final TypedProperty<Integer> SYNC_DELAY = TypedProperty.with("syncDelay", Integer.class); protected static final TypedProperty<Boolean> VERBOSE = TypedProperty.with("verbose", Boolean.class); + protected static final TypedProperty<Boolean> NOPREALLOC = TypedProperty.with("noprealloc", Boolean.class); + protected static final TypedProperty<Boolean> SMALLFILES = TypedProperty.with("smallfiles", Boolean.class); + protected static final TypedProperty<Boolean> NOJOURNAL = TypedProperty.with("nojournal", Boolean.class); - public MongoCmdOptionsBuilder() { property(SYNC_DELAY).setDefault(0); property(VERBOSE).setDefault(false); + property(NOPREALLOC).setDefault(true); + property(SMALLFILES).setDefault(true); + property(NOJOURNAL).setDefault(true); } - + + public MongoCmdOptionsBuilder useNoPrealloc(boolean value) { + set(NOPREALLOC, value); + return this; + } + + public MongoCmdOptionsBuilder useSmallFiles(boolean value) { + set(SMALLFILES, value); + return this; + } + + public MongoCmdOptionsBuilder useNoJournal(boolean value) { + set(NOJOURNAL, value); + return this; + } + public MongoCmdOptionsBuilder syncDelay(int delay) { set(SYNC_DELAY, delay); return this; @@ -45,38 +65,63 @@ public class MongoCmdOptionsBuilder extends AbstractBuilder<IMongoCmdOptions> { return this; } - public MongoCmdOptionsBuilder defaultSyncDeplay() { + public MongoCmdOptionsBuilder defaultSyncDelay() { set(SYNC_DELAY, null); return this; } - + @Override public IMongoCmdOptions build() { - Integer syncDelay=get(SYNC_DELAY, null); - boolean verbose=get(VERBOSE); - return new MongoCmdOptions(syncDelay,verbose); + Integer syncDelay = get(SYNC_DELAY, null); + boolean verbose = get(VERBOSE); + boolean noPrealloc = get(NOPREALLOC); + boolean smallFiles = get(SMALLFILES); + boolean noJournal = get(NOJOURNAL); + return new MongoCmdOptions(syncDelay, verbose, noPrealloc, smallFiles, noJournal); } static class MongoCmdOptions implements IMongoCmdOptions { private final Integer _syncDelay; private final boolean _verbose; + private final boolean _noPrealloc; + private final boolean _smallFiles; + private final boolean _noJournal; + - - public MongoCmdOptions(Integer syncDelay,boolean verbose) { + public MongoCmdOptions(Integer syncDelay, boolean verbose, boolean noPrealloc, boolean smallFiles, + boolean noJournal) { _syncDelay = syncDelay; _verbose = verbose; + _noPrealloc = noPrealloc; + _smallFiles = smallFiles; + _noJournal = noJournal; } - + @Override public Integer syncDelay() { return _syncDelay; } - + @Override public boolean isVerbose() { return _verbose; } - + + @Override + public boolean useNoPrealloc() { + return _noPrealloc; + } + + @Override + public boolean useSmallFiles() { + return _smallFiles; + } + + @Override + public boolean useNoJournal() { + return _noJournal; + } + } } diff --git a/src/main/java/de/flapdoodle/embed/mongo/runtime/Mongod.java b/src/main/java/de/flapdoodle/embed/mongo/runtime/Mongod.java index aa684c3fecd6c0a905ff318e5ad3a37808cdc749..f02ce5f79ddf147be9d001b18cee1672cdcb80f6 100644 --- a/src/main/java/de/flapdoodle/embed/mongo/runtime/Mongod.java +++ b/src/main/java/de/flapdoodle/embed/mongo/runtime/Mongod.java @@ -20,6 +20,15 @@ */ package de.flapdoodle.embed.mongo.runtime; +import de.flapdoodle.embed.mongo.Command; +import de.flapdoodle.embed.mongo.config.IMongoCmdOptions; +import de.flapdoodle.embed.mongo.config.IMongodConfig; +import de.flapdoodle.embed.mongo.config.SupportConfig; +import de.flapdoodle.embed.mongo.distribution.Feature; +import de.flapdoodle.embed.process.distribution.Distribution; +import de.flapdoodle.embed.process.extract.IExtractedFileSet; +import de.flapdoodle.embed.process.runtime.NUMA; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -36,15 +45,6 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; -import de.flapdoodle.embed.mongo.Command; -import de.flapdoodle.embed.mongo.config.IMongoCmdOptions; -import de.flapdoodle.embed.mongo.config.IMongodConfig; -import de.flapdoodle.embed.mongo.config.SupportConfig; -import de.flapdoodle.embed.mongo.distribution.Feature; -import de.flapdoodle.embed.process.distribution.Distribution; -import de.flapdoodle.embed.process.extract.IExtractedFileSet; -import de.flapdoodle.embed.process.runtime.NUMA; - /** * */ @@ -123,23 +123,33 @@ public class Mongod extends AbstractMongo { public static List<String> getCommandLine(IMongodConfig config, IExtractedFileSet files, File dbDir) throws UnknownHostException { List<String> ret = new ArrayList<String>(); - ret.addAll(Arrays.asList(files.executable().getAbsolutePath(), + ret.addAll(Arrays.asList(files.executable().getAbsolutePath(), "--dbpath", - "" + dbDir.getAbsolutePath(), "--noprealloc", "--smallfiles", "--nojournal", + "" + dbDir.getAbsolutePath(), "--noauth")); - + + if (config.cmdOptions().useNoPrealloc()) { + ret.add("--noprealloc"); + } + if (config.cmdOptions().useSmallFiles()) { + ret.add("--smallfiles"); + } + if (config.cmdOptions().useNoJournal()) { + ret.add("--nojournal"); + } + if (config.cmdOptions().isVerbose()) { ret.add("-v"); } - + applyDefaultOptions(config, ret); applyNet(config.net(), ret); - - if (config.replication().getReplSetName()!=null) { + + if (config.replication().getReplSetName() != null) { ret.add("--replSet"); ret.add(config.replication().getReplSetName()); } - if (config.replication().getOplogSize()!=0) { + if (config.replication().getOplogSize() != 0) { ret.add("--oplogSize"); ret.add(String.valueOf(config.replication().getOplogSize())); } @@ -152,17 +162,17 @@ public class Mongod extends AbstractMongo { return ret; } - + private static void applySyncDelay(List<String> ret, IMongoCmdOptions cmdOptions) { - Integer syncDelay=cmdOptions.syncDelay(); - if (syncDelay!=null) { - ret.add("--syncdelay="+syncDelay); + Integer syncDelay = cmdOptions.syncDelay(); + if (syncDelay != null) { + ret.add("--syncdelay=" + syncDelay); } } public static List<String> enhanceCommandLinePlattformSpecific(Distribution distribution, List<String> commands) { - if (NUMA.isNUMA(new SupportConfig(Command.MongoD),distribution.getPlatform())) { + if (NUMA.isNUMA(new SupportConfig(Command.MongoD), distribution.getPlatform())) { switch (distribution.getPlatform()) { case Linux: List<String> ret = new ArrayList<String>(); diff --git a/src/test/java/de/flapdoodle/embed/mongo/examples/TestExampleReadMeCode.java b/src/test/java/de/flapdoodle/embed/mongo/examples/TestExampleReadMeCode.java index a0e70bae7d75043048664629e21ab504531b15c8..dd1f12a9b54564ca2684f446ccc35d50abe705f2 100644 --- a/src/test/java/de/flapdoodle/embed/mongo/examples/TestExampleReadMeCode.java +++ b/src/test/java/de/flapdoodle/embed/mongo/examples/TestExampleReadMeCode.java @@ -77,9 +77,9 @@ public class TestExampleReadMeCode extends TestCase { // -> int port = 12345; IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .net(new Net(port, Network.localhostIsIPv6())) - .build(); + .version(Version.Main.PRODUCTION) + .net(new Net(port, Network.localhostIsIPv6())) + .build(); MongodStarter runtime = MongodStarter.getDefaultInstance(); @@ -105,21 +105,21 @@ public class TestExampleReadMeCode extends TestCase { // -> int port = 12345; IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .net(new Net(port, Network.localhostIsIPv6())) - .build(); + .version(Version.Main.PRODUCTION) + .net(new Net(port, Network.localhostIsIPv6())) + .build(); Command command = Command.MongoD; - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(command) - .artifactStore(new ArtifactStoreBuilder() .defaults(command) - .download(new DownloadConfigBuilder() - .defaultsForCommand(command)) - .executableNaming(new UserTempNaming())) - .build(); - + .artifactStore(new ArtifactStoreBuilder() + .defaults(command) + .download(new DownloadConfigBuilder() + .defaultsForCommand(command)) + .executableNaming(new UserTempNaming())) + .build(); + MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); MongodExecutable mongodExecutable = null; @@ -165,21 +165,21 @@ public class TestExampleReadMeCode extends TestCase { // ... // <- } - + // ### Customize Download URL public void testCustomizeDownloadURL() { // -> // ... Command command = Command.MongoD; - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(command) - .artifactStore(new ArtifactStoreBuilder() .defaults(command) - .download(new DownloadConfigBuilder() - .defaultsForCommand(command) - .downloadPath("http://my.custom.download.domain/"))) - .build(); + .artifactStore(new ArtifactStoreBuilder() + .defaults(command) + .download(new DownloadConfigBuilder() + .defaultsForCommand(command) + .downloadPath("http://my.custom.download.domain/"))) + .build(); // ... // <- } @@ -188,9 +188,9 @@ public class TestExampleReadMeCode extends TestCase { public void testCustomizeArtifactStorage() throws IOException { IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .net(new Net(12345, Network.localhostIsIPv6())) - .build(); + .version(Version.Main.PRODUCTION) + .net(new Net(12345, Network.localhostIsIPv6())) + .build(); // -> // ... @@ -198,16 +198,16 @@ public class TestExampleReadMeCode extends TestCase { ITempNaming executableNaming = new UUIDTempNaming(); Command command = Command.MongoD; - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(command) - .artifactStore(new ArtifactStoreBuilder() .defaults(command) - .download(new DownloadConfigBuilder() - .defaultsForCommand(command) - .artifactStorePath(artifactStorePath)) - .executableNaming(executableNaming)) - .build(); + .artifactStore(new ArtifactStoreBuilder() + .defaults(command) + .download(new DownloadConfigBuilder() + .defaultsForCommand(command) + .artifactStorePath(artifactStorePath)) + .executableNaming(executableNaming)) + .build(); MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); MongodExecutable mongodExe = runtime.prepare(mongodConfig); @@ -226,12 +226,12 @@ public class TestExampleReadMeCode extends TestCase { // ... ProcessOutput processOutput = new ProcessOutput(Processors.namedConsole("[mongod>]"), Processors.namedConsole("[MONGOD>]"), Processors.namedConsole("[console>]")); - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(Command.MongoD) - .processOutput(processOutput) - .build(); - + .defaults(Command.MongoD) + .processOutput(processOutput) + .build(); + MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); // ... // <- @@ -247,10 +247,10 @@ public class TestExampleReadMeCode extends TestCase { IStreamProcessor commandsOutput = Processors.namedConsole("[console>]"); IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(Command.MongoD) - .processOutput(new ProcessOutput(mongodOutput, mongodError, commandsOutput)) - .build(); - + .defaults(Command.MongoD) + .processOutput(new ProcessOutput(mongodOutput, mongodError, commandsOutput)) + .build(); + MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); // ... // <- @@ -260,36 +260,36 @@ public class TestExampleReadMeCode extends TestCase { * Ist fÞrs Readme, deshalb nicht statisch und public */ // -> - - // ... - public class FileStreamProcessor implements IStreamProcessor { - - private FileOutputStream outputStream; - - public FileStreamProcessor(File file) throws FileNotFoundException { - outputStream = new FileOutputStream(file); - } - - @Override - public void process(String block) { - try { - outputStream.write(block.getBytes()); - } catch (IOException e) { - e.printStackTrace(); - } + + // ... + public class FileStreamProcessor implements IStreamProcessor { + + private FileOutputStream outputStream; + + public FileStreamProcessor(File file) throws FileNotFoundException { + outputStream = new FileOutputStream(file); + } + + @Override + public void process(String block) { + try { + outputStream.write(block.getBytes()); + } catch (IOException e) { + e.printStackTrace(); } - - @Override - public void onProcessed() { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } + } + + @Override + public void onProcessed() { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); } - } - // ... + + } + // ... // <- // #### ... to java logging @@ -300,16 +300,16 @@ public class TestExampleReadMeCode extends TestCase { ProcessOutput processOutput = new ProcessOutput(Processors.logTo(logger, Level.INFO), Processors.logTo(logger, Level.SEVERE), Processors.named("[console>]", Processors.logTo(logger, Level.FINE))); - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaultsWithLogger(Command.MongoD,logger) - .processOutput(processOutput) - .artifactStore(new ArtifactStoreBuilder() - .defaults(Command.MongoD) - .download(new DownloadConfigBuilder() - .defaultsForCommand(Command.MongoD) - .progressListener(new LoggingProgressListener(logger, Level.FINE)))) - .build(); + .defaultsWithLogger(Command.MongoD, logger) + .processOutput(processOutput) + .artifactStore(new ArtifactStoreBuilder() + .defaults(Command.MongoD) + .download(new DownloadConfigBuilder() + .defaultsForCommand(Command.MongoD) + .progressListener(new LoggingProgressListener(logger, Level.FINE)))) + .build(); MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); // ... @@ -321,11 +321,11 @@ public class TestExampleReadMeCode extends TestCase { // -> // ... Logger logger = Logger.getLogger(getClass().getName()); - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaultsWithLogger(Command.MongoD, logger) - .build(); - + .defaultsWithLogger(Command.MongoD, logger) + .build(); + MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); // ... // <- @@ -335,18 +335,18 @@ public class TestExampleReadMeCode extends TestCase { public void testDefaultOutputToNone() throws FileNotFoundException, IOException { int port = 12345; IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Versions.withFeatures(new GenericVersion("2.0.7-rc1"),Feature.SYNC_DELAY)) - .net(new Net(port, Network.localhostIsIPv6())) - .build(); + .version(Versions.withFeatures(new GenericVersion("2.0.7-rc1"), Feature.SYNC_DELAY)) + .net(new Net(port, Network.localhostIsIPv6())) + .build(); // -> // ... Logger logger = Logger.getLogger(getClass().getName()); - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaultsWithLogger(Command.MongoD, logger) - .processOutput(ProcessOutput.getDefaultInstanceSilent()) - .build(); - + .defaultsWithLogger(Command.MongoD, logger) + .processOutput(ProcessOutput.getDefaultInstanceSilent()) + .build(); + MongodStarter runtime = MongodStarter.getInstance(runtimeConfig); // ... // <- @@ -377,9 +377,9 @@ public class TestExampleReadMeCode extends TestCase { // ... int port = 12345; IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Versions.withFeatures(new GenericVersion("2.0.7-rc1"),Feature.SYNC_DELAY)) - .net(new Net(port, Network.localhostIsIPv6())) - .build(); + .version(Versions.withFeatures(new GenericVersion("2.0.7-rc1"), Feature.SYNC_DELAY)) + .net(new Net(port, Network.localhostIsIPv6())) + .build(); MongodStarter runtime = MongodStarter.getDefaultInstance(); MongodProcess mongod = null; @@ -451,7 +451,8 @@ public class TestExampleReadMeCode extends TestCase { mongodExecutable = runtime.prepare(mongodConfig); mongod = mongodExecutable.start(); - MongoClient mongo = new MongoClient(new ServerAddress(mongodConfig.net().getServerAddress(), mongodConfig.net().getPort())); + MongoClient mongo = new MongoClient( + new ServerAddress(mongodConfig.net().getServerAddress(), mongodConfig.net().getPort())); // <- DB db = mongo.getDB("test"); DBCollection col = db.createCollection("testCol", new BasicDBObject()); @@ -475,32 +476,32 @@ public class TestExampleReadMeCode extends TestCase { // -> // ... IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .timeout(new Timeout(30000)) - .build(); + .version(Version.Main.PRODUCTION) + .timeout(new Timeout(30000)) + .build(); // ... // <- } - + // ### Command Line Post Processing public void testCommandLinePostProcessing() { // -> // ... - ICommandLinePostProcessor postProcessor= // ... - // <- - new ICommandLinePostProcessor() { - @Override - public List<String> process(Distribution distribution, List<String> args) { - return null; - } - }; + ICommandLinePostProcessor postProcessor = // ... + // <- + new ICommandLinePostProcessor() { + @Override + public List<String> process(Distribution distribution, List<String> args) { + return null; + } + }; // -> - + IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(Command.MongoD) - .commandLinePostProcessor(postProcessor) - .build(); + .defaults(Command.MongoD) + .commandLinePostProcessor(postProcessor) + .build(); // ... // <- } @@ -514,16 +515,19 @@ public class TestExampleReadMeCode extends TestCase { public void testCommandLineOptions() throws UnknownHostException, IOException { // -> IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .cmdOptions(new MongoCmdOptionsBuilder() - .syncDelay(10) - .build()) - .build(); + .version(Version.Main.PRODUCTION) + .cmdOptions(new MongoCmdOptionsBuilder() + .syncDelay(10) + .useNoPrealloc(false) + .useSmallFiles(false) + .useNoJournal(false) + .build()) + .build(); // ... // <- - + } - + // ### Snapshot database files from temp dir /* // -> @@ -531,22 +535,20 @@ public class TestExampleReadMeCode extends TestCase { // <- */ public void testSnapshotDbFiles() throws UnknownHostException, IOException { - File destination=null; + File destination = null; // -> IMongodConfig mongodConfig = new MongodConfigBuilder() - .version(Version.Main.PRODUCTION) - .processListener(new ProcessListenerBuilder() - .copyDbFilesBeforeStopInto(destination) - .build()) - .cmdOptions(new MongoCmdOptionsBuilder() - .defaultSyncDeplay() - .build()) - .build(); + .version(Version.Main.PRODUCTION) + .processListener(new ProcessListenerBuilder() + .copyDbFilesBeforeStopInto(destination) + .build()) + .cmdOptions(new MongoCmdOptionsBuilder() + .defaultSyncDelay() + .build()) + .build(); // ... // <- } - - // ### Start mongos with mongod instance // @include StartConfigAndMongoDBServerTest.java }