All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Queues will no longer be closed if file size is incorrect. Fixes #669
- Dont redeclare exchange in java client test #860
- Don't raise FileNotFound when deleting already deleted file #849
- Increase default etcd lease TTL to 10s and run keepalive earlier #847
- Don't remove consumers from queue before all data is sent to client. It may cause a segmentation fault because a unmapped message segment is accessed. #850
- Exit with status 1 if lost leadership so that LavinMQ is restarted by systemd #846
- etcd lease will no longer expire during slow startup #834
- Leader node is no longer unresponsive while sending file_list/files to new followers #838
- Leader node now waits for all data to be acked to all followers before shutting down on graceful shutdown #835
- Improve broker initiated client disconnects #816
- Fixed sorting on unacked messages #836
- Remove the 'reset vhost' feature #822
- Build with latest crystal version #841
- Added metadata when logging connection handshake #826
- Added some indexing for streams, greatly increasing performance when looking up by offset or timestamp #817
- Added buildstep for 'make rpm' #840
With the release of 2.0.0 we introduce High Availablility for LavinMQ in the form of clustering. With clustering, LavinMQ replicates data between nodes with our own replication protocol, and uses etcd for leader election. See this post in the LavinMQ blog or the readme for more information about clustering.
- Full HA clustering support, uses etcd for leader election and metadata, and a replication protocol between nodes.
- Added cluster_status to lavinmqctl #787
- Added deliver_get to message_stats #793
- Added a configurable default consumer prefetch value for all consumers. Defaults to 65535. #813
- Output format (text/json) can now be selected when running lavinmqctl cmds #790
- Clustering clients will now listen on the UNIX sockets if configured
- Clustering server will accept PROXY protocol V2 headers from followers
- Shovels' batching of acks caused a lot of unacked messages in source broker #777
- Shovel AMQP source didn't reconnect on network failures (partially fixed in prev release) #758
- Running lavinmqctl commands on a follower node now displays an error and exits with code 2 #785
- Federation queue links now reconnects if the upstream disconnects #788
- Proxying from followers is now more resilient #812
- Sorting on consumer count at channels page
- Log if user tries to declare a queue with an unknown queue type #792
- Force close AMQP connections if a protocol error occurs
- Remove min_isr setting #789
- Wait for followers to synchronize on shutdown of leader
- Make proxied UNIX sockets in followers RW for all
- SystemD notify ready in cluster mode when lader is found
- Etcd actions are retried, etcd can now be restarted without issues
- Clustering secret is monitored if not available yet when becoming a replication follower
- Updated RabbitMQ HTTP API Go client test to use a patch-file for LavinMQ compatibility #778
- Renames clustering_max_lag -> clustering_max_unsynced_actions to clarify that it is measured in number of actions #810
- Renames lag -> lag_in_bytes to clarify that lag is measured in bytes #810
- Suggests etcd 3.4.0 as min version #815
- Changed logging to provide more information about which queue is being handled #809
- Publishing messages are now handled fully by exchanges #786
- Logging is now handled more uniformly throghout LavinMQ #800
- Don't log handled exceptions as error with backtrace #776
- Don't dynamically fetch active etcd endpoints
See https://github.com/cloudamqp/lavinmq/releases/tag/v2.0.0-rc.5 for changes in this pre-release
- Don't shovel messages after initial queue length #734
- Shovels that were set up to stop after the initial queue length will now stop. For high ingress queues a race condition could trigger these shovels to send more messages than the initial queue length.
- Memory leak in Crystal's Hash implementation fixed #14862
- This release is using Crystal
1.13.2
- This release is using Crystal
- Bindings are now sorted properly in the web interface #726
- Shovel AMQP source didn't reconnect on network failures #758
- Update
amqp-client.cr
to get a necessary fix for reconnecting shovel sources
- Update
- Dead-lettering loop when publishing to a delayed exchange's internal queue was fixed #748
- Exchange federation tried to bind to the upstream's default exchange #749
- Shovel ack all unacked messages on stop #755
- Prevent a queue that is overflowing from consuming too many resources #725
See https://github.com/cloudamqp/lavinmq/releases/tag/v2.0.0-rc.4 for changes in this pre-release
- Removed old replication in anticipation of coming clustering.
- Build with Crystal 1.13.1
- Deb packages now includes all debug symbols, for useful stacktraces
- Replaced HTTP router with an internal one. Now LavinMQ uses 0 external libraries.
- Specs are more reliable when a new server is started for each spec
- LavinMQ never sets TLS ciphers by it self, custom ciphers have to be configured via the config
- HTTP API: Regression where an (empty) body was required to PUT a new vhost
- lavinmqctl didn't recognize 201/204 response codes from set_permissions, set_user_tags and add_vhost
- Queues will no longer be closed if file size is incorrect. Fixes #669
- Improved logging
- Won't choke on empty message files on boot #685
- Won't choke on somewhat too large message files on boot #671
- Can view which messages are unacked in each queue (HTTP and UI) #712
- Tags and descriptions on VHosts
- Can pass an array of URLs to Shovel
See https://github.com/cloudamqp/lavinmq/releases/tag/v2.0.0-rc.3 for changes in this pre-release
See https://github.com/cloudamqp/lavinmq/releases/tag/v2.0.0-rc.2 for changes in this pre-release
See https://github.com/cloudamqp/lavinmq/releases/tag/v2.0.0-rc.1 for changes in this pre-release
- Exporting definitions broke delayed exchanges #699
- lavinmqctl: escape symbols in parameters (eg. can now create vhosts with / in the name) #699
- Some prometheus metrics typing was mixed up, counter where it should be gauge
- Unmap memory mapped files on finalize, could cause segfaults in replication when files already deleted tried to be replicated
- Bug fix where followers who were synchronizing could miss some updates
- Auto reconnect
lavinmqperf throughput
on disconnect - Render HTTP API docs using Stoplight Elements
- HTTP API: /api/connections/:user, lists connections by a specific user
- Follower lag is now based on bytes written to action queue instead of socket #652
- Change how delayed exchanges are exported with definitions #663
- Force 4096 bytes frame_max for WebSocket connections #681
- Federated queues now only transfers messages if there is a consumer on the downstream queue #637
- Handle proxied WebSocket connections #680
- Empty ack files created for all segments #658
- UI: Set proper width (colspan) for pagination cell #662
- Provide better information about connections LavinMQ initiates #613
- Bugfix: Make sure shovels reconnect after destination disconnects #667
- LavinMQ now waits for any followers to be in sync before shutting down #645
- UI: Creating queues and exchanges in the UI now defaults to durable #656
- Rename config.ini -> lavinmq.ini #664
- Replication lag is now exported in metrics #646
- Don't use shovel name as consumer tag #634
- Keep the same vhost selected when creating queues #629
- Make sure name of Queues, Exchanges & Vhosts is not longer than 255 characters #631
- Add nilguard for matching x-delayed-type argument #639
- Improved logging during definitions loading #621
- LavinMQ now calls Systemd.notify_ready when started as follower #626
- A bug causing faulty definition frames for delayed exchanges, preventing LavinMQ from starting #620
- Better table views for Queues, where the name isn't cut of
- Persist table sorting between page loads
- Don't include permissions in users array in definitions json export, as that was incompatible with other brokers
- Don't mmap a segment file to just verify the schema version (uses pread instead)
- Build binaries and container images using Crystal 1.11.0
- Don't allow clients open an already open channel
- Use DirectDispatcher for logging and add more logging to startup procedure #619
- Support for Consumer timeouts, default none.
- Version 1.2.6 may not include the bumped version of lavinmq, so instead use version 1.2.7
- Don't update user's password hash if given password is the same as current #586
- Remove old segments in the background for stream queues #608
- New amq-protocol.cr version 1.1.12
- Add package build for Debian 12 (bookworm) #597
- Do not update permissions if they are the same #609
- Do not update password hash if given current password #586
- Add playwright for frontend specs #560
- Consumer arguments support for shovels #578
- A bug in delay exchanges caused messages to be routed to x-dead-letter-exchange instead of bound queues. It also ruined any dead lettering headers.
- A bug that prevented headers exchange to match on table in message headers.
- Purging a queue with a lot of messages blocked LavinMQ from other operations.
- Message timestamps not being updated when dead lettered breaking TTL.
- Definitions uploads can now be JSON body #580
- A bug in amq-protocol caused corrupt headers when a message was dead-lettered multiple times amq-protocol/#14
- A bug in amq-protocol caused lost headers when dead-lettering amq-protocol/#12
- Block creation of queues and users when disk is close to full to prevent disk from becoming full #567
- Compacting definitions during runtime to avoid the definitions file to grow endlessly when churning bindings/queues (#571)
- Only store bind/unbind defintions if not already added, decreases definitions file growth
- Unmap segments in stream queues regularly
- Unmap segments when all consumers from a queue has disconnected
- Make it possible to declare temp queues in lavinmqperf connection-count
- Delete fully ACK'd segments when opening new segments #565
- Don't send internal error messages to clients
- Remove queues from ACL cache on deletion
- Use federated queue's name if queue name is empty #562
- Refactoring
- Use amq-protocol v1.1.8, refactor header handling
- Optimize SegmentPosition creation
- Aggressively unmapping message store segments could result in seg faults when consumers are slow.
- Stream queues, queues that can be consumed multiple times, messages (segments) are only deleted by a retention policy
- Queue message segments where opened with the wrong permissions to be able to be truncated if needed
- Acked messages reappeared after server reboot, ack files were accidently truncated
- Deliver msgs to consumer even if queue ttl is 0
- Allow multiple formats (array, string etc) of tags in definitions.json
- Acking delivery tag 0 (with multiple=true) when channel as no unacked messages will not result in an error
- Signal USR2 will unmap all mmap:ed files (in addition to force a memory garbace collection)
- Building packages for enterprise linux 9 (EL9, redhat 9, centos stream 9, rocky linux 9 etc)
- Removed "Message size snapshot", UI and API, which has been non functioning for a long time
- Crystal 1.9.2
- Replication support, followers can connect and stream data from a leader in real time, enabling hot-standby use-cases
- Config variables for free_disk_min and free_disk_warn
- Support for adding custom properties in
lavinmqperf throughput --properties '{"headers": {"a": 1}}'
- Support for random bodies in
lavinmqperf --random-bodies
- Temporary message files (per channel) are not truncated on publish, so performance for transactions are up 10x, and publishing messages larger than frame_max too
- Modifying defintions (declaring/deleting queues/exchanges etc) is now synchrous and thread safe.
- Message segments aren't ftruncated until server is cloded, as it's a slow operation
- SEGV signal always generate coredumps now (no custom signal handler for SEGV)
- Boehm GC upgraded to version 8.2.4 (from 8.2.2)
- Messages larger than frame_max, routed to multiple queues, were only written to the first queue, and corrupted the others
- Message segments are aggressively unmapped to decrease memory usage
- Exclusive queues are no longer included in definitions export
- UI error handling simplified
- Prevent memory leaks from consumer fibers which are waiting for empty queues etc.
- fsync on transaction commit, but not on publish confirm
- Don't allow creating policies with wrongly typed defintions
- Javascript bugs in the UI
- Allow importing definitions where entities lacks the vhost property
- Export vhost parameters when exporting a single vhost
- Redirect to login page when cookie expires in UI
- Single Active Consumer queue support
- Exponential backoff for shovel reconnects
- Consumer churn rate metrics
- Quicker boot time after crash
- UI view for consumers
- Added churn_rates to /api/overview call #517
- Improve RAM usage by only spawning queue_expiration loop when it's needed #512
- Better handling of JSON arguments in UI #513
- Load debug symbols by default
- Fixed some specs
- Seg fault issues with Crystal 1.8.0 and LLVM 12, so this version just rebuild of 1.1.1 using crystal 1.8.1 and LLVM 15
- Segmentation fault bug with Crystal 1.8 for exchange to exchange binding listing in API
- Consistent login handling in UI (use cookie, not basic auth)
- Shovel/federation clients now support negotiating frame_max with upstream server
- Remove signal handler for SEGV (segmentation fault) in release mode so that a coredump is generated
- Don't include stat history when listing exchanges
- UI table refactoring so that multiple tables can have pagination for instance
- UI keeps trying to load data while server is offline
- Paused queues will no longer resume on restart, instead they will stay paused untill manually resumed #511
lavinmqctl definitions <datadir>
to generate definitions json from an existing data dir for emergency recovery
- Only mmap message store files on-demand, decreasing memory usage for arbitrary long queues to 0
- CSP rules in the UI, forbids inline js etc.
- Support
?columns=
query for all API endpoints - The HTTP API now supports cookie authentication, in addition to basic auth
- Precompress static assets (inflate on-demand if client don't accept deflate)
- Don't include historic message stats when listing queues via the API
- New favicon (that works both in dark and light mode)
- Return 403 rather than 401 for access refused in /api (401 only if unauthenticated)
- Cleaning up JS in UI
- Error message in UI when lacking access to Logs/Vhosts/Users/shovels/federation
- Autocomplete queues/vhosts is now correct in the UI (selecting only from the vhost in question)
- Deliveries of messages larger than socket_buffer_size (16KB) on x86_64 fixed in Crystal 1.8.0 due to faulty LibC bindings
- Increased responsiveness in cases with very fast consumers
- UI: Consumers listing on Queue page
- UI: Users with vhost access can also list all connections/channels/consumers in that vhost
- Require
administrator
tag to show logs in UI/API - VHost dropdown menu is now sorted by name
- Optimized images in UI (replace jpg/png with webp, svg and css gradients)
- Calculate etags for static resources at compile time
- Use weak etags so that responses can be compressed without dropping the etag
- no-cache for views and static resources, the browser will still cache them, but query the browser if there are newer versions
- Use the hash part of the URL as arguments to /queue and other views, so that the browser reuse the same cached HTML
- Log exchange #473
- A lot of management UI fixes
- Disable proxy buffering of /api/livelog
- Use /tmp/lavinmqctl.sock as unix socket path for lavinmqctl on all platforms
- Make HTTP unix sockets world writeable, authentication is done on the protocol level
- Keep debug symbols in debian packages, no separate dbgsym package required
- JS error when checking authentication
- Optimized basic auth check
- Add lavinmq user when installing Debian/Ubuntu deb packages
- Each queue now has its own message store, simplifying a lot of code (net -1500 LOC), but sacrificing fanout performance and persistent exchange support (to be replaced with stream queues). Single queue performance is better (as only one write is needed per message) and no message GC is needed, disk space usage is better.
- Backup data dir before migration (remember to delete when successful)
- pcre2 as regex engine
- No flash of layout when not logged in to the UI
- Delete temporary messages on transaction rollback
- Log view in the UI, uses SSE to live stream any logs from the server
- Use relative links in the UI, so that the mgmt interface can be mapped at any path
- HTML views are now templated using ECR
- Own implementation of embedding UI assets in executable
- Fixed potential message store corruption bug, if client disconnected while publishing (and body frame split over multiple TCP packets)
- Include libsystemd-pthread in container image so that lavinmqperf works again
- Builds are reproducible
- Side menu in manager is now more responsive to smaller browser windows #437
- Updated Chart.js version form v2.9.4 to v4.0.1 #426
- Build lavinmqperf with multi threading
lavinmqperf connection-count
now uses multiple fibers to take use of multi threading- Charts are updated faster with recent information
- UI updates for a better responsive experience #463
- Property tag shortcuts for JSON Payload fixed #441
- Warn if vm.max_map_count is low on boot
- Restore priority queues correctly #436
- Increased multi threading compability
- Can re-decalre a delayed-message exchange without failing #450
- Upload definitions to a specific vhost only
- Building RPM packages (for Fedora 37 currently, please request others if needed)
- Build DEB debuginfo/debugsource packages
- Include debug symbols in the container image binaries
install
/uninstall
targets inMakefile
- Allow administrators to change user's tags without also updating password
- Doesn't try to send publish confirms before publish (so messaged being delivered might still be unconfirmed)
- Understandable error message from lavinmqctl if lavinmq isn't running
- Lint openapi spec before building API docs
- Messages published in a transaction now gets their timestamp at the time of commit
- Impersonator tag now works as it should (allow messages to have another
user_id
property than the user publishing it) - Unacked messages are only stored on the Channel level now, no double booking in the Queue, ~17% performance increase
- Close client socket as soon as Connection#CloseOk has been read
- Close channel if a new publish starts before another publish has finished
- Prevent double ack in a transaction
- Precondition error if trying to TxCommit/Rollback when TxSelect hasn't been issued
- Don't requeue uncommited ack:ed messages in Tx on BasicRecover
- Include the message timestamp and the TTL in the queue index for faster handling of expired message when the Queue has a message TTL
- Migrating index files to the new queue index format
- New RoughTime methods for faster time lookups
- Transaction support in lavinmqperf
- Spec stage/layer in
Dockerfile
:docker build --target spec .
- Queue/exchange arguments has priority over policies, but lowest value wins in case of numeric property
- Removed the use of StringPool for short strings, no performance impact and lower memory usage
- Proper error message if listing in UI includes error items
- Correct handling of zero TTL messages (expire on requeue)
- 6% publish rate increase due to caching of segment id (1.6M msgs/s locally)
- Include ca-certificates in container image so that lavinmqperf can connect to AMQPS servers with valid certs
- Unacked basic_get messages werent accounted for, which in rare cases could lead to message loss (unacked for a long time and then requeued)
- Always fsync on transaction commit (if the transaction included persistent messages)
- Build container image and debian packages with crystal 1.6.2
- lavinmqctl list_connections connection_properties emulates the rabbitmqctl output format
- Command line arguments overrides config file settings
- lavinmqperf queue-churn uses random queue names for parallel runs
- Improved user handling (#400)
- BasicRecover w/ requeue should return all unacked messages to the queues (#398)
- Don't include basic_get messages when limiting global prefetch
- Support for AMQP transactions (#403)
- support for set_permissions to lavinmqctl (#397)
- Let consumers pull messages from queues (#391
- Keep same Logger for server restarts (#399)
- Removed first/last timestamp from Queue view, as it as poorly implemented (#392)
- Selects the selected vhost as default when creating queue (#394)
- Add number of persistent messages in queue response (#390)
- Allow "policy maker"-user to export/import vhost definitions (#379)
- Ensure Http tag does not give management access (#381)
- If the server crashed, the index files could in many cases be corrupted and result in message loss (#384)
Measure and log time it takes to collect metrics in stats_loop (#371)
- Queue size metric details to present expensive queue metrics calculation (#362)
- Support for vhost limits (max-queues and max-connections)
- Support for configuring max_message_size (default 128MB)
- The amount of ready and unacknowledged messages are shown in the nodes details (#368)
- Queue multi action UI, purge or delete multiple queues (#330)
- Shovel error feedback, ability to see why a shovel failed without consulting the logs (#328)
- Can pass queue and consumer arguments in lavinmqperf
- Shovel configuration error feedback (#328)
- Can reset vhosts (#321)
lavinmqperf connection-count
for benchmarking many connections- Read cgroup max memory, both for cgroup v1 and v2
- Show message rates per vhost (#355)
- Kubernetes example file (./extras/kubernetes.yaml)
- Fix potential corruption by race condition between multiple consumers
- Stop Queue if unrecoverable read error (i.e. corruption) (#318)
- Handle both ackmode and ack_mode as param to "Get messages" (#347)
- Number of messages was never used when puring from UI (#337)
- Use the statically linked gc libary, which gives fewer GC pauses (#337)
- Report which protocol each listener uses in /api/overview (#348)
- Limit API result sets, truncate instead of corrupt output (#343)
- Truncate spare index files on queue index restore for decreased memory usage on recovery
- Renamed to LavinMQ
- Limit number of consumers listed on Queue page, improve load time if there's lots of consumers (#327)
- Count consumers more efficiently (#346)
- Stop building deb packages for Ubuntu 18.04
- New logging framework (#332)
- Improved websocket example page (./static/ws.html)
- Base container on crystal 1.4.1 and ubuntu 22.04 (openssl 3.0)
- Option do configure tcp keepalive via config file
- Allow or block guest user using loopback address. (#305)
- Reject and requeue is now default option when getting messages in UI. (#307)
- Show hostname in header (#308)
- Prometheus metrics
- Make it possible to reque Get messages last with the HTTP API
- Show server hostname in UI
- Displaying timestamp of first and last message in each Queue (HTTP API/UI)
- Option to set max count of how many messages to purge
- lavinmqperf throughput have a max uncofirmed messages option
- lavinmqperf throughput can multi ack X number of messages
- lavinmqperf consumer-churn command
- lavinmqctl status command
- Remove SystemD socket activation/seamless restart (#303)
- GC collect every 10s and unmap GC memory as soon as possible
- No 2GB limit of MFiles (segments/queue indicies)
- Messages are requeued correctly if delivery fails
- Can log to file using log_file config option
- Fix print build info on startup, log prefix on each line
- Faster JSON generation for queues
- Build with Crystal 1.3.1
- Allow Get/Reject messages from paused queues in the HTTP API
- Use /var/lib/lavinmq as default path for data in containers
- libsystemd is no longer a dependency
- Faster ready messages bytesize counting
- Fix stuck deliver_loop by yielding once in a while
- On
USR1
print segments referenced by each queue - Log to file, via config option
log_file
- New option
--build-info
to print build information (Crystal, LLVM version etc) - New option
--no-data-dir-lock
to stop lock file being created - Added
lavinmqctl
andlavinmqperf
binaries to Docker images - Packages and images built with Crystal 1.2.1 and LLVM 10
- Keep debug symbols in Docker builds
- MFile (mmap) unmap pointer bug
- VHost definition import failed if default user was renamed
- Definitions export bug if compiled with LLVM 11
- Memory reporting on BSD/Mac, value was kbyte but handled as byte
- Assertions against acking wrong messages
- Handle IO::Error exceptions in read_loop
- Unix domain socket default location changed to
/dev/shm/lavinmq-http.sock
on Linux - Don't log if client EOF on connect, such as healthchecks
- When starting, make sure to only load queues once even if the defintions.amqp includes creating/deleting the same queue multiple times
- Speed up logging by only looking at ENV once
- StartLimitIntervalSec was in the wrong SystemD service file section
- Catch and only log IO::Errors in accept loop (could happen if client disconnected very soon after TCP was established)
- Log backtrace if unhandled exception occurs
- Only log if a publish confirm can't be delivered to client, don't raise
- Restore PROXY protocol v2 functionality
- Correct header names for Received/Sent bytes in Connections listing
- Build script fixes
- Charts rendered correctly
- FreeBSD compatibility
- Crystal 1.0.0 compatibility
- Publisher confirm count to Overview chart
- Support for PROXY protocol v2, including SSL information
- Delayed message exchange bug fix
- Trigger explicit GC of message segments on purge and delete queue
- WebSocket support, for use with https://github.com/cloudamqp/amqp-client.js
- Compress HTTP responses
- Faster restoring of queue indexes on boot
- Reply with FlowOk when getting Flow from channel
- Consitent clean up of dropped connections
- Mark vhost as dirty on boot to run at least one GC
- x-frame-options now applied correctly
- Confirms are sent before messages are delivered to consumers
- Federation links connection recovery improved
- Null padded index files are truncated on restore
- File descriptors are always closed when files are deleted
- Lower default segment size to 8MB
- Include client provided connection name (if any) in log statements
- Deleted queues could reappear after a crash
- Never send frames to closed channels
- Checking RSS on OS X could fail when FD limit was reached
- Escaping connection name in UI to prevent XSS
- Crystal 0.36.0 compability
- Don't open a temp write for every channel, only when needed
- Support for consumer priority
- Display the timestamp of the first & last message in a Queue, reveals consumer lag
- Index files are memory-mapped which makes them much faster
- Default git branch is renamed to main
- Default to 8MB segment size on non-Linux machines (that doesn't support hole punching)
- Default to 300s heartbeat timeout
- Consumer accounting wasn't right when client disconnected
- Some stats could overflow, fixed by making the counter UInt64
- Federation: improvements to how messages are acked
- Segment positions must be in order for GC to work
- Show queue arguments in queue list
- Removed ability to ack with requeue from HTTP API
- Bug where we tried to write beyond segment capacity
- Missing return when bind/unbind preconditions failed
- Restore Queue@max_length_bytes when policy changes
- Start federation links when exchange policy is applied
- Don't expire messages when the queue has been closed
- Mark vhost as dirty when deleting or purging queues
- Overwrite user on import definitions if used already exist
- Passwords are exported in RabbitMQ compatible format
- Message properties are included in shoveled and federated messages
- Make sure client connections are cleaned up correctly
- Bug when creating and listing users in lavinmqctl
- Kill process if segment GC loop fails unexpectedly
- SegmentPosition is requeued if not expired
- Writes to
ack
file is always flushed to disk
- Autocomplete queues and exchanges in UI
- Create and delete queues and exchanges from lavinmqctl
- x-max-length is always respected
- Validate x-max-priority
- Better handling in UI on server errors
- Remember table sorting option until session ends + correct sorting on page refresh
- Refresh last used time on queue when policy with expire applies to it
- Improved rendering of charts
- Allow all printable ASCII characters in entity (queue and exchnage) names.
- Webhook shovel
- Autofill of update policy form when click on policy name in the queue, exchange or policies views.
- Improved rendering of charts
- Allow all printable ASCII characters in entity (queue and exchange) names.
- Keep unacked messages sorted, as the merge sort in segment GC expects
- Requeued messages wasn't always inserted back in correct order into the Ready queue
- Report correct disk usage for mmap:ed files
- Force close AMQP connections on shutdown after 10s timeout
- Arguments given on command line overrides config file settings
- Bug where messages larger than frame_max didn't get published properly
- Message rate stats count messages in and out, not messages routed
- Charts now shows all the data it got, not limited
- Debug symbols for ARM builds
- Only perform segment GC if messages has been consumed/deleted
- Copy message bodies (that fit in a single frame) to RAM before writing to msg store so that slow clients don't block
- frame_max lowered to 128kb
- Write default definitions to disk immediately on start, don't wait for compaction
- Decreased memory usage when queues are long (~25%) and ~10% higher throughput performance
- Don't do unnecessary async msync syscalls
- UI improvements
- Prefetch global now accounts for all consumers on the channel
- Improved HTTP API compatibility
- A lot more commands added to lavinmqctl
- Messages that can't be delivered to client is properly requeued now
- Support for uploading definitions via the HTTP API (earlier only UI)
- Fixed a counter could overflow when there was more than 2GB of messages in the queues
- Many API calls are more robust when it's fed erroneous input data
- Consistent HTTP status responses
- Smarter segment GC where we iterate the existing ready/unack queues instead of creating a new array
- Increase systemd max start time to 5min
- Optimize two cases in topic exchanges
- Building and distributing ARM64 debian and AMD64 RPM packages (via packagecloud.io)
- HTTP API documentation
- Log level is updated on SIGUP if changed in config
- tcp_proxy_protocol config for if PROXY protocol is used on TCP connections
- Optimize publish of persisted messages when when publish confirm isn't enabled
- Don't read message from disk on expiration unless required
- Lower IOPS usage when messages are expired and all data doesn't fit in disk cache
- Churn metrics correctly reported from closed connections/channels
- UI: Display more connection properties such as max_frame, TLS version and cipher
- UI: Nicer charts
- UI: Default sort order is now descending
- Releases are published on Docker hub: https://hub.docker.com/repository/docker/cloudamqp/lavinmq
- Bug where segment files could be truncated at boot
- Default segment size is now 1 GB (up from 32 MB)
- Report size of deleted segments without holes
- Truncate segments after last message (not hole punching)
- Looks for a config file at /etc/lavinmq
- Uses ENV["StateDirectory"] as data dir if set
- Support for systemd socket activation, both of the HTTP and AMQP sockets
- All frames are counted as heartbeats, but we also make sure to send heartbeats if we only receive traffic
- Regression where only the first exchange to exchange binding was respected
- UI: Show exchange arguments
- Send heartbeats at heartbeat timeout / 2
- UI: Always base64 bodies if not valid utf8
- HTTP API: Message stats on vhost
- HTTP API: More stat properites at /api/nodes
- HTTP API: Allow publishing msgs without body
- GC collection doesn't close mmap:ings
- Don't delete segments that might have references to it
- Write lock around segment rotation
- Don't double base64 encode message bodies in UI
- Allow PUT to queues without body
- When allowing TLS 1.0 and 1.1, add SECLEVEL=1 to ciphers list (required in ubuntu/debian)
- Corrent page aligment when hole punching segment files
- Don't strip debug symbols in debian/ubuntu package
- Considerably faster garbage collection of segments and hole punching
-
tls_min_version configuration option, default is 1.2, but 1.0, 1.1 and 1.3 is are also allowed options
-
tls_ciphers configuration option that sets enabled TLS ciphers (config and cmd line)
-
Log IP when TLS connection fails
-
Limit syscalls server is allowed to call, in systemd service file
-
Don't log HTTP error when client disconnects
- Routing of binding keys with multiple wildcards fixed
- Memory usage monitoring is now showing current RSS, not max RSS
- Consumer cancellation doesn't requeue unacked messages
- UI: No more JSON parsing errors when the server is offline
- UI: Fix name filter pagination bug
- Support delayed exchange via policy and x-delayed-message exchange type
- Clear all user permissions to a vhost when it's deleted
- Allow exchange to exchange binding for internal exchanges
- Redeclare queue updatex expiration time correctly
- Stricter validation of queue argments
- Stricter validation of frame sizes
- Closing connections on missed heartbeat (even if the TCP connection is alive)
- Correctly requeue cancelled consumers messages on close
- Respect the not_in_use flag when deleting exchanges
- UI: Fixing the Unbind button on Exchange in the UI
- Support for Nack with delivery tag 0
- Stricter exchange and queue name validation
- Dead-letters can't loop
- Detect header/body frames that are out of order
- Don't allow binding/unbinding exclusive queues
- Use the shortest TTL of expiration header and queue message-ttl
- Validates the expiration field on publish
- Semantic comparison of headers when declaring queues/exchanges
- On-disk file formats has changed so previous data directories are incompatible with this version
- Decreased memory usage and increased performance by reimplemented segment GC
- Only listen on localhost by default
- DEB packages are distributed via packagecloud.io
- Log less on shutdown
- Higher throughput due to revamped segment GC algorithm
- Validate x-match headers
- Don't allow declaring or deleting the default exchange
- lavinmqctl now uses a private unix socket for communication
- Make queue/exchange delete and unbind idempotent
- Support for consistent hash exchange
- Support for exchange federation
- Support for priority queues
- Ability to "pause" queues, stopping messages to be delivered to consumers
- max-length-bytes supported as queue argument and policy
- UI: Shows bytes of messages a queue hold
- UI: Show data rates and heartbeats in connections listing
- Reload TLS certificates on HUP signal
- systemctl reload lavinmq now supported in systemd (by sending HUP to main pid)
- UNIX socket support for HTTP server
- Documented how persistent exchange works in the readme
- Promethous exporter at /metrics
- Respect the CC header when dead-lettering
- Support for Decimal values in headers
- UI: Show Unroutable messages rates in Exchange graph
- UI: Churn stats
- Queue bind now substitutes empty queue and routing key values with last declared queue
- UserID header is now validate
- Better server properties sent on connection establishment
- Using mmap to read/write to the segment files, almost doubling the performance
- UI: format uptime, format numbers according to browser locale
- Automatically add permissions for the user creating a vhost to that vhost
- Persistent exchange support, an exchange that can republish messages to a queue
- Unroutable message count on exchanges
- perf throughput now accepts --time, --pmessages and --cmessages arguments
- perf throughput rate limiter is vastly improved and much more accurate
- robots.txt to disallow crawling of the mgmt UI
- The --persistent flag is actually being respected in lavinmqperf throughput
- On shutdown, force close client connections
- Can now successfully delete shovels that has connection problems
- Prevent overflow exception in shovel, don't look for short queues
- Fixed overflow exception in /api/nodes if uptime was more than Int32::MAX milliseconds
- Crystal 0.35 compatibility
- Decrease segment position counter on queue delete
- fsyncing on publish confirm as soon as possible (previously only every 200ms)
- robots.txt file to disallow crawling
- Possibility to cancel consumers from the UI
- Only use
copy_file_range
when the glibc version supports it
- Display message rates in queues list in mgmt UI
- Config for changing endianess of on-disk data
- XSS in shovel UI
- Echo incoming heartbeat if we didn't send one recently
- Faster segment GC
- Using zero-copy syscall
copy_file_range
between temp file and segment
- The way to find holes in segment files to punch is much improved
- Updated amq-protocol.cr, fixes skipping headers in partial GC
- All settings in the file config is respected now, not just a few
- Partial GC of segments by hole punching, disk usage is much lower now
- Lower default file read buffer to 16KB
- Removed some HTTP protection measures that aren't applicable
- If writing to the definitions.amqp file fails abort the whole application
- Periodically write to the lock file to detect lost lock
- Does now notify systemd when properly started
- Keep reference to the opened .lock file until shutdown so it's not GCed
- Publish stats correct
- Crystal 0.34.x compability
- Rescue error while trying to parse the PROXY protocol
- Header exchange binding without arguments matches empty message headers
- lavinmqperf throughput now declares queues smarter
- Decreased default file buffer size to 128kb
- Increased default socket buffer size to 16kb
- Log a warning if not built in release mode
- Print out data dir on start up
- Fiber.yield only in IO.copy, it balances clients better
- Don't log warnings if msg body can't be fully read from disconnected client
- .lock file in the data dir that's locked on start so that only one instance can use it at a time
- Protection against common HTTP attacks
- Nodes page with details on node usage
- Snapcraft configuration file
- Dockerfile
- 'Move messages' in the UI now uses current user's credentials for the shovel
- Don't retry shovel if it's stopped
- /api/nodes fd_limit is now correct again
- Flush segment before resetting position if message write fails
- Message bodies larger than frame_max size weren't correctly written to disk
- If a segment is missing when reading metadata we stopped there, now we loop until we find a message we can read
- Ignore all errors when closing client socket
- If a body can't be read from socket, reset position on segment and continue (don't rotate segment)
- File descriptor limit is automatically maximized on start
- Only keep one segment per queue open at any one time
- 'Lost connection' is now only reported on debug level
- In each vhost dir and each queue dir are now a file outputted with the plain text name
- FD leak in queues. Segments weren't closed until all queue missed reference to it.
- Bug when publishing to a queue that has reach its max-length
- Memory leak of queue lookup caches, the caches are now moved to the Channel
- No logging of GC of segments, except in debug mode
- Message bodies smaller than a frame is written directly to disk
- Message bodies spread out over several frames to temporarily written to disk
- More stats in the /api/nodes endpoint, including CPU, diskspace, IOPS etc
- Structure the output of USR1 signal better
- Timestamps are only accurate to the second, giving a 10% publish speed boost
- Default value for queue_max_ack is doubled to 2M messages, decreasing number of index compactions
- Don't maintaine perfect round robin to consumers in high throughput scenarios, increasing delivery rate dramatically
- Move messages between queues is now working again
- Connection view is working again
- Memory leak in queue's segment position cache fixed
- Shovel now try to declare the source queue as passive, non-passive if that fails
- Using (faster) unchecked mutexes whenever possible
- Applying TTL policy to existing queues works as expected
- Removing a policy removes its effect on existing queues
- Auto-delete queues are deleted in vhost as well when closed
- Default to 0 heartbeat
- Use socket timeout for heartbeat sending, instead of a looping fiber
- Round message stat metrics to 1 decimal
- Report accumulated message stats in the /api/overview endpoint
- Exchange to exchange bindings are restored at boot correctly
- Rewritten garbage collection of message segments
- Rewritten mechanism for message index compaction
- Faster restore of queue message indexes
- Both transient and persistent messages are persisted between restarts
- More reporting when on signal USR1
- Clear ShortString string pool on signal USR2
- Message expiration loop didn't reset read position
- Message expiration could end up in an infinite loop
- Auto-delete queues are not automatically deleted at shutdown/compaction
- Messages dropped due to queue max-length are now decreasing segment refcount
- Bsearch is used for reinserting messages into ready queue
- PUT /api/user now returns 204 for updating users (earlier 200)
- More info logging around queue index compaction
- Channel#timeout is used for queue/msg expiration
- Only ignore publish frames on closed channels
- Different log message if user is missing or password is wrong
- Signal USR1 prints various stats
- Signal USR2 forces a GC collect
- Signal HUP only reloads the config file
- Changes to users (password, tags) are store to disk
- Crystal 0.33.0
- lavinmqperf: use fibers, don't fork
- Only ack:ing persistent messages are now written to the queue index
- Mutexes around the unacked dequeue in Consumer, for thread safety
- lavinmqperf: --persistent flag for throughput tests
- lavinmqperf: queues are now bound to the exchange
- GC message segments periodically instead of on rotation
- Compacting queue indexes in a more efficient way
- New implementation of Shovel, based on amqp-client.cr
- gc_segments_interval configration, how often to GC message segments
- queue_max_acks configration, compact/GC queue indexes after this many acks
- Reloading configuration on SIGHUP
- Crystal 0.32.x compatiblity (avoid reentrant mutexes)
- Reference couting of messages in segments for GC purposes could go negative
- Multiple dead lettering bugs
- Faster restoring of indexes by using another data type
- Make amq.default exchange clickable in the web UI
- Make it possible to unbind bindings with empty routing key in web UI
- Dead letter publishes won't cause a publish loop due to cached look up
- Queue bind with empty queue name default to last declared tmp queue
- Don't allow binding/unbinding from the default exchange
- Nicer formatting of numbers in the web UI
- Now possible to unbind binding from the exchange view in the web UI
- More efficent amq.default exchange
- Crystal 0.31.0 and multi threading compability
- Make stat counters UInt64 to avoid overflows
- Send ConfirmOk before adding consumer to queue
- Correctly report FD limit in Linux
- Round rates in the UI to 1 decimal
- lavinmqperf throughput now forks for each connection instead of spawn
- Speed up GC of segments by using reference counting
- Sorting of numbers is done correctly
- Dont wakeup the heartbeat loop on connection cleanup, might be the cause of a Invalid memory access
- Don't fallocate/preallocate segment or index files, minimal performance gain on XFS
- Applications array with LavinMQ version added to /api/nodes response
- Overview rate stats doesn't overflow anymore
- Segment size in config is respected
- Queues now closes all FDs to segments it doesn't reference
- Basic::GetEmpty responses are correctly encoded
- Timestamps are correctly parsed (as seconds, not ms)
- Logging of clients disconnected is debug level now
- Faster queue matching on publishing by reusing a Set
- Faster GC of unused message store segments
- Do not enable TCP_NODELAY
- Faster lavinmqproxy
- Restored fairness between publishers
- Use a SparseArray as channel store, for faster access times
- Fsyncing message store and queue index if publish confirm, when idle or every 200ms
- AMQ::Protocol::Table is now backed by an IO::Memory and only parsed on-demand
- Separate buffer_size configuration for files and sockets
- Fsync when writing defintions, vhosts and users
- Make buffer_size configurable via config and increase default from 8KB to 128KB
- Pre-allocate the max size for new segments, might improve write performance (on Linux only)
- Revert to write lock behavior, but yield only when queue length > 10000
- AMQPLAIN support in shovels is implemented correctly
ShortStrings are now added to StringPool for reduced GC pressure, the pool size is printed on HUP
- Make setting the timestamp property optional through a config setting (set_timestamp), default to false
- Optimized topic exchange and fanout routing, giving ~5% and ~30% throughput boost respectively
- Using a Channel to communicate between Client and Vhost when publishing, removed the need for a lock
- Restore ability to login with AMQPLAIN mechanism
- Making a binding via the HTTP API without a routing key threw an exception
- Fix account of position in delivery loop so that we don't have to seek on disk
- Optimize disconnection of consumers with many unacked messages
- Always copy msg body to memory before writing to disk to avoid corruption if client disconnects mid-stream
- Reset position of segment when an exception is caught in delivery loop
- chmod the unix domain socket to 777, authentication is done on the protocol level anyway
- CHANGELOG file