From a8bc5b3b6d4d01e320e22a0a9decca80a7320960 Mon Sep 17 00:00:00 2001 From: Marco Neumann Date: Wed, 8 Dec 2021 19:01:45 +0100 Subject: [PATCH] fix: allow setting the same server ID twice This is important for idempotence and simplifies clients and helper scripts a lot. --- .../tests/end_to_end_cases/deployment_api.rs | 11 +++++++- server/src/lib.rs | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/influxdb_iox/tests/end_to_end_cases/deployment_api.rs b/influxdb_iox/tests/end_to_end_cases/deployment_api.rs index 4bf225d035..894ba05b4d 100644 --- a/influxdb_iox/tests/end_to_end_cases/deployment_api.rs +++ b/influxdb_iox/tests/end_to_end_cases/deployment_api.rs @@ -129,7 +129,16 @@ async fn assert_set_get_server_id(server_fixture: ServerFixture) { let got = client.get_server_id().await.expect("get ID failed"); assert_eq!(got, Some(test_id)); - // setting server ID a second time should fail + // setting server ID to same ID should be OK + client + .update_server_id(test_id) + .await + .expect("set ID again failed"); + + let got = client.get_server_id().await.expect("get ID failed"); + assert_eq!(got, Some(test_id)); + + // setting server ID to a different ID should fail let result = client .update_server_id(NonZeroU32::try_from(13).unwrap()) .await; diff --git a/server/src/lib.rs b/server/src/lib.rs index 95c4ce8c51..b513f85985 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -470,6 +470,15 @@ impl Server { let mut state = self.shared.state.write(); let startup = match &**state { ServerState::Startup(startup) => startup.clone(), + state + if state + .server_id() + .map(|existing| existing == server_id) + .unwrap_or_default() => + { + // already set to same ID + return Ok(()); + } _ => return Err(Error::IdAlreadySet), }; @@ -2459,4 +2468,20 @@ mod tests { ]) .unwrap(); } + + #[tokio::test] + async fn set_server_id_twice() { + test_helpers::maybe_start_logging(); + let server = make_server(make_application()); + + server.set_id(ServerId::try_from(1).unwrap()).unwrap(); + server.wait_for_init().await.unwrap(); + + server.set_id(ServerId::try_from(1).unwrap()).unwrap(); + + assert_error!( + server.set_id(ServerId::try_from(2).unwrap()), + Error::IdAlreadySet + ); + } }