From fd02017e842fca19333dfb2604f5422b3049cbbd Mon Sep 17 00:00:00 2001 From: Free Ekanayaka Date: Thu, 4 Dec 2025 11:16:14 +0000 Subject: [PATCH 1/2] v1: Memory ownership of the RAFT_SNAPSHOT event The ownership of raft_event.snapshot.metadata now belongs to the caller. Signed-off-by: Free Ekanayaka --- src/legacy.c | 1 + src/replication.c | 10 +++++++--- test/lib/cluster.c | 5 +---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/legacy.c b/src/legacy.c index 138b9ae8..2c37ad92 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -529,6 +529,7 @@ static void takeSnapshotCb(struct raft_io_snapshot_put *put, int status) event.snapshot.metadata = metadata; event.snapshot.trailing = r->legacy.snapshot_trailing; LegacyForwardToRaftIo(r, &event); + raft_configuration_close(&metadata.configuration); if (r->legacy.snapshot_pending != NULL) { struct legacyPersistSnapshot *persist; diff --git a/src/replication.c b/src/replication.c index 1400aa19..2cf908e2 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1070,6 +1070,8 @@ int replicationSnapshot(struct raft *r, struct raft_snapshot_metadata *metadata, unsigned trailing) { + int rv; + (void)trailing; /* Make also a copy of the index of the configuration contained in the @@ -1078,9 +1080,11 @@ int replicationSnapshot(struct raft *r, if (metadata->configuration_index > r->configuration_committed_index) { configurationClose(&r->configuration_committed); - r->configuration_committed = metadata->configuration; - } else { - configurationClose(&metadata->configuration); + rv = configurationCopy(&metadata->configuration, + &r->configuration_committed); + if (rv != 0) { + return rv; + } } TrailSnapshot(&r->trail, metadata->index, trailing); diff --git a/test/lib/cluster.c b/test/lib/cluster.c index 92f23e5e..c809646c 100644 --- a/test/lib/cluster.c +++ b/test/lib/cluster.c @@ -1104,10 +1104,7 @@ static void serverCompleteTakeSnapshot(struct test_server *s, struct step *step) * entry. */ snapshot->metadata.index = event->snapshot.metadata.index; snapshot->metadata.term = event->snapshot.metadata.term; - - confCopy(&event->snapshot.metadata.configuration, - &snapshot->metadata.configuration); - + snapshot->metadata.configuration = event->snapshot.metadata.configuration; snapshot->data.len = 8; snapshot->data.base = munit_malloc(snapshot->data.len); From f9e37bc39879afe9ceba1825d9e3c1052b843c36 Mon Sep 17 00:00:00 2001 From: Free Ekanayaka Date: Thu, 4 Dec 2025 11:17:09 +0000 Subject: [PATCH 2/2] v1: Memory ownership of RAFT_CONFIGURATION event The memory of the raft_event.configuration.conf field now belongs to the caller. Signed-off-by: Free Ekanayaka --- src/legacy.c | 4 ++++ src/replication.c | 9 +++++++-- test/lib/cluster.c | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/legacy.c b/src/legacy.c index 2c37ad92..0495ae30 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -1116,6 +1116,10 @@ static int legacyHandleEvent(struct raft *r, return rv; } + if (event->type == RAFT_CONFIGURATION) { + raft_configuration_close(&event->configuration.conf); + } + if (update.flags & RAFT_UPDATE_STATE) { legacyHandleStateUpdate(r); } diff --git a/src/replication.c b/src/replication.c index 2cf908e2..1364500e 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1023,10 +1023,11 @@ int replicationApplyConfigurationChange(struct raft *r, struct raft_configuration *conf, raft_index index) { + int rv; + assert(index > 0); if (r->configuration_uncommitted_index != index) { - configurationClose(conf); return 0; } @@ -1036,8 +1037,12 @@ int replicationApplyConfigurationChange(struct raft *r, * index, since that uncommitted configuration is now committed. */ r->configuration_uncommitted_index = 0; r->configuration_committed_index = index; + configurationClose(&r->configuration_committed); - r->configuration_committed = *conf; + rv = configurationCopy(conf, &r->configuration_committed); + if (rv != 0) { + return rv; + } if (r->state == RAFT_LEADER) { const struct raft_server *server; diff --git a/test/lib/cluster.c b/test/lib/cluster.c index c809646c..fb2a6884 100644 --- a/test/lib/cluster.c +++ b/test/lib/cluster.c @@ -1090,6 +1090,8 @@ static void serverCompleteConfiguration(struct test_server *s, rv = serverStep(s, event); munit_assert_int(rv, ==, 0); + raft_configuration_close(&event->configuration.conf); + /* The last call to raft_step() did not change the commit index. */ munit_assert_ullong(raft_commit_index(r), ==, commit_index); }