dragonflydb / dragonfly

A modern replacement for Redis and Memcached
https://www.dragonflydb.io/
Other
25.42k stars 919 forks source link

The ZINTER command cannot be executed on Dragonfly replica nodes #3614

Closed y-sugitani closed 3 weeks ago

y-sugitani commented 4 weeks ago

Describe the bug The ZINTER command cannot be executed on Dragonfly replica nodes. In comparison, the same command works fine on Redis replicas with an identical replication setup.

To Reproduce

# kubectl exec -it dragonfly-0 -- redis-cli
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
127.0.0.1:6379> ZINTER 2 zset1 zset2
1) "one"
2) "two"
127.0.0.1:6379>
# kubectl exec -it dragonfly-1 -- redis-cli
127.0.0.1:6379> ZINTER 2 zset1 zset2
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> info

Expected behavior The ZINTER command should execute successfully on replica nodes, returning "one" and "two" as the result.

Environment (please complete the following information):

Logs when executed on Redis

# kubectl exec -it redis-replication-0 -- redis-cli
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
127.0.0.1:6379> ZINTER 2 zset1 zset2
1) "one"
2) "two"
127.0.0.1:6379>
kubectl exec -it redis-replication-1 -- redis-cli
127.0.0.1:6379> ZINTER 2 zset1 zset2
1) "one"
2) "two"
127.0.0.1:6379> info
# Server
redis_version:7.4.0
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:1d2f710203eab251
redis_mode:standalone
os:Linux 6.10.6-orbstack-00249-g92ad2848917c aarch64
arch_bits:64
monotonic_clock:POSIX clock_gettime
multiplexing_api:epoll
atomicvar_api:c11-builtin
gcc_version:11.4.0
process_id:8
process_supervised:no
run_id:610186399b988fb515c80ac14182bc1d4c772e18
tcp_port:6379
server_time_usec:1725167064460549
uptime_in_seconds:69
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:13891032
executable:/opt/redis-stack/bin/redis-server
config_file:
io_threads_active:0
listener0:name=tcp,bind=*,bind=-::*,port=6379

# Clients
connected_clients:2
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:24
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
pubsub_clients:0
watching_clients:0
clients_in_timeout_table:0
total_watched_keys:0
total_blocking_keys:0
total_blocking_keys_on_nokey:0

# Memory
used_memory:1599608
used_memory_human:1.53M
used_memory_rss:20877312
used_memory_rss_human:19.91M
used_memory_peak:1826216
used_memory_peak_human:1.74M
used_memory_peak_perc:87.59%
used_memory_overhead:1382908
used_memory_startup:1361760
used_memory_dataset:216700
used_memory_dataset_perc:91.11%
allocator_allocated:1580752
allocator_active:20877312
allocator_resident:20877312
allocator_muzzy:0
total_system_memory:12591403008
total_system_memory_human:11.73G
used_memory_lua:31744
used_memory_vm_eval:31744
used_memory_lua_human:31.00K
used_memory_scripts_eval:0
number_of_cached_scripts:0
number_of_functions:0
number_of_libraries:0
used_memory_vm_functions:32768
used_memory_vm_total:64512
used_memory_vm_total_human:63.00K
used_memory_functions:376
used_memory_scripts:376
used_memory_scripts_human:376B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.00
allocator_frag_bytes:0
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.00
rss_overhead_bytes:0
mem_fragmentation_ratio:13.21
mem_fragmentation_bytes:19296560
mem_not_counted_for_evict:0
mem_replication_backlog:16468
mem_total_replication_buffers:16464
mem_clients_slaves:0
mem_clients_normal:3696
mem_cluster_links:0
mem_aof_buffer:0
mem_allocator:libc
mem_overhead_db_hashtable_rehashing:0
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0

# Persistence
loading:0
async_loading:0
current_cow_peak:0
current_cow_size:0
current_cow_size_age:0
current_fork_perc:0.00
current_save_keys_processed:0
current_save_keys_total:0
rdb_changes_since_last_save:5
rdb_bgsave_in_progress:0
rdb_last_save_time:1725166995
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_saves:0
rdb_last_cow_size:0
rdb_last_load_keys_expired:0
rdb_last_load_keys_loaded:0
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_rewrites:0
aof_rewrites_consecutive_failures:0
aof_last_write_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0

# Stats
total_connections_received:27
total_commands_processed:82
instantaneous_ops_per_sec:0
total_net_input_bytes:3082
total_net_output_bytes:472588
total_net_repl_input_bytes:601
total_net_repl_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.02
instantaneous_input_repl_kbps:0.00
instantaneous_output_repl_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_subkeys:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
expire_cycle_cpu_milliseconds:0
evicted_keys:0
evicted_clients:0
evicted_scripts:0
total_eviction_exceeded_time:0
current_eviction_exceeded_time:0
keyspace_hits:4
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
pubsubshard_channels:0
latest_fork_usec:0
total_forks:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
total_active_defrag_time:0
current_active_defrag_time:0
tracking_total_keys:0
tracking_total_items:0
tracking_total_prefixes:0
unexpected_error_replies:0
total_error_replies:0
dump_payload_sanitizations:0
total_reads_processed:90
total_writes_processed:107
io_threaded_reads_processed:0
io_threaded_writes_processed:0
client_query_buffer_limit_disconnections:0
client_output_buffer_limit_disconnections:0
reply_buffer_shrinks:3
reply_buffer_expands:0
eventloop_cycles:801
eventloop_duration_sum:102933
eventloop_duration_cmd_sum:2323
instantaneous_eventloop_cycles_per_sec:9
instantaneous_eventloop_duration_usec:101
acl_access_denied_auth:0
acl_access_denied_cmd:0
acl_access_denied_key:0
acl_access_denied_channel:0

# Replication
role:slave
master_host:192.168.194.112
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:300
slave_repl_offset:300
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8e4b891e72773c113b49f026729700efc923ed01
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:300

# CPU
used_cpu_sys:0.067609
used_cpu_user:0.048292
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000223
used_cpu_sys_main_thread:0.067510
used_cpu_user_main_thread:0.048222

# Modules
module:name=timeseries,ver=11202,api=1,filters=0,usedby=[],using=[],options=[]
module:name=search,ver=21005,api=1,filters=0,usedby=[],using=[ReJSON],options=[handle-io-errors]
module:name=redisgears_2,ver=20020,api=1,filters=0,usedby=[],using=[],options=[]
module:name=bf,ver=20802,api=1,filters=0,usedby=[],using=[],options=[]
module:name=RedisCompat,ver=1,api=1,filters=0,usedby=[],using=[],options=[]
module:name=ReJSON,ver=20803,api=1,filters=0,usedby=[search],using=[],options=[handle-io-errors]

# Errorstats

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=2,expires=0,avg_ttl=0,subexpiry=0
127.0.0.1:6379>

Could the cause be that this line lacks a READONLY specification? https://github.com/dragonflydb/dragonfly/blob/5c48320496789b9ea04922de5c0bb9f0d7a5b23c/src/server/zset_family.cc#L3152

romange commented 4 weeks ago

yeah, it's a copy-paste bug, will be fixed in our next version