From 6fc5c70c780450604791ac196e1d982d89f8ec34 Mon Sep 17 00:00:00 2001 From: Eric Long Date: Tue, 1 Jun 2021 14:13:25 -0400 Subject: [PATCH 1/5] 0005012: Oracle log miner uses deprecated CONTINUOUS_MINE during permission check --- .../oracle/OracleDatabasePlatform.java | 85 +++++++++---------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDatabasePlatform.java index 1bf8741eb2..2a9f766ce5 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDatabasePlatform.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDatabasePlatform.java @@ -1,8 +1,5 @@ package org.jumpmind.db.platform.oracle; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.List; @@ -27,19 +24,18 @@ import javax.sql.DataSource; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.jumpmind.db.model.Column; +import org.jumpmind.db.model.Table; import org.jumpmind.db.model.Transaction; import org.jumpmind.db.model.TypeMap; -import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.AbstractJdbcDatabasePlatform; import org.jumpmind.db.platform.DatabaseNamesConstants; import org.jumpmind.db.platform.PermissionResult; import org.jumpmind.db.platform.PermissionResult.Status; import org.jumpmind.db.platform.PermissionType; -import org.jumpmind.db.sql.IConnectionCallback; import org.jumpmind.db.sql.ISqlTemplate; -import org.jumpmind.db.sql.JdbcSqlTemplate; import org.jumpmind.db.sql.Row; import org.jumpmind.db.sql.SqlException; import org.jumpmind.db.sql.SqlTemplateSettings; @@ -163,53 +159,54 @@ public PermissionResult getExecuteSymPermission() { @Override protected PermissionResult getLogMinePermission() { - String sql = "alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'"; final PermissionResult result = new PermissionResult(PermissionType.LOG_MINE, "Use LogMiner"); try { - getSqlTemplate().update(sql); + StringBuilder missingGrants = new StringBuilder(); + for (String name : new String[] { "EXECUTE_CATALOG_ROLE" }) { + if (!hasPrivilege(name)) { + if (missingGrants.length() > 0) { + missingGrants.append(", "); + } + missingGrants.append(name); + } + } + + String[] systemPrivs = new String[] { "SELECT ANY DICTIONARY", "ALTER SESSION" }; + if (sqlTemplate.getDatabaseMajorVersion() >= 12) { + systemPrivs = ArrayUtils.add(systemPrivs, "LOGMINING"); + } + for (String name : systemPrivs) { + if (!hasSystemPrivilege(name)) { + if (missingGrants.length() > 0) { + missingGrants.append(", "); + } + missingGrants.append(name); + } + } + + if (missingGrants.length() > 0) { + log.error("Missing privileges: {}", missingGrants.toString()); + result.setSolution("Grant " + missingGrants.toString()); + result.setStatus(Status.FAIL); + } else { + result.setStatus(Status.PASS); + } } catch (Exception e) { - log.error("Error checking alter session permission", e); - result.setStatus(Status.FAIL); + log.error("Error checking privileges", e); result.setException(e); - result.setSolution("Grant ALTER SESSION"); + result.setStatus(Status.FAIL); return result; } + return result; + } - return ((JdbcSqlTemplate) getSqlTemplate()).execute(new IConnectionCallback() { - @Override - public PermissionResult execute(Connection con) throws SQLException { - Statement st = con.createStatement(); - boolean isBegin = false; - try { - st.executeUpdate("BEGIN dbms_logmnr.start_logmnr(STARTSCN => timestamp_to_scn(sysdate), " - + "ENDSCN => timestamp_to_scn(sysdate), OPTIONS => DBMS_LOGMNR.CONTINUOUS_MINE);END;"); - isBegin = true; - } catch (Exception e) { - log.error("Error checking execute_catalog_role permission", e); - result.setStatus(Status.FAIL); - result.setException(e); - result.setSolution("Grant EXECUTE_CATALOG_ROLE"); - } + private boolean hasSystemPrivilege(String name) { + return getSqlTemplate().queryForInt("select count(*) from user_sys_privs where privilege = ?", name) > 0; + } - if (isBegin) { - try { - st.execute("select * from V$LOGMNR_CONTENTS"); - result.setStatus(Status.PASS); - } catch (Exception e) { - log.error("Error checking select_any_transaction permission", e); - result.setStatus(Status.FAIL); - result.setException(e); - result.setSolution("Grant SELECT ANY TRANSACTION, SELECT ANY DICTIONARY"); - } - try { - st.executeUpdate("BEGIN dbms_logmnr.end_logmnr();END;"); - } catch (Exception e) { - } - } - return result; - } - }); + private boolean hasPrivilege(String name) { + return getSqlTemplate().queryForInt("select count(*) from user_role_privs where granted_role = ?", name) > 0; } @Override From 2b55349a8a6f5b51e62f44895c2d12f99cd0097e Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Wed, 2 Jun 2021 12:42:33 -0400 Subject: [PATCH 2/5] 0004991: Kafka XML escaping needed --- .../java/org/jumpmind/symmetric/load/KafkaWriterFilter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/load/KafkaWriterFilter.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/load/KafkaWriterFilter.java index f852203e2c..59b0d29fd4 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/load/KafkaWriterFilter.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/load/KafkaWriterFilter.java @@ -43,6 +43,7 @@ import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.text.StringEscapeUtils; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; @@ -245,10 +246,10 @@ public boolean beforeWrite(DataContext context, Table table, CsvData data) { } } } else if (outputFormat.equals(KAFKA_FORMAT_XML)) { - kafkaText.append(""); for (int i = 0; i < table.getColumnNames().length; i++) { - kafkaText.append("").append(rowData[i]).append(""); + kafkaText.append("").append(StringEscapeUtils.escapeXml11(rowData[i])).append(""); } kafkaText.append(""); } else if (outputFormat.equals(KAFKA_FORMAT_AVRO)) { From ed766e90d6353b28712add8fc18c8127506ec8f9 Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Thu, 3 Jun 2021 11:58:46 -0400 Subject: [PATCH 3/5] 0005016: SQL Server: make extract_request, table_reload_status, table_reload_request, and trigger_hist row level locking --- .../db/mssql/MsSqlSymmetricDialect.java | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java index 8882432679..fd96321e5e 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlSymmetricDialect.java @@ -112,7 +112,15 @@ protected boolean alterLockEscalation () { + tablePrefix.toLowerCase() + "_data_event', '" + tablePrefix.toLowerCase() - + "_monitor_event') and (i.allow_row_locks !='true' " + + "_monitor_event', '" + + tablePrefix.toLowerCase() + + "_table_reload_status', '" + + tablePrefix.toLowerCase() + + "_extract_request', '" + + tablePrefix.toLowerCase() + + "_table_reload_request', '" + + tablePrefix.toLowerCase() + + "_trigger_hist') and (i.allow_row_locks !='true' " + lockEscalationClause + ")") > 0) { log.info("Updating indexes to prevent lock escalation"); @@ -120,7 +128,11 @@ protected boolean alterLockEscalation () { String dataTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_data"); String dataEventTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_data_event"); String outgoingBatchTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_outgoing_batch"); - String monitorEventTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix) + "_monitor_event"; + String monitorEventTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_monitor_event"); + String tableReloadStatusTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_table_reload_status"); + String extractRequestTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_extract_request"); + String tableReloadRequestTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_table_reload_request"); + String triggerHistTable = platform.alterCaseToMatchDatabaseDefaultCase(tablePrefix + "_trigger_hist"); sqlTemplate.update("ALTER INDEX ALL ON " + dataTable + " SET (ALLOW_ROW_LOCKS = ON)"); @@ -130,6 +142,14 @@ protected boolean alterLockEscalation () { + " SET (ALLOW_ROW_LOCKS = ON)"); sqlTemplate.update("ALTER INDEX ALL ON " + monitorEventTable + " SET (ALLOW_ROW_LOCKS = ON)"); + sqlTemplate.update("ALTER INDEX ALL ON " + tableReloadStatusTable + + " SET (ALLOW_ROW_LOCKS = ON)"); + sqlTemplate.update("ALTER INDEX ALL ON " + extractRequestTable + + " SET (ALLOW_ROW_LOCKS = ON)"); + sqlTemplate.update("ALTER INDEX ALL ON " + tableReloadRequestTable + + " SET (ALLOW_ROW_LOCKS = ON)"); + sqlTemplate.update("ALTER INDEX ALL ON " + triggerHistTable + + " SET (ALLOW_ROW_LOCKS = ON)"); if (parameterService.is(ParameterConstants.MSSQL_LOCK_ESCALATION_DISABLED, true)) { sqlTemplate.update("ALTER INDEX ALL ON " + dataTable @@ -140,6 +160,14 @@ protected boolean alterLockEscalation () { + " SET (ALLOW_PAGE_LOCKS = OFF)"); sqlTemplate.update("ALTER INDEX ALL ON " + monitorEventTable + " SET (ALLOW_PAGE_LOCKS = OFF)"); + sqlTemplate.update("ALTER INDEX ALL ON " + tableReloadStatusTable + + " SET (ALLOW_PAGE_LOCKS = OFF)"); + sqlTemplate.update("ALTER INDEX ALL ON " + extractRequestTable + + " SET (ALLOW_PAGE_LOCKS = OFF)"); + sqlTemplate.update("ALTER INDEX ALL ON " + tableReloadRequestTable + + " SET (ALLOW_PAGE_LOCKS = OFF)"); + sqlTemplate.update("ALTER INDEX ALL ON " + triggerHistTable + + " SET (ALLOW_PAGE_LOCKS = OFF)"); sqlTemplate.update("ALTER TABLE " + dataTable + " SET (LOCK_ESCALATION = DISABLE)"); @@ -149,6 +177,14 @@ protected boolean alterLockEscalation () { + " SET (LOCK_ESCALATION = DISABLE)"); sqlTemplate.update("ALTER TABLE " + monitorEventTable + " SET (LOCK_ESCALATION = DISABLE)"); + sqlTemplate.update("ALTER TABLE " + tableReloadStatusTable + + " SET (LOCK_ESCALATION = DISABLE)"); + sqlTemplate.update("ALTER TABLE " + extractRequestTable + + " SET (LOCK_ESCALATION = DISABLE)"); + sqlTemplate.update("ALTER TABLE " + tableReloadRequestTable + + " SET (LOCK_ESCALATION = DISABLE)"); + sqlTemplate.update("ALTER TABLE " + triggerHistTable + + " SET (LOCK_ESCALATION = DISABLE)"); } return true; } else { From 6baee75a2c75575c88ac245ec19ab5a76fe22287 Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Mon, 7 Jun 2021 12:32:57 -0400 Subject: [PATCH 4/5] 0005017: HTTP timeout is used for both connect and read timeouts; should provide a separate HTTP connect timeout parameter # Conflicts: # symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java --- .../jumpmind/symmetric/SymmetricPushClient.java | 2 +- .../symmetric/common/ParameterConstants.java | 1 + .../transport/http/HttpOutgoingTransport.java | 13 ++++++++----- .../transport/http/HttpTransportManager.java | 16 ++++++++++------ .../main/resources/symmetric-default.properties | 9 ++++++++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java index 35eb272661..35698da7a9 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/SymmetricPushClient.java @@ -49,7 +49,7 @@ public SymmetricPushClient(String nodeId, String securityToken, String syncUrl) public void open() { try { - transport = new HttpOutgoingTransport(new HttpTransportManager(), new URL(buildUrl()), 30000, true, 0, -1, null, + transport = new HttpOutgoingTransport(new HttpTransportManager(), new URL(buildUrl()), 30000, 30000, true, 0, -1, null, null, false, -1, false); writer = new ProtocolDataWriter(nodeId, transport.openWriter(), false, false, false); writer.start(batch); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java index 8a67151d85..a77a011d47 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java @@ -279,6 +279,7 @@ private ParameterConstants() { public final static String TRANSPORT_HTTP_MANUAL_REDIRECTS_ENABLED = "http.manual.redirects.enabled"; public final static String TRANSPORT_HTTP_TIMEOUT = "http.timeout.ms"; + public final static String TRANSPORT_HTTP_CONNECT_TIMEOUT = "http.connect.timeout.ms"; public final static String TRANSPORT_HTTP_PUSH_STREAM_ENABLED = "http.push.stream.output.enabled"; public final static String TRANSPORT_HTTP_PUSH_STREAM_SIZE = "http.push.stream.output.size"; public final static String TRANSPORT_HTTP_USE_COMPRESSION_CLIENT = "http.compression"; diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java index 6f10d845c5..d67b5680d0 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpOutgoingTransport.java @@ -68,6 +68,8 @@ public class HttpOutgoingTransport implements IOutgoingWithResponseTransport { private HttpConnection connection; private int httpTimeout; + + private int httpConnectTimeout; private boolean useCompression; @@ -87,13 +89,14 @@ public class HttpOutgoingTransport implements IOutgoingWithResponseTransport { private Map requestProperties; - public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, boolean useCompression, + public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, int httpConnectTimeout, boolean useCompression, int compressionStrategy, int compressionLevel, String nodeId, String securityToken, boolean streamOutputEnabled, int streamOutputSize, boolean fileUpload) { this.httpTransportManager = httpTransportManager; this.url = url; this.httpTimeout = httpTimeout; + this.httpConnectTimeout = httpConnectTimeout; this.useCompression = useCompression; this.compressionLevel = compressionLevel; this.compressionStrategy = compressionStrategy; @@ -104,11 +107,11 @@ public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, this.fileUpload = fileUpload; } - public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, boolean useCompression, + public HttpOutgoingTransport(HttpTransportManager httpTransportManager, URL url, int httpTimeout, int httpConnectTimeout, boolean useCompression, int compressionStrategy, int compressionLevel, String nodeId, String securityToken, boolean streamOutputEnabled, int streamOutputSize, boolean fileUpload, Map requestProperties) { - this(httpTransportManager, url, httpTimeout, useCompression, compressionStrategy, compressionLevel, nodeId, securityToken, + this(httpTransportManager, url, httpTimeout, httpConnectTimeout, useCompression, compressionStrategy, compressionLevel, nodeId, securityToken, streamOutputEnabled, streamOutputSize, fileUpload); this.requestProperties = requestProperties; } @@ -201,7 +204,7 @@ private HttpConnection requestReservation(String queue) { try { connection = httpTransportManager.openConnection(url, nodeId, securityToken); connection.setUseCaches(false); - connection.setConnectTimeout(httpTimeout); + connection.setConnectTimeout(httpConnectTimeout); connection.setReadTimeout(httpTimeout); connection.setRequestMethod("HEAD"); connection.setRequestProperty(WebConstants.CHANNEL_QUEUE, queue); @@ -223,7 +226,7 @@ public OutputStream openStream() { connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); - connection.setConnectTimeout(httpTimeout); + connection.setConnectTimeout(httpConnectTimeout); connection.setReadTimeout(httpTimeout); if (requestProperties != null) { diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java index 314b389836..da40c7c402 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/transport/http/HttpTransportManager.java @@ -146,7 +146,7 @@ protected int sendMessage(URL url, String nodeId, String securityToken, String d conn.setRequestMethod("POST"); conn.setAllowUserInteraction(false); conn.setDoOutput(true); - conn.setConnectTimeout(getHttpTimeOutInMs()); + conn.setConnectTimeout(getHttpConnectTimeOutInMs()); conn.setReadTimeout(getHttpTimeOutInMs()); try (OutputStream os = conn.getOutputStream()) { writeMessage(os, data); @@ -223,6 +223,10 @@ public boolean isOutputStreamEnabled() { public int getHttpTimeOutInMs() { return engine.getParameterService().getInt(ParameterConstants.TRANSPORT_HTTP_TIMEOUT); } + + public int getHttpConnectTimeOutInMs() { + return engine.getParameterService().getInt(ParameterConstants.TRANSPORT_HTTP_CONNECT_TIMEOUT); + } public boolean isUseCompression(Node targetNode) { // if the node is local, no need to use compression @@ -277,7 +281,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, String securityToken, Map requestProperties, String registrationUrl) throws IOException { URL url = new URL(buildURL("push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false, requestProperties); } @@ -285,7 +289,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, String securityToken, String registrationUrl) throws IOException { URL url = new URL(buildURL("push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false); } @@ -293,7 +297,7 @@ public IOutgoingWithResponseTransport getPushTransport(Node remote, Node local, public IOutgoingWithResponseTransport getFilePushTransport(Node remote, Node local, String securityToken, String registrationUrl) throws IOException { URL url = new URL(buildURL("filesync/push", remote, local, securityToken, registrationUrl)); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), true); } @@ -321,7 +325,7 @@ public IOutgoingWithResponseTransport getBandwidthPushTransport(Node remote, Nod Map requestProperties, String registrationUrl) throws IOException { URL url = new URL(resolveURL(remote.getSyncUrl(), registrationUrl) + "/" + "bandwidth?direction=push"); - return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), isUseCompression(remote), + return new HttpOutgoingTransport(this, url, getHttpTimeOutInMs(), getHttpConnectTimeOutInMs(), isUseCompression(remote), getCompressionStrategy(), getCompressionLevel(), local.getNodeId(), securityToken, isOutputStreamEnabled(), getOutputStreamSize(), false, requestProperties); } @@ -356,7 +360,7 @@ public static Map buildRegistrationRequestProperties(Node node, protected HttpConnection createGetConnectionFor(URL url, String nodeId, String securityToken) throws IOException { HttpConnection conn = openConnection(url, nodeId, securityToken); conn.setRequestProperty("accept-encoding", "gzip"); - conn.setConnectTimeout(getHttpTimeOutInMs()); + conn.setConnectTimeout(getHttpConnectTimeOutInMs()); conn.setReadTimeout(getHttpTimeOutInMs()); conn.setRequestMethod("GET"); return conn; diff --git a/symmetric-core/src/main/resources/symmetric-default.properties b/symmetric-core/src/main/resources/symmetric-default.properties index 0ee3792fe5..346fd541e9 100644 --- a/symmetric-core/src/main/resources/symmetric-default.properties +++ b/symmetric-core/src/main/resources/symmetric-default.properties @@ -485,13 +485,20 @@ send.ack.keepalive.ms=30000 # Type: integer time.between.ack.retries.ms=5000 -# Sets both the connection and read timeout on the internal HttpUrlConnection +# Sets the read timeout on the internal HttpUrlConnection # # DatabaseOverridable: true # Tags: transport # Type: integer http.timeout.ms=90000 +# Sets the connection timeout on the internal HttpUrlConnection +# +# DatabaseOverridable: true +# Tags: transport +# Type: integer +http.connect.timeout.ms=90000 + # Whether or not to use compression over HTTP connections. # Currently, this setting only affects the push connection of the source node. # Compression on a pull is enabled using a filter in the web.xml for the PullServlet. From f126ea6c5355c58364b9c1cf43fa27ab77740ae5 Mon Sep 17 00:00:00 2001 From: Eric Long Date: Tue, 8 Jun 2021 15:00:01 -0400 Subject: [PATCH 5/5] 0005019: Service fails to install on SUSE 15 --- .../java/org/jumpmind/symmetric/wrapper/UnixService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/UnixService.java b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/UnixService.java index 6ede378be3..9e52a54066 100644 --- a/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/UnixService.java +++ b/symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/UnixService.java @@ -51,6 +51,7 @@ public class UnixService extends WrapperService { private static final String INITD_DIR = "/etc/init.d"; private static final String SYSTEMD_INSTALL_DIR = "/lib/systemd/system"; + private static final String SYSTEMD_ETC_DIR = "/etc/systemd/system"; private static final String SYSTEMD_RUNTIME_DIR = "/run/systemd/system"; private static final String INITD_SCRIPT_START = "start"; @@ -111,7 +112,13 @@ private void installSystemd() { } private String getSystemdScriptFile() { - return SYSTEMD_INSTALL_DIR + "/" + config.getName() + ".service"; + // original implementation for systemd installed under /lib/systemd, so this is for backwards compatibility + String fileName = SYSTEMD_INSTALL_DIR + "/" + config.getName() + ".service"; + if (!new File(fileName).exists()) { + // correct implementation for systemd installs under /etc/systemd + fileName = SYSTEMD_ETC_DIR + "/" + config.getName() + ".service"; + } + return fileName; } private String getInitdRunFile() {