Don't disconnect if pagerserver didn't change

This commit is contained in:
Sasha Krassovsky
2023-11-28 11:18:54 -08:00
parent 7fab731f65
commit 3afe386d86
2 changed files with 21 additions and 6 deletions
+17 -5
View File
@@ -119,15 +119,24 @@ CheckConnstringUpdated()
return pagestore_local_counter < pg_atomic_read_u64(&pagestore_shared->update_counter);
}
static void
/* Returns true if the connstring has changed and false if not */
static bool
ReloadConnstring()
{
if(!PagestoreShmemIsValid())
return;
return false;
LWLockAcquire(pagestore_shared->lock, LW_SHARED);
if(strcmp(local_pageserver_connstring, pagestore_shared->pageserver_connstring) == 0)
{
LWLockRelease(pagestore_shared->lock);
return false;
}
strlcpy(local_pageserver_connstring, pagestore_shared->pageserver_connstring, sizeof(local_pageserver_connstring));
pagestore_local_counter = pg_atomic_read_u64(&pagestore_shared->update_counter);
LWLockRelease(pagestore_shared->lock);
return true;
}
static bool
@@ -290,7 +299,6 @@ pageserver_disconnect(void)
*/
if (connected)
{
neon_log(LOG, "dropping connection to page server due to error");
PQfinish(pageserver_conn);
pageserver_conn = NULL;
connected = false;
@@ -311,8 +319,12 @@ pageserver_send(NeonRequest * request)
if(CheckConnstringUpdated())
{
pageserver_disconnect();
ReloadConnstring();
bool should_disconnect = ReloadConnstring();
if(should_disconnect)
{
neon_log(LOG, "pageserver_send disconnect because connstring changed");
pageserver_disconnect();
}
}
/* If the connection was lost for some reason, reconnect */
@@ -60,7 +60,10 @@ def test_change_pageserver(neon_env_builder: NeonEnvBuilder):
execute("SELECT count(*) FROM foo")
assert fetchone() == (100000,)
endpoint.reconfigure(pageserver_id=alt_pageserver_id)
# Reconfigure it using the same connstring just to make sure nothing breaks
# as we have special handling for if the connstring doesn't change
for i in range(5):
endpoint.reconfigure(pageserver_id=alt_pageserver_id)
# Verify that the neon.pageserver_connstring GUC is set to the correct thing
execute("SELECT setting FROM pg_settings WHERE name='neon.pageserver_connstring'")