@@ -331,6 +331,14 @@ MtmSharedShmemStartup()
331331 Mtm -> localTablesHashLoaded = false;
332332 Mtm -> latestSyncpoint = InvalidXLogRecPtr ;
333333
334+ /*
335+ * Enable sign for the database will be set at the MtmIsEnabled()
336+ * function call when the "multimaster" extension existence will be
337+ * detected.
338+ */
339+ Mtm -> IsEnabled = false;
340+ Mtm -> DatabaseId = InvalidOid ;
341+
334342 Mtm -> lock = & (GetNamedLWLockTranche (MULTIMASTER_NAME )[0 ].lock );
335343 Mtm -> syncpoint_lock = & (GetNamedLWLockTranche (MULTIMASTER_NAME )[1 ].lock );
336344
@@ -661,7 +669,37 @@ _PG_fini(void)
661669bool
662670MtmIsEnabled ()
663671{
664- return OidIsValid (get_publication_oid (MULTIMASTER_NAME , true));
672+ bool enabled ;
673+ Oid dbOid ;
674+
675+ LWLockAcquire (Mtm -> lock , LW_SHARED );
676+ enabled = Mtm -> IsEnabled ;
677+ dbOid = Mtm -> DatabaseId ;
678+ LWLockRelease (Mtm -> lock );
679+
680+ /* Consistency check */
681+ Assert ((enabled && dbOid != InvalidOid ) || (!enabled && dbOid == InvalidOid ));
682+
683+ if (!enabled )
684+ {
685+ /*
686+ * Do not block another processes during possible long-time database
687+ * transaction and do not need to catch an error for release the lock.
688+ */
689+ enabled = OidIsValid (get_publication_oid (MULTIMASTER_NAME , true));
690+ if (enabled )
691+ {
692+ Assert (MyDatabaseId != InvalidOid );
693+ LWLockAcquire (Mtm -> lock , LW_EXCLUSIVE );
694+ Mtm -> IsEnabled = true;
695+ Mtm -> DatabaseId = MyDatabaseId ;
696+ LWLockRelease (Mtm -> lock );
697+ }
698+ }
699+ else if (dbOid != MyDatabaseId )
700+ return false;
701+
702+ return enabled ;
665703}
666704
667705/* XXX: delete that */
0 commit comments