diff --git a/contrib/zenith/libpagestore.c b/contrib/zenith/libpagestore.c index 062f0cbf2e0..89bfbe1906c 100644 --- a/contrib/zenith/libpagestore.c +++ b/contrib/zenith/libpagestore.c @@ -67,11 +67,13 @@ zenith_connect() } /* Ask the Page Server to connect to us, and stream WAL from us. */ - if (callmemaybe_connstring && callmemaybe_connstring[0]) + if (callmemaybe_connstring && callmemaybe_connstring[0] + && zenith_tenant + && zenith_timeline) { PGresult *res; - query = psprintf("callmemaybe %s %s", zenith_timeline, callmemaybe_connstring); + query = psprintf("callmemaybe %s %s %s", zenith_tenant, zenith_timeline, callmemaybe_connstring); res = PQexec(pageserver_conn, query); if (PQresultStatus(res) != PGRES_COMMAND_OK) { @@ -81,7 +83,7 @@ zenith_connect() PQclear(res); } - query = psprintf("pagestream %s", zenith_timeline); + query = psprintf("pagestream %s %s", zenith_tenant, zenith_timeline); ret = PQsendQuery(pageserver_conn, query); if (ret != 1) zenith_log(ERROR, @@ -185,11 +187,11 @@ zenith_call(ZenithRequest request) static bool -check_zenith_timeline(char **newval, void **extra, GucSource source) +check_zenith_id(char **newval, void **extra, GucSource source) { - uint8 ztimelineid[16]; + uint8 zid[16]; - return **newval == '\0' || HexDecodeString(ztimelineid, *newval, 16); + return **newval == '\0' || HexDecodeString(zid, *newval, 16); } /* @@ -223,7 +225,16 @@ _PG_init(void) "", PGC_POSTMASTER, 0, /* no flags required */ - check_zenith_timeline, NULL, NULL); + check_zenith_id, NULL, NULL); + + DefineCustomStringVariable("zenith.zenith_tenant", + "Zenith tenantid the server is running on", + NULL, + &zenith_tenant, + "", + PGC_POSTMASTER, + 0, /* no flags required */ + check_zenith_id, NULL, NULL); DefineCustomBoolVariable("zenith.wal_redo", "start in wal-redo mode", @@ -242,6 +253,7 @@ _PG_init(void) /* Is there more correct way to pass CustomGUC to postgres code? */ zenith_timeline_walproposer = zenith_timeline; + zenith_tenant_walproposer = zenith_tenant; if (wal_redo) { diff --git a/contrib/zenith/pagestore_client.h b/contrib/zenith/pagestore_client.h index 400fb259a6b..b4b223d3c46 100644 --- a/contrib/zenith/pagestore_client.h +++ b/contrib/zenith/pagestore_client.h @@ -90,6 +90,7 @@ extern page_server_api * page_server; extern char *page_server_connstring; extern char *callmemaybe_connstring; extern char *zenith_timeline; +extern char *zenith_tenant; extern bool wal_redo; extern const f_smgr *smgr_zenith(BackendId backend, RelFileNode rnode); diff --git a/contrib/zenith/pagestore_smgr.c b/contrib/zenith/pagestore_smgr.c index 29c5c46c0e3..858a67841ea 100644 --- a/contrib/zenith/pagestore_smgr.c +++ b/contrib/zenith/pagestore_smgr.c @@ -56,6 +56,7 @@ page_server_api *page_server; char *page_server_connstring; char *callmemaybe_connstring; char *zenith_timeline; +char *zenith_tenant; bool wal_redo = false; char const *const ZenithMessageStr[] = diff --git a/src/backend/replication/walproposer.c b/src/backend/replication/walproposer.c index e87b36287ce..7a7996a1f82 100644 --- a/src/backend/replication/walproposer.c +++ b/src/backend/replication/walproposer.c @@ -221,6 +221,7 @@ HandleWalKeeperResponse(void) } char *zenith_timeline_walproposer = NULL; +char *zenith_tenant_walproposer = NULL; /* * WAL proposer bgworeker entry point @@ -285,6 +286,13 @@ WalProposerMain(Datum main_arg) if (*zenith_timeline_walproposer != '\0' && !HexDecodeString(serverInfo.ztimelineid, zenith_timeline_walproposer, 16)) elog(FATAL, "Could not parse zenith.zenith_timeline, %s", zenith_timeline_walproposer); + + if (!zenith_tenant_walproposer) + elog(FATAL, "zenith.zenith_tenant is not provided"); + if (*zenith_tenant_walproposer != '\0' && + !HexDecodeString(serverInfo.ztenantid, zenith_tenant_walproposer, 16)) + elog(FATAL, "Could not parse zenith.zenith_tenant, %s", zenith_tenant_walproposer); + serverInfo.protocolVersion = SK_PROTOCOL_VERSION; pg_strong_random(&serverInfo.nodeId.uuid, sizeof(serverInfo.nodeId.uuid)); serverInfo.systemId = GetSystemIdentifier(); diff --git a/src/include/replication/walproposer.h b/src/include/replication/walproposer.h index e1845e3fb19..d770473ad35 100644 --- a/src/include/replication/walproposer.h +++ b/src/include/replication/walproposer.h @@ -23,6 +23,7 @@ struct WalMessage; typedef struct WalMessage WalMessage; extern char *zenith_timeline_walproposer; +extern char *zenith_tenant_walproposer; /* WAL safekeeper state */ typedef enum @@ -59,6 +60,7 @@ typedef struct ServerInfo XLogRecPtr walEnd; TimeLineID timeline; int walSegSize; + uint8 ztenantid[16]; } ServerInfo; /*