# Upgrading to WaterDrop 2.9 ## Upgrading to WaterDrop 2.9 / Default Polling Mode Changed from `:thread` to `:fd` WaterDrop 2.9 switches the default polling mode from `:thread` to `:fd`. The FD mode uses a single Ruby thread with `IO.select` for efficient multiplexing, providing higher throughput, lower memory usage, and fewer threads compared to the thread-based mode. If you experience any issues with the new default, you can revert to the previous behavior: ```ruby producer = WaterDrop::Producer.new producer.setup do |config| config.deliver = true config.polling.mode = :thread # ... end ``` !!! note "Experiencing Issues?" If you experience any issues with the `:fd` polling mode, please [open an issue](https://github.com/karafka/waterdrop/issues/new) on the WaterDrop GitHub repository. Your feedback will help improve the FD mode before the `:thread` mode is removed. !!! warning "Deprecation Timeline" The `:thread` polling mode will be deprecated in WaterDrop 2.10 and removed in 2.11. If you need to revert, plan to migrate to `:fd` before 2.11. ## Upgrading to WaterDrop 2.9 / Statistics Decorator Scope Reduced The built-in statistics decorator now only decorates keys used by the Karafka official metrics listeners (`tx`, `txretries`, `txerrs`, `rxerrs`) and skips unused subtrees (`topics`, broker window stats). This reduces decoration cost by ~425x on large clusters. If you rely on other `_d` or `_fd` delta keys in custom instrumentation, you need to provide a custom decorator: ```ruby producer = WaterDrop::Producer.new producer.setup do |config| config.deliver = true # Provide a custom decorator that includes the keys you need config.statistics_decorator = ::Karafka::Core::Monitoring::StatisticsDecorator.new( only_keys: %w[tx txretries txerrs rxerrs your_custom_key], excluded_keys: %w[] ) # ... end ``` If you do not use custom statistics instrumentation beyond the built-in listeners, no action is needed. ## Upgrading to WaterDrop 2.9 / Default Timeout Values Increased 3x Default timeout values have been upscaled 3x, closer to librdkafka defaults, to prevent intermediate timeouts during node recovery:
| Config | Previous Default | New Default |
|---|---|---|
kafka message.timeout.ms |
50000 ms (50 seconds) | 150000 ms (150 seconds) |
kafka transaction.timeout.ms |
55000 ms (55 seconds) | 165000 ms (165 seconds) |
root max_wait_timeout |
60000 ms (60 seconds) | 180000 ms (180 seconds) |