Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(replication): Do not auto replicate different master #2753

Merged
merged 8 commits into from
Mar 24, 2024

Conversation

chakaz
Copy link
Collaborator

@chakaz chakaz commented Mar 20, 2024

Until now, replicas would re-connect and re-replicate a master after the master will restart. This is problematic in case the master loses its data, which will cause the replica to flush all and lose its data as well.

This is a breaking change though, in that whoever controls the replica now has to explicitly issue a REPLICAOF X Y in order to re-establish a connection to a new master. This is true even if the master loaded an up to date RDB file.

It's not necessary if the replica lost connection to the master and the master was always alive, and the connection is re-established.

Fixes #2636

chakaz added 2 commits March 20, 2024 14:00
Until now, replicas would re-connect and re-replicate a master after the
master will restart. This is problematic in case the master loses its
data, which will cause the replica to flush all and lose its data as
well.

This is a breaking change though, in that whoever controls the replica
now has to explicitly issue a `REPLICAOF X Y` in order to re-establish
a connection to a new master. This is true even if the master loaded an
up to date RDB file.

It's not necessary if the replica lost connection to the master and the
master was always alive, and the connection is re-established.

Fixes #2636
@chakaz chakaz requested review from romange and adiholden March 20, 2024 19:21
await wait_available_async(c_replica)
assert await c_replica.execute_command("get k") == "6789"

await disconnect_clients(c_master, *[c_replica])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await disconnect_clients(c_master, c_replica)


@pytest.mark.asyncio
async def test_replica_reconnect(df_local_factory):
# Connect replica to master
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a comment what you are checking in this test

df_local_factory.start_all([master])

# Assert that replica did not reconnected to master with different repl_id
assert await c_master.execute_command("get k") == None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so you dont need to call master.client() after stop() ?
cause I think we do this in all our test..

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nope, clients automatically reconnect

@@ -2060,6 +2046,13 @@ async def save_replica():
await disconnect_clients(c_master, *[c_replica])


async def is_replica_down(conn):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe rename the func name to is_replicaiton_conn_down

@@ -1403,20 +1403,6 @@ async def test_tls_replication(
db_size = await c_replica.execute_command("DBSIZE")
assert 100 == db_size

# 4. Kill master, spin it up and see if replica reconnects
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So we want to check reconnect with tls here.
Instead of removing this check lets think of another way to make the reconnect work like not using stop to break the connection but use the proxy instead

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do you mean by proxy? do we have such a thing?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

take a look into test_network_disconnect test

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! Done.

@chakaz chakaz requested a review from adiholden March 21, 2024 11:41
@@ -303,10 +303,17 @@ std::error_code Replica::HandleCapaDflyResp() {
}

// If we're syncing a different replication ID, drop the saved LSNs.
if (master_context_.master_repl_id != ToSV(LastResponseArgs()[0].GetBuf())) {
string_view master_repl_id = ToSV(LastResponseArgs()[0].GetBuf());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"This behavior change on replica side should be under flag with default to preserve the current behaviour."

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I completely missed that 🤦


@pytest.mark.asyncio
async def test_replica_reconnect(df_local_factory):
# Test that a replica that disconnects from a master will not automatically replicate it after connection reestablishment, if it changed repl-id.
Copy link
Collaborator

@adiholden adiholden Mar 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a long line, dont we have a limit ?
'''
Test replica does not connect to master if master restarted
step1: create master and replica
step2: stop master and start again with the same port
step3: check replica is not replicating the restarted master
step4: issue new replicaof command
step5: check replica replicates master
'''

@@ -41,6 +41,8 @@ ABSL_FLAG(int, master_reconnect_timeout_ms, 1000,
"Timeout for re-establishing connection to a replication master");
ABSL_FLAG(bool, replica_partial_sync, true,
"Use partial sync to reconnect when a replica connection is interrupted.");
ABSL_FLAG(bool, replica_break_on_new_master, false,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe replica_reconnect_on_master_restart ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

much better! (done)

@adiholden
Copy link
Collaborator

The issue #2636 says "I suggest we implement master_id protection so that replica that had been synced already and reached SSR with the master id A, won't reconnect automatically with master under the same address with master id B"
In this PR we will not reconnect if we got the repl id from master , not necessarily if we reached SSR.
I want to make sure you approve this @romange

adiholden
adiholden previously approved these changes Mar 21, 2024
@chakaz
Copy link
Collaborator Author

chakaz commented Mar 21, 2024

Thanks @adiholden, waiting for @romange's approval as well (specifically on whether to only abort replication after stable sync unlike what I did)

@@ -32,6 +32,14 @@ async def wait_for_replicas_state(*clients, state="stable_sync", timeout=0.05):
clients = [c for c, role in zip(clients, roles) if role[0] != "replica" or role[3] != state]


async def close_proxy(proxy, proxy_task):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move to proxy.py

@romange
Copy link
Collaborator

romange commented Mar 21, 2024

Lgtm

@romange
Copy link
Collaborator

romange commented Mar 21, 2024

I understand the difference but I think it's manageable, the impact is that for some cases we will have a replica that does not sync. With monitoring we will be alerted of such cases. I am fine waiting to see if this becomes a priblem

@chakaz chakaz merged commit b830a71 into main Mar 24, 2024
10 checks passed
@chakaz chakaz deleted the master-replid-change branch March 24, 2024 10:04
szinn referenced this pull request in szinn/k8s-homelab Apr 3, 2024
…nfly ( v1.15.1 → v1.16.0 ) (#3354)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[docker.dragonflydb.io/dragonflydb/dragonfly](https://github.com/dragonflydb/dragonfly)
| minor | `v1.15.1` -> `v1.16.0` |

---

### Release Notes

<details>
<summary>dragonflydb/dragonfly
(docker.dragonflydb.io/dragonflydb/dragonfly)</summary>

###
[`v1.16.0`](https://github.com/dragonflydb/dragonfly/releases/tag/v1.16.0)

[Compare
Source](https://github.com/dragonflydb/dragonfly/compare/v1.15.1...v1.16.0)

##### Dragonfly v1.16.0

Our spring release. We are getting closer to 2.0 with some very exciting
features ahead. Stay tuned!

Some prominent changes include:

- Improved memory accounting of client connections
([#&#8203;2710](https://github.com/dragonflydb/dragonfly/issues/2710)
[#&#8203;2755](https://github.com/dragonflydb/dragonfly/issues/2755)
and
[#&#8203;2692](https://github.com/dragonflydb/dragonfly/issues/2692) )
- FT.AGGREGATE call
([#&#8203;2413](https://github.com/dragonflydb/dragonfly/issues/2413))
- Properly handle and replicate Memcache flags
([#&#8203;2787](https://github.com/dragonflydb/dragonfly/issues/2787)
[#&#8203;2807](https://github.com/dragonflydb/dragonfly/issues/2807))
- Intoduce BF.AGGREGATE BD.(M)ADD and BF.(M)EXISTS methods
([#&#8203;2801](https://github.com/dragonflydb/dragonfly/issues/2801)).
Note, that it does not work with snapshots and replication yet.
- Dragonfly builds natively on MacOS. We would love some help with
extending the release pipeline to create a proper macos binary.
- Following the requests from the Edge developers community, we added a
basic HTTP API support! Try running Dragonfly with:
`--expose_http_api` flag and then call `curl -X POST -d '["ping"]'
localhost:6379/api`. We will follow up with more extensive docs later
this month.
- Lots of stability fixes, especially around Sidekiq and BullMQ
workloads.

##### What's Changed

- chore: make usan asan optional and enable them on CI by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2631](https://github.com/dragonflydb/dragonfly/pull/2631)
- fix: missing manual trigger for daily sanitizers by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2682](https://github.com/dragonflydb/dragonfly/pull/2682)
- bug(tiering): fix overflow in page offset calculation and wrong hash
offset calculation by [@&#8203;theyueli](https://github.com/theyueli)
in
[https://github.com/dragonflydb/dragonfly/pull/2683](https://github.com/dragonflydb/dragonfly/pull/2683)
- Chore: Fixed Docker Health Check by
[@&#8203;manojks1999](https://github.com/manojks1999) in
[https://github.com/dragonflydb/dragonfly/pull/2659](https://github.com/dragonflydb/dragonfly/pull/2659)
- chore: Increase disk space in the coverage runs by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2684](https://github.com/dragonflydb/dragonfly/pull/2684)
- fix(flushall): Decommit memory after releasing tables. by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2691](https://github.com/dragonflydb/dragonfly/pull/2691)
- feat(server): Account for serializer's temporary buffer size by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2689](https://github.com/dragonflydb/dragonfly/pull/2689)
- refactor: remove FULL-SYNC-CUT cmd
[#&#8203;2687](https://github.com/dragonflydb/dragonfly/issues/2687)
by [@&#8203;BorysTheDev](https://github.com/BorysTheDev) in
[https://github.com/dragonflydb/dragonfly/pull/2688](https://github.com/dragonflydb/dragonfly/pull/2688)
- chore: add malloc-based stats and decommit by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2692](https://github.com/dragonflydb/dragonfly/pull/2692)
- feat(cluster): automatic slot migration finalization
[#&#8203;2697](https://github.com/dragonflydb/dragonfly/issues/2697)
by [@&#8203;BorysTheDev](https://github.com/BorysTheDev) in
[https://github.com/dragonflydb/dragonfly/pull/2698](https://github.com/dragonflydb/dragonfly/pull/2698)
- Basic FT.AGGREGATE by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2413](https://github.com/dragonflydb/dragonfly/pull/2413)
- chore: little transaction cleanup by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2608](https://github.com/dragonflydb/dragonfly/pull/2608)
- fix(channel store): add acquire/release pair in fast update path by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2704](https://github.com/dragonflydb/dragonfly/pull/2704)
- chore: add ubuntu22 devcontainer by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2700](https://github.com/dragonflydb/dragonfly/pull/2700)
- feat(cluster): Add `--cluster_id` flag by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2695](https://github.com/dragonflydb/dragonfly/pull/2695)
- feat(server): Use mimalloc in SSL calls by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2710](https://github.com/dragonflydb/dragonfly/pull/2710)
- chore: Pull helio with new BlockingCounter by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2711](https://github.com/dragonflydb/dragonfly/pull/2711)
- chore(transaction): Simplify PollExecution by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2712](https://github.com/dragonflydb/dragonfly/pull/2712)
- chore(transaction): Don't call GetLocalMask from blocking controller
by [@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2715](https://github.com/dragonflydb/dragonfly/pull/2715)
- chore: improve compatibility of EXPIRE functions with Redis by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2696](https://github.com/dragonflydb/dragonfly/pull/2696)
- chore: disable flaky fuzzy migration test by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2716](https://github.com/dragonflydb/dragonfly/pull/2716)
- chore: update sanitizers workflow by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2686](https://github.com/dragonflydb/dragonfly/pull/2686)
- chore: Use c-ares for resolving hosts in `ProtocolClient` by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2719](https://github.com/dragonflydb/dragonfly/pull/2719)
- Remove check-fail in ExpireIfNeeded and introduce DFLY LOAD by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2699](https://github.com/dragonflydb/dragonfly/pull/2699)
- chore: Record cmd stat from invoke by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2720](https://github.com/dragonflydb/dragonfly/pull/2720)
- fix(transaction): nullptr access on non transactional commands by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2724](https://github.com/dragonflydb/dragonfly/pull/2724)
- fix(BgSave): async from sync by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2702](https://github.com/dragonflydb/dragonfly/pull/2702)
- chore: remove core/fibers by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2723](https://github.com/dragonflydb/dragonfly/pull/2723)
- fix(transaction): Replace with armed sync point by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2708](https://github.com/dragonflydb/dragonfly/pull/2708)
- feat(json): Deserialize ReJSON format by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2725](https://github.com/dragonflydb/dragonfly/pull/2725)
- feat: add flag masteruser by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2693](https://github.com/dragonflydb/dragonfly/pull/2693)
- refactor: block list refactoring
[#&#8203;2580](https://github.com/dragonflydb/dragonfly/issues/2580)
by [@&#8203;BorysTheDev](https://github.com/BorysTheDev) in
[https://github.com/dragonflydb/dragonfly/pull/2732](https://github.com/dragonflydb/dragonfly/pull/2732)
- chore: fix DeduceExecMode by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2733](https://github.com/dragonflydb/dragonfly/pull/2733)
- fix(cluster): Reply with correct `\n` / `\r\n` from `CLUSTER` sub cmd
by [@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2731](https://github.com/dragonflydb/dragonfly/pull/2731)
- chore: Introduce fiber stack allocator by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2730](https://github.com/dragonflydb/dragonfly/pull/2730)
- fix(cluster): Save replica ID per replica by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2735](https://github.com/dragonflydb/dragonfly/pull/2735)
- fix(ssl): Proper cleanup by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2742](https://github.com/dragonflydb/dragonfly/pull/2742)
- chore: add skeleton files for flat_dfs code by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2738](https://github.com/dragonflydb/dragonfly/pull/2738)
- chore: better error reporting when connecting to tls with plain socket
by [@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2740](https://github.com/dragonflydb/dragonfly/pull/2740)
- chore: Support json paths without root selector by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2747](https://github.com/dragonflydb/dragonfly/pull/2747)
- chore: journal cleanup by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2749](https://github.com/dragonflydb/dragonfly/pull/2749)
- refactor: remove start-slot-migration cmd
[#&#8203;2727](https://github.com/dragonflydb/dragonfly/issues/2727)
by [@&#8203;BorysTheDev](https://github.com/BorysTheDev) in
[https://github.com/dragonflydb/dragonfly/pull/2728](https://github.com/dragonflydb/dragonfly/pull/2728)
- feat(server): Add TLS usage to /metrics and `INFO MEMORY` by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2755](https://github.com/dragonflydb/dragonfly/pull/2755)
- chore: preparations for adding flat json support by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2752](https://github.com/dragonflydb/dragonfly/pull/2752)
- chore(transaction): Introduce RunCallback by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2760](https://github.com/dragonflydb/dragonfly/pull/2760)
- feat(replication): Do not auto replicate different master by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2753](https://github.com/dragonflydb/dragonfly/pull/2753)
- Improve Helm chart to be rendered locally and on machines where is not
the application target by [@&#8203;fafg](https://github.com/fafg) in
[https://github.com/dragonflydb/dragonfly/pull/2706](https://github.com/dragonflydb/dragonfly/pull/2706)
- chore: preparation for basic http api by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2764](https://github.com/dragonflydb/dragonfly/pull/2764)
- feat(server): Add metric for RDB save duration. by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2768](https://github.com/dragonflydb/dragonfly/pull/2768)
- chore: fix flat_dfs read tests. by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2772](https://github.com/dragonflydb/dragonfly/pull/2772)
- fix(ci): do not overwrite last_log_file among tests by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2759](https://github.com/dragonflydb/dragonfly/pull/2759)
- feat(server): support cluster replication by
[@&#8203;adiholden](https://github.com/adiholden) in
[https://github.com/dragonflydb/dragonfly/pull/2748](https://github.com/dragonflydb/dragonfly/pull/2748)
- fix: fiber preempts on read path and OnCbFinish() clears
fetched_items\_ by [@&#8203;kostasrim](https://github.com/kostasrim)
in
[https://github.com/dragonflydb/dragonfly/pull/2763](https://github.com/dragonflydb/dragonfly/pull/2763)
- chore(ci): open last_log_file in append mode by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2776](https://github.com/dragonflydb/dragonfly/pull/2776)
- doc(README): fix outdated expiry ranges description by
[@&#8203;enjoy-binbin](https://github.com/enjoy-binbin) in
[https://github.com/dragonflydb/dragonfly/pull/2779](https://github.com/dragonflydb/dragonfly/pull/2779)
- Benchmark runner by
[@&#8203;adiholden](https://github.com/adiholden) in
[https://github.com/dragonflydb/dragonfly/pull/2780](https://github.com/dragonflydb/dragonfly/pull/2780)
- chore(replication-tests): add cache_mode on test replication all by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2685](https://github.com/dragonflydb/dragonfly/pull/2685)
- feat(tiering): DiskStorage by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2770](https://github.com/dragonflydb/dragonfly/pull/2770)
- chore: add a boilerplate for bloom filter family by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2782](https://github.com/dragonflydb/dragonfly/pull/2782)
- chore: introduce conversion routines between JsonType and FlatJson by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2785](https://github.com/dragonflydb/dragonfly/pull/2785)
- chore: Fix memcached flags not updated by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2787](https://github.com/dragonflydb/dragonfly/pull/2787)
- chore: remove duplicate code from dash and simplify by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2765](https://github.com/dragonflydb/dragonfly/pull/2765)
- chore: disable test_cluster_slot_migration by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2788](https://github.com/dragonflydb/dragonfly/pull/2788)
- fix: new\[] delete\[] missmatch in disk_storage by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2792](https://github.com/dragonflydb/dragonfly/pull/2792)
- fix: sanitizers clang build and clean up some warnings by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2793](https://github.com/dragonflydb/dragonfly/pull/2793)
- chore: add bloom filter class by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2791](https://github.com/dragonflydb/dragonfly/pull/2791)
- chore: add SBF data structure by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2795](https://github.com/dragonflydb/dragonfly/pull/2795)
- chore(tiering): Disable compilation for MacOs by
[@&#8203;dranikpg](https://github.com/dranikpg) in
[https://github.com/dragonflydb/dragonfly/pull/2799](https://github.com/dragonflydb/dragonfly/pull/2799)
- chore: fix daily build by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2798](https://github.com/dragonflydb/dragonfly/pull/2798)
- chore: expose SBF via compact_object by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2797](https://github.com/dragonflydb/dragonfly/pull/2797)
- fix(ci): malloc trim on sanitizers workflow by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2794](https://github.com/dragonflydb/dragonfly/pull/2794)
- fix(cluster): Don't miss updates in FLUSHSLOTS by
[@&#8203;chakaz](https://github.com/chakaz) in
[https://github.com/dragonflydb/dragonfly/pull/2783](https://github.com/dragonflydb/dragonfly/pull/2783)
- feat: add bf.(m)add and bf.(m)exists commands by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2801](https://github.com/dragonflydb/dragonfly/pull/2801)
- fix: SBF memory leaks by
[@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2803](https://github.com/dragonflydb/dragonfly/pull/2803)
- chore: refactor StringFamily::Set to use CmdArgParser by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2800](https://github.com/dragonflydb/dragonfly/pull/2800)
- fix: propagate memcached flags to replica by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2807](https://github.com/dragonflydb/dragonfly/pull/2807)
- DFLYMIGRATE ACK refactoring by
[@&#8203;BorysTheDev](https://github.com/BorysTheDev) in
[https://github.com/dragonflydb/dragonfly/pull/2790](https://github.com/dragonflydb/dragonfly/pull/2790)
- feat: add master lsn and journal_executed dcheck in replica via ping
by [@&#8203;kostasrim](https://github.com/kostasrim) in
[https://github.com/dragonflydb/dragonfly/pull/2778](https://github.com/dragonflydb/dragonfly/pull/2778)
- fix: correct json response for errors by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2813](https://github.com/dragonflydb/dragonfly/pull/2813)
- chore: bloom test - cover corner cases by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2806](https://github.com/dragonflydb/dragonfly/pull/2806)
- bug(server): do not write lsn opcode to journal by
[@&#8203;adiholden](https://github.com/adiholden) in
[https://github.com/dragonflydb/dragonfly/pull/2814](https://github.com/dragonflydb/dragonfly/pull/2814)
- chore: Fix build by disabling the tests. by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2821](https://github.com/dragonflydb/dragonfly/pull/2821)
- fix(replication): replication with multi shard sync enabled lagging by
[@&#8203;adiholden](https://github.com/adiholden) in
[https://github.com/dragonflydb/dragonfly/pull/2823](https://github.com/dragonflydb/dragonfly/pull/2823)
- fix: io_uring/fibers bug in DnsResolve by
[@&#8203;romange](https://github.com/romange) in
[https://github.com/dragonflydb/dragonfly/pull/2825](https://github.com/dragonflydb/dragonfly/pull/2825)

##### New Contributors

- [@&#8203;manojks1999](https://github.com/manojks1999) made their
first contribution in
[https://github.com/dragonflydb/dragonfly/pull/2659](https://github.com/dragonflydb/dragonfly/pull/2659)
- [@&#8203;fafg](https://github.com/fafg) made their first
contribution in
[https://github.com/dragonflydb/dragonfly/pull/2706](https://github.com/dragonflydb/dragonfly/pull/2706)
- [@&#8203;enjoy-binbin](https://github.com/enjoy-binbin) made their
first contribution in
[https://github.com/dragonflydb/dragonfly/pull/2779](https://github.com/dragonflydb/dragonfly/pull/2779)

##### Huge thanks to all the contributors! ❤️

🇮🇱  🇺🇦

**Full Changelog**:
dragonflydb/dragonfly@v1.15.0...v1.16.0

</details>

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNzkuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI3OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Co-authored-by: repo-jeeves[bot] <106431701+repo-jeeves[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

master_id (runid) should protect from accidental master restarts
3 participants