<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Discussion</title><link href="https://sourceforge.net/p/symmetricds/discussion/" rel="alternate"/><link href="https://sourceforge.net/p/symmetricds/discussion/feed.atom" rel="self"/><id>https://sourceforge.net/p/symmetricds/discussion/</id><updated>2026-09-30T17:17:18.713000Z</updated><subtitle>Recent posts to Discussion</subtitle><entry><title>Community Edition 3.18.1 and Azure PostgreSQL: supported options for bidirectional sync</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/2f662d09b8/?limit=25#50a6" rel="alternate"/><published>2026-09-30T17:17:18.713000Z</published><updated>2026-09-30T17:17:18.713000Z</updated><author><name>Andrew Webb</name><uri>https://sourceforge.net/u/awebb/</uri></author><id>https://sourceforge.net1d41f0ca42713a6cf4b2e2abdc56036db9b6de18</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi Jainish, &lt;/p&gt;
&lt;p&gt;This is expected when running PostgreSQL in a cloud provider, such as GCP, AWS, and Azure.&lt;br/&gt;
In 3.18 support for these cloud platforms moved to Symmetric-Pro. Please reach out to our sales team to discuss commercial options. &lt;a href="https://www.jumpmind.com/symmetricds/trial/" rel="nofollow"&gt;https://www.jumpmind.com/symmetricds/trial/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you,&lt;br/&gt;
Andy Webb&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Community Edition 3.18.1 and Azure PostgreSQL: supported options for bidirectional sync</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/2f662d09b8/?limit=25#ddc3" rel="alternate"/><published>2026-09-28T08:00:52.385000Z</published><updated>2026-09-28T08:00:52.385000Z</updated><author><name>Jainish Patel</name><uri>https://sourceforge.net/u/jainish1009/</uri></author><id>https://sourceforge.net38c4d2995ab0ff2d4031cfa1a4112c6837ececd7</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;a href="https://symmetricds.sourceforge.net/doc/3.18/html/user-guide.html#_features" rel="nofollow"&gt;https://symmetricds.sourceforge.net/doc/3.18/html/user-guide.html#_features&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Community Edition 3.18.1 and Azure PostgreSQL: supported options for bidirectional sync</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/2f662d09b8/?limit=25#62e1" rel="alternate"/><published>2026-09-28T08:00:07.379000Z</published><updated>2026-09-28T08:00:07.379000Z</updated><author><name>Jainish Patel</name><uri>https://sourceforge.net/u/jainish1009/</uri></author><id>https://sourceforge.net58770b5698e4afb14ddfbc8a40ce0a5494bb8426</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Also, the documentation mentions that Azure PostgreSQL is supported in the Community Edition. In that case, why are we getting this error? Could this be some kind of bug or compatibility issue?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Community Edition 3.18.1 and Azure PostgreSQL: supported options for bidirectional sync</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/2f662d09b8/?limit=25#8b9d" rel="alternate"/><published>2026-09-28T06:24:01.953000Z</published><updated>2026-09-28T06:24:01.953000Z</updated><author><name>Jainish Patel</name><uri>https://sourceforge.net/u/jainish1009/</uri></author><id>https://sourceforge.netded2bb68d35583cfa6e43a1b933d30b7b28d01ba</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello SymmetricDS Support,&lt;/p&gt;
&lt;p&gt;We are evaluating SymmetricDS Community Edition 3.18.1 for bidirectional synchronization between an HQ database on Azure Database for PostgreSQL and multiple child sites, each with its own standalone PostgreSQL database.&lt;/p&gt;
&lt;p&gt;The child sites are on separate networks. They can connect to HQ over the internet, but we do not have a shared network or VPN. We plan to use GUIDs for row IDs.&lt;/p&gt;
&lt;p&gt;When starting the HQ engine against Azure PostgreSQL, we receive:&lt;/p&gt;
&lt;p&gt;The detected database platform 'azurepostgres' is not supported in SymmetricDS open source. Azure Database for PostgreSQL requires SymmetricDS Pro.&lt;/p&gt;
&lt;p&gt;Could you please confirm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Is Azure Database for PostgreSQL unsupported as a source and target in Community Edition 3.18.1?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is there any supported, no-licence-fee SymmetricDS configuration for this bidirectional setup?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If we install SymmetricDS Community Edition on an Azure VM while keeping the database on Azure Database for PostgreSQL, will it connect, or will it still detect azurepostgres and require Pro?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We would also appreciate guidance on synchronization when a child site temporarily loses internet access.&lt;/p&gt;
&lt;p&gt;Thank you,&lt;br/&gt;
Jainish Patel&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>BshColumnTransform runs twice for same row - same transform, same key, same values</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/b68e4c1886/?limit=25#9fd0" rel="alternate"/><published>2026-09-03T05:33:54.986000Z</published><updated>2026-09-03T05:33:54.986000Z</updated><author><name>Vincent Wehrle</name><uri>https://sourceforge.net/u/vinsch/</uri></author><id>https://sourceforge.neta287854d905db8dc439ba6366805b51cea9428ae</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi Pavel,&lt;/p&gt;
&lt;p&gt;thank you for your response.&lt;/p&gt;
&lt;p&gt;Regarding the two possibilities you mentioned, we have already ruled both of them out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Duplicate transform setup&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Our setup is as simple as it gets:&lt;/p&gt;
&lt;p&gt;2 nodes, both Oracle&lt;br/&gt;
1 source table, captured by exactly 1 trigger&lt;br/&gt;
1 trigger_router entry, routing to exactly 1 target node&lt;br/&gt;
1 transform_table entry (LOAD, SOURCE to TARGET)&lt;br/&gt;
1 transform_column entry with the BSH script&lt;br/&gt;
No other BSH transforms exist anywhere in the configuration&lt;/p&gt;
&lt;p&gt;There is no way a duplicate transform is involved here.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Data Conflicts / multiple CDC events from different nodes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We only have 2 nodes in total - one source and one target. There is no multi-master setup, no additional nodes, and no other CDC events being generated. We also confirmed that only one row exists in sym_data for the affected primary key at the time of replication.&lt;/p&gt;
&lt;p&gt;So both possibilities you mentioned do not apply to our setup.&lt;/p&gt;
&lt;p&gt;The double execution is fully reproducible and consistent - every single UPDATE on the source table results in exactly 2 BSH executions on the target with identical keyValues, dmlType, currentValue and oldValue, approximately 90ms apart.&lt;/p&gt;
&lt;p&gt;We will try to reinstall the whole setup from scratch and see if the issue persists. If it does, we will come back here with further findings.&lt;/p&gt;
&lt;p&gt;Thanks again.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>BshColumnTransform runs twice for same row - same transform, same key, same values</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/b68e4c1886/?limit=25#c0e8" rel="alternate"/><published>2026-09-02T12:08:06.045000Z</published><updated>2026-09-02T12:08:06.045000Z</updated><author><name>Pavel</name><uri>https://sourceforge.net/u/pavel-jm/</uri></author><id>https://sourceforge.net1bd621000285890d7e8b575f02c8e51b67d31ee4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi Vincent,&lt;br/&gt;
Has the issue been resolved?&lt;br/&gt;
Are there any learning to share with the community?&lt;br/&gt;
Thanks,&lt;br/&gt;
Pavel&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>BshColumnTransform runs twice for same row - same transform, same key, same values</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/b68e4c1886/?limit=25#654d" rel="alternate"/><published>2026-08-28T13:12:27.658000Z</published><updated>2026-08-28T13:12:27.658000Z</updated><author><name>Pavel</name><uri>https://sourceforge.net/u/pavel-jm/</uri></author><id>https://sourceforge.net9a3eb7779d37bbbe01402eeab476d64c82b6bac4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi Vincent,&lt;/p&gt;
&lt;p&gt;I can think of two possibilities leading to BSH called twice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Duplicate transform set up.&lt;/li&gt;
&lt;li&gt;Data Conflicts (multiple CDC events from different nodes get reconciled).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Either way the BSH script does not look right. Instead of "context.put" the script should return the NewAndOldValue object:&lt;br/&gt;
&lt;code&gt;return new org.jumpmind.symmetric.io.data.transform.NewAndOldValue(newValue, oldValue);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There are some examples floating around with a single value return, but they are outdated and do not apply to versions above 3.12.x&lt;/p&gt;
&lt;p&gt;See the "BeanShell Script Transform" section under the &lt;strong&gt;6.15.6 Transform Types&lt;/strong&gt; in the User Guide &lt;a href="https://downloads.jumpmind.com/symmetricds/doc/3.17/html/user-guide.html#_transform_types" rel="nofollow"&gt;https://downloads.jumpmind.com/symmetricds/doc/3.17/html/user-guide.html#_transform_types&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you would like us to take a closer look at the configuration, attach a Support Snapshot here (or email it to support@jumpmind.com). &lt;/p&gt;
&lt;p&gt;Here is a link describing how to take a support snapshot:&lt;br/&gt;
&lt;a href="https://jumpmind.atlassian.net/wiki/spaces/SYMKB/pages/1379860483/Take+a+Support+Snapshot+by+Web+Console" rel="nofollow"&gt;https://jumpmind.atlassian.net/wiki/spaces/SYMKB/pages/1379860483/Take+a+Support+Snapshot+by+Web+Console&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Warm regards,&lt;br/&gt;
Pavel&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>BshColumnTransform runs twice for same row - same transform, same key, same values</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/b68e4c1886/?limit=25#c308" rel="alternate"/><published>2026-08-28T07:28:36.387000Z</published><updated>2026-08-28T07:28:36.387000Z</updated><author><name>Vincent Wehrle</name><uri>https://sourceforge.net/u/vinsch/</uri></author><id>https://sourceforge.net84344a9c6a254f2239fd997cd0ccb083c21b4edc</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I have a BSH column transform script that runs twice per row. I have investigated this extensively and cannot find the cause. Here is a full summary of what I found.&lt;/p&gt;
&lt;p&gt;Setup:&lt;/p&gt;
&lt;p&gt;SymmetricDS Pro 3.17.7 (Trial)&lt;br/&gt;
One source table (SOURCE) mapped to one target table (TARGET) via one transform&lt;br/&gt;
transform_point: LOAD&lt;br/&gt;
update_action: UPD_ROW&lt;br/&gt;
delete_action: DEL_ROW&lt;br/&gt;
Only one BSH column in sym_transform_column&lt;br/&gt;
include_on: ALL (also tested with UPDATE only, same result)&lt;br/&gt;
One trigger, one router, one trigger_router entry on the source side&lt;br/&gt;
Only one row in sym_data for the affected PK&lt;br/&gt;
Tested only with Update-Operation on the source table&lt;/p&gt;
&lt;p&gt;Observations:&lt;/p&gt;
&lt;p&gt;The script executes twice per row&lt;br/&gt;
Both executions have the same transformId, sourceTable, targetTable&lt;br/&gt;
Both executions have the same keyValues &lt;br/&gt;
Both executions have the same dmlType (UPDATE) and dmlTypeString (UPDATE)&lt;br/&gt;
Both executions have the same currentValue and oldValue&lt;br/&gt;
Timestamps are approximately 90ms apart&lt;br/&gt;
cycleNum (stored in context) increments across both executions, confirming the context is shared between them&lt;/p&gt;
&lt;p&gt;Script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cycleNum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cycleNum"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;cycleNum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;cycleNum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;cycleNum++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cycleNum"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cycleNum&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;warn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cycleNum: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cycleNum&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | dmlType: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sourceDmlType&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | dmlTypeString: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sourceDmlTypeString&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | transformId: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;transformedData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;getTransformation&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;getTransformId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | keyValues: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;transformedData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;getKeyValues&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | currentValue: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;currentValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | oldValue: "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;oldValue&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Log output: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;671&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WARN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BshColumnTransform&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TARGET-dataloader-4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;cycleNum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;dmlType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;dmlTypeString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;transformId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TARGET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;keyValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;141449&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;currentValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;141449&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;oldValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;141449&lt;/span&gt;

&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WARN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BshColumnTransform&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TARGET-dataloader-4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;cycleNum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;dmlType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;dmlTypeString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;transformId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TARGET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;keyValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;141449&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;currentValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;141449&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;oldValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;141449&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Questions:&lt;/p&gt;
&lt;p&gt;Is there any known scenario where a LOAD transform with a single BSH column runs twice for the same row with identical values?&lt;br/&gt;
Is there an internal SymmetricDS mechanism that could cause this, such as a retry, a conflict check, or a two-phase load?&lt;br/&gt;
Is it expected or normal that a BSH LOAD transform runs twice per row under certain configurations?&lt;/p&gt;
&lt;p&gt;Thanks in advance.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>[Bug] Windows service wrapper JVM runs without -Xms/-Xmx and commits ~1/64 of physical RAM per service</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/a050af9028/?limit=25#0642" rel="alternate"/><published>2026-08-12T18:07:09.296000Z</published><updated>2026-08-12T18:07:09.296000Z</updated><author><name>Evan Miller</name><uri>https://sourceforge.net/u/evanmiller/</uri></author><id>https://sourceforge.netcafd0f01364d1ac776dcf043561b4e745340202d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Thanks for reporting this bug. We have added it to our issue tracker. You can use the following link to track its progress:&lt;br/&gt;
&lt;a href="https://jumpmind.atlassian.net/browse/SYM-7908" rel="nofollow"&gt;https://jumpmind.atlassian.net/browse/SYM-7908&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>[Bug] Windows service wrapper JVM runs without -Xms/-Xmx and commits ~1/64 of physical RAM per service</title><link href="https://sourceforge.net/p/symmetricds/discussion/739236/thread/a050af9028/?limit=25#c4a5" rel="alternate"/><published>2026-08-12T16:35:36.775000Z</published><updated>2026-08-12T16:35:36.775000Z</updated><author><name>Ivan Maly</name><uri>https://sourceforge.net/u/struy/</uri></author><id>https://sourceforge.netb92cc8a93272c6da57f7cdfa54037a41def214e9</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;strong&gt;Product version:&lt;/strong&gt; 3.14.5 (code verified identical in 3.15 branch)&lt;br/&gt;
&lt;strong&gt;Component:&lt;/strong&gt; symmetric-wrapper&lt;br/&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Windows Server (issue is specific to Windows commit accounting)&lt;/p&gt;
&lt;h2 id="h-summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Each SymmetricDS Windows service runs two &lt;code&gt;java.exe&lt;/code&gt; processes: the wrapper&lt;br/&gt;
(monitor) and the actual server engine. The heap settings&lt;br/&gt;
&lt;code&gt;wrapper.java.initmemory&lt;/code&gt; / &lt;code&gt;wrapper.java.maxmemory&lt;/code&gt; from &lt;code&gt;sym_service.conf&lt;/code&gt;&lt;br/&gt;
are applied &lt;strong&gt;only to the server process&lt;/strong&gt;. The wrapper JVM itself is launched&lt;br/&gt;
with no &lt;code&gt;-Xms&lt;/code&gt;/&lt;code&gt;-Xmx&lt;/code&gt; at all, and there is no configuration property that&lt;br/&gt;
would allow adding them.&lt;/p&gt;
&lt;p&gt;Without &lt;code&gt;-Xms&lt;/code&gt;, HotSpot ergonomics set the initial heap to &lt;strong&gt;1/64 of physical&lt;br/&gt;
RAM&lt;/strong&gt; and commit it immediately at startup. On large-memory hosts this makes&lt;br/&gt;
every wrapper commit gigabytes of memory it will never use. The committed&lt;br/&gt;
pages are never touched, so the working set stays tiny (tens of MB) and the&lt;br/&gt;
problem is invisible in Task Manager — but the commit charge counts against&lt;br/&gt;
the system commit limit (RAM + pagefile) and silently reduces the headroom&lt;br/&gt;
available to other processes. Under load spikes this leads to sporadic memory&lt;br/&gt;
allocation failures in unrelated processes, which makes the root cause very&lt;br/&gt;
hard to trace.&lt;/p&gt;
&lt;h2 id="h-environment-where-observed"&gt;Environment where observed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server VM with 170 GB RAM, ~30 GB pagefile (commit limit ~200 GB)&lt;/li&gt;
&lt;li&gt;20 SymmetricDS instances installed as Windows services (multi-tenant host)&lt;/li&gt;
&lt;li&gt;Each wrapper process committed ~3.1–3.4 GB (initial heap 170/64 ≈ 2.7 GB&lt;/li&gt;
&lt;li&gt;JVM overhead), i.e. &lt;strong&gt;~60 GB of commit charge consumed by 20 idle&lt;br/&gt;
  monitor processes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Working set of all 20 wrappers combined: ~1.1 GB (which is why nothing&lt;br/&gt;
  looked suspicious in Task Manager)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h-root-cause-code-references"&gt;Root cause (code references)&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;WrapperService.getWrapperCommand()&lt;/code&gt; builds the wrapper command line as:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;java -Djava.io.tmpdir=&amp;lt;tmp&amp;gt; -jar symmetric-wrapper.jar &amp;lt;arg&amp;gt; &amp;lt;conf&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with no memory options and no property hook to add any&lt;br/&gt;
(symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/WrapperService.java,&lt;br/&gt;
verified on branches 3.14 and 3.15).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;WrapperConfig.getCommand()&lt;/code&gt; translates &lt;code&gt;wrapper.java.initmemory&lt;/code&gt; /&lt;br/&gt;
&lt;code&gt;wrapper.java.maxmemory&lt;/code&gt; (default 256) into &lt;code&gt;-Xms&lt;/code&gt;/&lt;code&gt;-Xmx&lt;/code&gt;, but this command&lt;br/&gt;
is used only for the spawned server process&lt;br/&gt;
(symmetric-wrapper/src/main/java/org/jumpmind/symmetric/wrapper/WrapperConfig.java).&lt;/p&gt;
&lt;p&gt;On Windows the service ImagePath runs the wrapper with the &lt;code&gt;init&lt;/code&gt; argument,&lt;br/&gt;
and &lt;code&gt;Wrapper.main&lt;/code&gt; for &lt;code&gt;init&lt;/code&gt; calls &lt;code&gt;execJava()&lt;/code&gt; in the same process, so the&lt;br/&gt;
resident monitor is the unrestricted JVM from the ImagePath.&lt;/p&gt;
&lt;p&gt;The issue is effectively Windows-specific: Linux default heuristic&lt;br/&gt;
overcommit does not strictly account untouched committed heap, while Windows&lt;br/&gt;
requires every committed byte to be backed by RAM + pagefile.&lt;/p&gt;
&lt;h2 id="h-steps-to-reproduce"&gt;Steps to reproduce&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install SymmetricDS as a Windows service on a host with a large amount&lt;br/&gt;
   of physical RAM (e.g. 128+ GB).&lt;/li&gt;
&lt;li&gt;Start the service.&lt;/li&gt;
&lt;li&gt;Inspect the two &lt;code&gt;java.exe&lt;/code&gt; processes, e.g.:&lt;br/&gt;
&lt;code&gt;Get-CimInstance Win32_Process -Filter "Name='java.exe'" | Select ProcessId, PageFileUsage, CommandLine&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Observe: the process running &lt;code&gt;symmetric-wrapper.jar&lt;/code&gt; has no &lt;code&gt;-Xms&lt;/code&gt;/&lt;code&gt;-Xmx&lt;/code&gt;&lt;br/&gt;
   on its command line and its committed memory (PageFileUsage) is roughly&lt;br/&gt;
   1/64 of physical RAM, while its working set is only tens of MB.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h-measured-confirmation"&gt;Measured confirmation&lt;/h2&gt;
&lt;p&gt;Adding &lt;code&gt;-Xms16m -Xmx64m&lt;/code&gt; to the service ImagePath (immediately after the&lt;br/&gt;
java executable path) and restarting a single service reduced the system-wide&lt;br/&gt;
committed bytes by ~3.4 GB instantly — matching the prediction exactly.&lt;br/&gt;
Extrapolated to all 20 services: ~55–60 GB of commit charge recovered.&lt;/p&gt;
&lt;h2 id="h-workarounds"&gt;Workarounds&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Insert &lt;code&gt;-Xms16m -Xmx64m&lt;/code&gt; into the ImagePath of each SymmetricDS service&lt;br/&gt;
  in the registry (must be re-applied after &lt;code&gt;sym_service.bat uninstall/install&lt;/code&gt;,&lt;br/&gt;
  which rewrites the ImagePath), or&lt;/li&gt;
&lt;li&gt;Set a per-service environment variable&lt;br/&gt;
&lt;code&gt;JAVA_TOOL_OPTIONS=-Xms16m -Xmx64m&lt;/code&gt; (the server's explicit &lt;code&gt;-Xms&lt;/code&gt;/&lt;code&gt;-Xmx&lt;/code&gt;&lt;br/&gt;
  from sym_service.conf take precedence, so the engine is unaffected).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are fragile compared to an upstream fix.&lt;/p&gt;
&lt;h2 id="h-suggested-fix"&gt;Suggested fix&lt;/h2&gt;
&lt;p&gt;Either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hard-code sane defaults (e.g. &lt;code&gt;-Xms16m -Xmx64m&lt;/code&gt;) into&lt;br/&gt;
&lt;code&gt;WrapperService.getWrapperCommand()&lt;/code&gt; — the wrapper only monitors the&lt;br/&gt;
   child process and reads its stdout, so a small fixed heap is sufficient; or&lt;/li&gt;
&lt;li&gt;Introduce configuration properties (e.g. &lt;code&gt;wrapper.monitor.initmemory&lt;/code&gt; /&lt;br/&gt;
&lt;code&gt;wrapper.monitor.maxmemory&lt;/code&gt;) applied to the wrapper JVM in&lt;br/&gt;
&lt;code&gt;getWrapperCommand()&lt;/code&gt;, with small defaults.&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;</summary></entry></feed>