bdr: Move some replication identifier interfaces to C.
authorPetr Jelinek <pjmodos@pjmodos.net>
Fri, 28 Nov 2014 09:27:42 +0000 (10:27 +0100)
committerPetr Jelinek <pjmodos@pjmodos.net>
Fri, 28 Nov 2014 13:04:24 +0000 (14:04 +0100)
bdr--0.8.0.sql
bdr_replication_identifier.c
bdr_replication_identifier.h

index 713360f03eb666388eafab44869fcb0cce05ee48..1eb55876a1747d19453df0b24e2fb97d69208c9a 100644 (file)
@@ -529,24 +529,15 @@ IF bdr.bdr_variant() = 'UDR' THEN
    END;
    $func$ STRICT LANGUAGE plpgsql;
 
-   CREATE OR REPLACE FUNCTION bdr_replication_identifier_advance(i_riname text, i_remote_lsn pg_lsn, i_local_lsn pg_lsn) RETURNS void
-   AS $func$
-   BEGIN
-       UPDATE bdr.bdr_replication_identifier SET riremote_lsn = i_remote_lsn, rilocal_lsn = i_local_lsn WHERE riname = i_riname;
-   END;
-   $func$ STRICT LANGUAGE plpgsql;
+   CREATE OR REPLACE FUNCTION bdr_replication_identifier_advance(i_riname text, i_remote_lsn pg_lsn, i_local_lsn pg_lsn)
+   RETURNS VOID
+   LANGUAGE C
+   AS 'MODULE_PATHNAME';
 
-   CREATE OR REPLACE FUNCTION bdr_replication_identifier_drop(i_riname text) RETURNS void
-   AS $func$
-   DECLARE
-       v_riident int;
-   BEGIN
-       DELETE FROM bdr.bdr_replication_identifier WHERE riname = i_riname RETURNING riident INTO v_riident;
-       IF FOUND THEN
-           DELETE FROM bdr.bdr_replication_identifier_pos WHERE riident = v_riident;
-       END IF;
-   END;
-   $func$ STRICT LANGUAGE plpgsql;
+   CREATE OR REPLACE FUNCTION bdr_replication_identifier_drop(i_riname text)
+   RETURNS VOID
+   LANGUAGE C
+   AS 'MODULE_PATHNAME';
 
    CREATE OR REPLACE FUNCTION bdr.bdr_replication_identifier_is_replaying()
    RETURNS boolean
index a898aa0e60e9050e3d227f520a6785e07146e8ae..e895cda5c5abd1395990cb6fde25f165c3041ac7 100644 (file)
@@ -99,6 +99,8 @@ typedef struct ReplicationState
 static ReplicationState *local_replication_state = NULL;
 
 PG_FUNCTION_INFO_V1(bdr_replication_identifier_is_replaying);
+PG_FUNCTION_INFO_V1(bdr_replication_identifier_advance);
+PG_FUNCTION_INFO_V1(bdr_replication_identifier_drop);
 
 static void
 EnsureReplicationIdentifierRelationId(void)
@@ -327,6 +329,7 @@ DropReplicationIdentifier(RepNodeId riident)
 
    /* now release lock again,  */
    heap_close(rel, ExclusiveLock);
+   heap_close(relpos, ExclusiveLock);
 }
 
 void
@@ -495,3 +498,35 @@ bdr_replication_identifier_is_replaying(PG_FUNCTION_ARGS)
 
    PG_RETURN_BOOL(replication_origin_id != InvalidRepNodeId);
 }
+
+Datum
+bdr_replication_identifier_advance(PG_FUNCTION_ARGS)
+{
+   text       *name = PG_GETARG_TEXT_P(0);
+   XLogRecPtr  remote_lsn = PG_GETARG_LSN(1);
+   XLogRecPtr  local_lsn = PG_GETARG_LSN(2);
+   RepNodeId   node;
+
+   CheckReplicationIdentifierPrerequisites(true);
+
+   node = GetReplicationIdentifier(text_to_cstring(name), false);
+
+   AdvanceReplicationIdentifier(node, remote_lsn, local_lsn);
+
+   PG_RETURN_VOID();
+}
+
+Datum
+bdr_replication_identifier_drop(PG_FUNCTION_ARGS)
+{
+   text       *name = PG_GETARG_TEXT_P(0);
+   RepNodeId   node;
+
+   CheckReplicationIdentifierPrerequisites(true);
+
+   node = GetReplicationIdentifier(text_to_cstring(name), false);
+
+   DropReplicationIdentifier(node);
+
+   PG_RETURN_VOID();
+}
index 00ca5805443a8d62940ba498174c4155962c01ec..488eeac7545e8d9aee9e2618d22e7856c0ffe369 100644 (file)
@@ -43,6 +43,8 @@ extern XLogRecPtr RemoteCommitFromCachedReplicationIdentifier(void);
 extern void GetReplicationInfoByIdentifier(RepNodeId riident, bool missing_ok, char **riname);
 
 extern Datum bdr_replication_identifier_is_replaying(PG_FUNCTION_ARGS);
+extern Datum bdr_replication_identifier_advance(PG_FUNCTION_ARGS);
+extern Datum bdr_replication_identifier_drop(PG_FUNCTION_ARGS);
 
 /*
  * bdr_replication_identifier struct