Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 1a68385

Browse files
committed
#203 New properties for configuring the data/fast/large forest directories
1 parent 15738d6 commit 1a68385

File tree

8 files changed

+358
-22
lines changed

8 files changed

+358
-22
lines changed

src/main/java/com/marklogic/appdeployer/AppConfig.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,19 @@ public class AppConfig {
149149
// Comma-delimited string used for configuring forest replicas
150150
private String databaseNamesAndReplicaCounts;
151151

152+
// Data/fast/large directories for default forests
153+
private String forestDataDirectory;
154+
private String forestFastDataDirectory;
155+
private String forestLargeDataDirectory;
156+
157+
// Comma-delimited string of database names and data directories
158+
private Map<String, String> databaseDataDirectories;
159+
private Map<String, String> databaseFastDataDirectories;
160+
private Map<String, String> databaseLargeDataDirectories;
161+
private Map<String, String> databaseReplicaDataDirectories;
162+
private Map<String, String> databaseReplicaFastDataDirectories;
163+
private Map<String, String> databaseReplicaLargeDataDirectories;
164+
152165
// Configures the data-directory for replica forests built dynamically
153166
private String replicaForestDataDirectory;
154167
private String replicaForestLargeDataDirectory;
@@ -942,4 +955,76 @@ public int getModulesLoaderThreadCount() {
942955
public void setModulesLoaderThreadCount(int modulesLoaderThreadCount) {
943956
this.modulesLoaderThreadCount = modulesLoaderThreadCount;
944957
}
958+
959+
public Map<String, String> getDatabaseDataDirectories() {
960+
return databaseDataDirectories;
961+
}
962+
963+
public void setDatabaseDataDirectories(Map<String, String> databaseDataDirectories) {
964+
this.databaseDataDirectories = databaseDataDirectories;
965+
}
966+
967+
public Map<String, String> getDatabaseFastDataDirectories() {
968+
return databaseFastDataDirectories;
969+
}
970+
971+
public void setDatabaseFastDataDirectories(Map<String, String> databaseFastDataDirectories) {
972+
this.databaseFastDataDirectories = databaseFastDataDirectories;
973+
}
974+
975+
public Map<String, String> getDatabaseLargeDataDirectories() {
976+
return databaseLargeDataDirectories;
977+
}
978+
979+
public void setDatabaseLargeDataDirectories(Map<String, String> databaseLargeDataDirectories) {
980+
this.databaseLargeDataDirectories = databaseLargeDataDirectories;
981+
}
982+
983+
public String getForestDataDirectory() {
984+
return forestDataDirectory;
985+
}
986+
987+
public void setForestDataDirectory(String forestDataDirectory) {
988+
this.forestDataDirectory = forestDataDirectory;
989+
}
990+
991+
public String getForestFastDataDirectory() {
992+
return forestFastDataDirectory;
993+
}
994+
995+
public void setForestFastDataDirectory(String forestFastDataDirectory) {
996+
this.forestFastDataDirectory = forestFastDataDirectory;
997+
}
998+
999+
public String getForestLargeDataDirectory() {
1000+
return forestLargeDataDirectory;
1001+
}
1002+
1003+
public void setForestLargeDataDirectory(String forestLargeDataDirectory) {
1004+
this.forestLargeDataDirectory = forestLargeDataDirectory;
1005+
}
1006+
1007+
public Map<String, String> getDatabaseReplicaDataDirectories() {
1008+
return databaseReplicaDataDirectories;
1009+
}
1010+
1011+
public void setDatabaseReplicaDataDirectories(Map<String, String> databaseReplicaDataDirectories) {
1012+
this.databaseReplicaDataDirectories = databaseReplicaDataDirectories;
1013+
}
1014+
1015+
public Map<String, String> getDatabaseReplicaFastDataDirectories() {
1016+
return databaseReplicaFastDataDirectories;
1017+
}
1018+
1019+
public void setDatabaseReplicaFastDataDirectories(Map<String, String> databaseReplicaFastDataDirectories) {
1020+
this.databaseReplicaFastDataDirectories = databaseReplicaFastDataDirectories;
1021+
}
1022+
1023+
public Map<String, String> getDatabaseReplicaLargeDataDirectories() {
1024+
return databaseReplicaLargeDataDirectories;
1025+
}
1026+
1027+
public void setDatabaseReplicaLargeDataDirectories(Map<String, String> databaseReplicaLargeDataDirectories) {
1028+
this.databaseReplicaLargeDataDirectories = databaseReplicaLargeDataDirectories;
1029+
}
9451030
}

src/main/java/com/marklogic/appdeployer/DefaultAppConfigFactory.java

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import com.marklogic.mgmt.util.PropertySourceFactory;
77

88
import java.io.File;
9-
import java.util.ArrayList;
10-
import java.util.Arrays;
11-
import java.util.List;
9+
import java.util.*;
1210
import java.util.regex.Pattern;
1311

1412
public class DefaultAppConfigFactory extends PropertySourceFactory implements AppConfigFactory {
@@ -266,24 +264,78 @@ public AppConfig newAppConfig() {
266264
c.setDatabaseNamesAndReplicaCounts(prop);
267265
}
268266

267+
prop = getProperty("mlForestDataDirectory");
268+
if (prop != null) {
269+
logger.info("Default forest data directory for all databases: " + prop);
270+
c.setForestDataDirectory(prop);
271+
}
272+
273+
prop = getProperty("mlForestFastDataDirectory");
274+
if (prop != null) {
275+
logger.info("Default forest fast data directory for all databases: " + prop);
276+
c.setForestFastDataDirectory(prop);
277+
}
278+
279+
prop = getProperty("mlForestLargeDataDirectory");
280+
if (prop != null) {
281+
logger.info("Default forest large data directory for all databases: " + prop);
282+
c.setForestLargeDataDirectory(prop);
283+
}
284+
269285
prop = getProperty("mlReplicaForestDataDirectory");
270286
if (prop != null) {
271-
logger.info("Replica forest data directory " + prop);
287+
logger.info("Default replica forest data directory for all databases: " + prop);
272288
c.setReplicaForestDataDirectory(prop);
273289
}
274290

275291
prop = getProperty("mlReplicaForestLargeDataDirectory");
276292
if (prop != null) {
277-
logger.info("Replica forest large data directory " + prop);
293+
logger.info("Default replica forest large data directory for all databases: " + prop);
278294
c.setReplicaForestLargeDataDirectory(prop);
279295
}
280296

281297
prop = getProperty("mlReplicaForestFastDataDirectory");
282298
if (prop != null) {
283-
logger.info("Replica forest fast data directory " + prop);
299+
logger.info("Default replica forest fast data directory for all databases: " + prop);
284300
c.setReplicaForestFastDataDirectory(prop);
285301
}
286302

303+
prop = getProperty("mlDatabaseDataDirectories");
304+
if (prop != null) {
305+
logger.info("Databases and forest data directories: " + prop);
306+
c.setDatabaseDataDirectories(buildMapFromCommaDelimitedString(prop));
307+
}
308+
309+
prop = getProperty("mlDatabaseFastDataDirectories");
310+
if (prop != null) {
311+
logger.info("Databases and forest fast data directories: " + prop);
312+
c.setDatabaseFastDataDirectories(buildMapFromCommaDelimitedString(prop));
313+
}
314+
315+
prop = getProperty("mlDatabaseLargeDataDirectories");
316+
if (prop != null) {
317+
logger.info("Databases and forest large data directories: " + prop);
318+
c.setDatabaseLargeDataDirectories(buildMapFromCommaDelimitedString(prop));
319+
}
320+
321+
prop = getProperty("mlDatabaseReplicaDataDirectories");
322+
if (prop != null) {
323+
logger.info("Databases and replica forest data directories: " + prop);
324+
c.setDatabaseReplicaDataDirectories(buildMapFromCommaDelimitedString(prop));
325+
}
326+
327+
prop = getProperty("mlDatabaseReplicaFastDataDirectories");
328+
if (prop != null) {
329+
logger.info("Databases and replica forest fast data directories: " + prop);
330+
c.setDatabaseReplicaFastDataDirectories(buildMapFromCommaDelimitedString(prop));
331+
}
332+
333+
prop = getProperty("mlDatabaseReplicaLargeDataDirectories");
334+
if (prop != null) {
335+
logger.info("Databases and replica forest large data directories: " + prop);
336+
c.setDatabaseReplicaLargeDataDirectories(buildMapFromCommaDelimitedString(prop));
337+
}
338+
287339
/**
288340
* When undo is invoked on DeployDatabaseCommand (such as via mlUndeploy in ml-gradle), this controls whether
289341
* or not forests are deleted, or just their configuration is deleted. If mlDeleteReplicas is set to true, this
@@ -544,4 +596,12 @@ public AppConfig newAppConfig() {
544596
return c;
545597
}
546598

599+
protected Map<String, String> buildMapFromCommaDelimitedString(String str) {
600+
Map<String, String> map = new HashMap<>();
601+
String[] tokens = str.split(",");
602+
for (int i = 0; i < tokens.length; i += 2) {
603+
map.put(tokens[i], tokens[i + 1]);
604+
}
605+
return map;
606+
}
547607
}

src/main/java/com/marklogic/appdeployer/command/databases/DeployDatabaseCommand.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import com.marklogic.appdeployer.command.forests.DeployForestsCommand;
99
import com.marklogic.mgmt.PayloadParser;
1010
import com.marklogic.mgmt.SaveReceipt;
11+
import com.marklogic.mgmt.api.forest.Forest;
1112
import com.marklogic.mgmt.resource.databases.DatabaseManager;
13+
import com.marklogic.mgmt.util.ObjectMapperFactory;
1214

1315
import java.io.File;
1416
import java.util.ArrayList;
@@ -289,15 +291,54 @@ protected boolean customForestsExist(CommandContext context, String dbName) {
289291
*/
290292
protected DeployForestsCommand buildDeployForestsCommand(String dbPayload, SaveReceipt receipt,
291293
CommandContext context) {
294+
final String databaseName = receipt.getResourceId();
295+
292296
DeployForestsCommand c = new DeployForestsCommand();
293297
c.setCreateForestsOnEachHost(createForestsOnEachHost);
294298
c.setForestsPerHost(determineForestCountPerHost(dbPayload, context));
295299
c.setForestFilename(forestFilename);
296-
c.setDatabaseName(receipt.getResourceId());
297-
c.setForestPayload(DeployForestsCommand.DEFAULT_FOREST_PAYLOAD);
300+
c.setDatabaseName(databaseName);
301+
302+
Forest forest = buildForest(context.getAppConfig());
303+
forest.setObjectMapper(ObjectMapperFactory.getObjectMapper());
304+
c.setForestPayload(forest.getJson());
298305
return c;
299306
}
300307

308+
protected Forest buildForest(AppConfig config) {
309+
Forest forest = new Forest();
310+
forest.setForestName("%%FOREST_NAME%%");
311+
forest.setHost("%%FOREST_HOST%%");
312+
forest.setDatabase("%%FOREST_DATABASE%%");
313+
314+
// First see if we have any database-agnostic forest directories
315+
if (config.getForestDataDirectory() != null) {
316+
forest.setDataDirectory(config.getForestDataDirectory());
317+
}
318+
if (config.getForestFastDataDirectory() != null) {
319+
forest.setFastDataDirectory(config.getForestFastDataDirectory());
320+
}
321+
if (config.getForestLargeDataDirectory() != null) {
322+
forest.setLargeDataDirectory(config.getForestLargeDataDirectory());
323+
}
324+
325+
// Now check for database-specific forest directories
326+
Map<String, String> map = config.getDatabaseDataDirectories();
327+
if (map != null && map.containsKey(databaseName)) {
328+
forest.setDataDirectory(map.get(databaseName));
329+
}
330+
map = config.getDatabaseFastDataDirectories();
331+
if (map != null && map.containsKey(databaseName)) {
332+
forest.setFastDataDirectory(map.get(databaseName));
333+
}
334+
map = config.getDatabaseLargeDataDirectories();
335+
if (map != null && map.containsKey(databaseName)) {
336+
forest.setLargeDataDirectory(map.get(databaseName));
337+
}
338+
339+
return forest;
340+
}
341+
301342
/**
302343
* Checks the forestCounts map in AppConfig to see if the client has specified a number of forests per host for this
303344
* database.

src/main/java/com/marklogic/appdeployer/command/forests/ConfigureForestReplicasCommand.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void execute(CommandContext context) {
8989
for (String forestName : forestNamesAndReplicaCounts.keySet()) {
9090
int replicaCount = forestNamesAndReplicaCounts.get(forestName);
9191
if (replicaCount > 0) {
92-
configureReplicaForests(forestName, replicaCount, hostIds, context, forestMgr);
92+
configureReplicaForests(null, forestName, replicaCount, hostIds, context, forestMgr);
9393
}
9494
}
9595
}
@@ -148,21 +148,22 @@ protected void configureDatabaseReplicaForests(String databaseName, int replicaC
148148
DatabaseManager dbMgr = new DatabaseManager(context.getManageClient());
149149
List<String> forestNames = dbMgr.getForestNames(databaseName);
150150
for (String name : forestNames) {
151-
configureReplicaForests(name, replicaCount, hostIds, context, forestMgr);
151+
configureReplicaForests(databaseName, name, replicaCount, hostIds, context, forestMgr);
152152
}
153153
}
154154

155155
/**
156156
* Creates forests as needed (they may already exists) and then sets those forests as the replicas for the given
157157
* primaryForestName.
158158
*
159+
* @param databaseName
159160
* @param forestIdOrName
160161
* @param replicaCount
161162
* @param hostIds
162163
* @param context
163164
* @param forestMgr
164165
*/
165-
protected void configureReplicaForests(String forestIdOrName, int replicaCount, List<String> hostIds,
166+
protected void configureReplicaForests(String databaseName, String forestIdOrName, int replicaCount, List<String> hostIds,
166167
CommandContext context, ForestManager forestMgr) {
167168
ForestStatus status = forestMgr.getForestStatus(forestIdOrName);
168169
if (!status.isPrimary()) {
@@ -175,14 +176,15 @@ protected void configureReplicaForests(String forestIdOrName, int replicaCount,
175176
}
176177

177178
logger.info(format("Creating forest replicas for primary forest %s", forestIdOrName));
178-
createReplicaForests(forestIdOrName, replicaCount, hostIds, context, forestMgr);
179+
createReplicaForests(databaseName, forestIdOrName, replicaCount, hostIds, context, forestMgr);
179180
logger.info(format("Finished creating forest replicas for primary forest %s", forestIdOrName));
180181
}
181182

182183
/**
183184
* Finds the host that the forest is on, and then starting with the next host in the list of host IDs,
184185
* creates N replicas.
185186
*
187+
* @param databaseName
186188
* @param forestIdOrName
187189
* @param replicaCount
188190
* @param hostIds
@@ -191,7 +193,7 @@ protected void configureReplicaForests(String forestIdOrName, int replicaCount,
191193
* @return a map where the keys are replica forest names, and the value of each key is the ID of the host that
192194
* the replica was created on
193195
*/
194-
protected Map<String, String> createReplicaForests(String forestIdOrName, int replicaCount, List<String> hostIds,
196+
protected Map<String, String> createReplicaForests(String databaseName, String forestIdOrName, int replicaCount, List<String> hostIds,
195197
CommandContext context, ForestManager forestMgr) {
196198

197199
// Using the Forest class to generate JSON
@@ -213,7 +215,7 @@ protected Map<String, String> createReplicaForests(String forestIdOrName, int re
213215
}
214216
String replicaHostId = hostIds.get(nextReplicaHostIndex);
215217
String name = forestIdOrName + "-replica-" + j;
216-
replicas.add(buildForestReplica(name, replicaHostId, context.getAppConfig()));
218+
replicas.add(buildForestReplica(databaseName, name, replicaHostId, context.getAppConfig()));
217219
replicaNamesAndHostIds.put(name, replicaHostId);
218220
nextReplicaHostIndex++;
219221
}
@@ -225,13 +227,40 @@ protected Map<String, String> createReplicaForests(String forestIdOrName, int re
225227
return replicaNamesAndHostIds;
226228
}
227229

228-
protected ForestReplica buildForestReplica(String name, String replicaHostId, AppConfig appConfig) {
230+
/**
231+
* Return a ForestReplica instance with its properties configured based on what's in AppConfig.
232+
*
233+
* @param databaseName
234+
* @param name
235+
* @param replicaHostId
236+
* @param appConfig
237+
* @return
238+
*/
239+
protected ForestReplica buildForestReplica(String databaseName, String name, String replicaHostId, AppConfig appConfig) {
229240
ForestReplica replica = new ForestReplica();
230241
replica.setHost(replicaHostId);
231242
replica.setReplicaName(name);
232243
replica.setDataDirectory(appConfig.getReplicaForestDataDirectory());
233244
replica.setLargeDataDirectory(appConfig.getReplicaForestLargeDataDirectory());
234245
replica.setFastDataDirectory(appConfig.getReplicaForestFastDataDirectory());
246+
247+
if (databaseName != null) {
248+
Map<String, String> map = appConfig.getDatabaseReplicaDataDirectories();
249+
if (map != null && map.containsKey(databaseName)) {
250+
replica.setDataDirectory(map.get(databaseName));
251+
}
252+
253+
map = appConfig.getDatabaseReplicaFastDataDirectories();
254+
if (map != null && map.containsKey(databaseName)) {
255+
replica.setFastDataDirectory(map.get(databaseName));
256+
}
257+
258+
map = appConfig.getDatabaseReplicaLargeDataDirectories();
259+
if (map != null && map.containsKey(databaseName)) {
260+
replica.setLargeDataDirectory(map.get(databaseName));
261+
}
262+
}
263+
235264
return replica;
236265
}
237266

0 commit comments

Comments
 (0)