mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
## Problem As part of https://github.com/neondatabase/neon/issues/8614 we need to pass membership configurations between compute and safekeepers. ## Summary of changes Add version 3 of the protocol carrying membership configurations. Greeting message in both sides gets full conf, and other messages generation number only. Use protocol bump to include other accumulated changes: - stop packing whole structs on the wire as is; - make the tag u8 instead of u64; - send all ints in network order; - drop proposer_uuid, we can pass it in START_WAL_PUSH and it wasn't much useful anyway. Per message changes, apart from mconf: - ProposerGreeting: tenant / timeline id is sent now as hex cstring. Remove proto version, it is passed outside in START_WAL_PUSH. Remove postgres timeline, it is unused. Reorder fields a bit. - AcceptorGreeting: reorder fields - VoteResponse: timeline_start_lsn is removed. It can be taken from first member of term history, and later we won't need it at all when all timelines will be explicitly created. Vote itself is u8 instead of u64. - ProposerElected: timeline_start_lsn is removed for the same reasons. - AppendRequest: epoch_start_lsn removed, it is known from term history in ProposerElected. Both compute and sk are able to talk v2 and v3 to make rollbacks (in case we need them) easier; neon.safekeeper_proto_version GUC sets the client version. v2 code can be dropped later. So far empty conf is passed everywhere, future PRs will handle them. To test, add param to some tests choosing proto version; we want to test both 2 and 3 until we fully migrate. ref https://github.com/neondatabase/neon/issues/10326 --------- Co-authored-by: Arthur Petukhovsky <petuhovskiy@yandex.ru>
68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
from fixtures.log_helper import log
|
|
from fixtures.neon_fixtures import NeonEnv, NeonEnvBuilder
|
|
from fixtures.pageserver.http import PageserverHttpClient
|
|
|
|
|
|
def check_tenant(
|
|
env: NeonEnv, pageserver_http: PageserverHttpClient, safekeeper_proto_version: int
|
|
):
|
|
tenant_id, timeline_id = env.create_tenant()
|
|
config_lines = [
|
|
f"neon.safekeeper_proto_version = {safekeeper_proto_version}",
|
|
]
|
|
endpoint = env.endpoints.create_start("main", tenant_id=tenant_id, config_lines=config_lines)
|
|
# we rely upon autocommit after each statement
|
|
res_1 = endpoint.safe_psql_many(
|
|
queries=[
|
|
"CREATE TABLE t(key int primary key, value text)",
|
|
"INSERT INTO t SELECT generate_series(1,100000), 'payload'",
|
|
"SELECT sum(key) FROM t",
|
|
]
|
|
)
|
|
|
|
assert res_1[-1][0] == (5000050000,)
|
|
# TODO check detach on live instance
|
|
log.info("stopping compute")
|
|
endpoint.stop()
|
|
log.info("compute stopped")
|
|
|
|
endpoint.start()
|
|
res_2 = endpoint.safe_psql("SELECT sum(key) FROM t")
|
|
assert res_2[0] == (5000050000,)
|
|
|
|
endpoint.stop()
|
|
pageserver_http.tenant_detach(tenant_id)
|
|
|
|
|
|
@pytest.mark.parametrize("num_timelines,num_safekeepers", [(3, 1)])
|
|
# Test both proto versions until we fully migrate.
|
|
@pytest.mark.parametrize("safekeeper_proto_version", [2, 3])
|
|
def test_normal_work(
|
|
neon_env_builder: NeonEnvBuilder,
|
|
num_timelines: int,
|
|
num_safekeepers: int,
|
|
safekeeper_proto_version: int,
|
|
):
|
|
"""
|
|
Basic test:
|
|
* create new tenant with a timeline
|
|
* write some data
|
|
* ensure that it was successfully written
|
|
* restart compute
|
|
* check that the data is there
|
|
* stop compute
|
|
* detach tenant
|
|
|
|
Repeat check for several tenants/timelines.
|
|
"""
|
|
|
|
neon_env_builder.num_safekeepers = num_safekeepers
|
|
env = neon_env_builder.init_start()
|
|
pageserver_http = env.pageserver.http_client()
|
|
|
|
for _ in range(num_timelines):
|
|
check_tenant(env, pageserver_http, safekeeper_proto_version)
|