Shotover: L7 data-layer proxy


Shotover logo

Rust dependency status


For full documentation please go to


Shotover is supported on Linux and macOS. To build Shotover from source please refer to the contributing documentation

What is Shotover?

Shotover is a high performance, configurable and extensible L7 data-layer proxy for controlling, managing and modifying the flow of database requests in transit. It can be used to solve many different operational and interoperability challenges by transparently intercepting and transforming queries. It is transparent in the sense that it can be plugged into your architecture without requiring application change.

Shotover currently supports intercepting requests for the following technologies (sources):

  • Cassandra (CQL4)
  • Redis (RESP2)

It currently supports writing output to the following technologies (sinks):

  • Cassandra
  • Redis
  • Kafka

What problems does Shotover solve?

Concrete examples where Shotover has been applied include:

More broadly, Shotover is designed to be used for a very wide ranging class of problems where it is useful to transparently intercept a database call and redirect it. This allows you to change the behaviour of running applications at the infrastructure level without change to the application code itself. Some examples where we envisage Shotover could be deployed include:

  • Moving very large or very hot tenants/customers/keys (that can cause unbalanced partition problems in some systems) to a separate data store by intercepting and redirecting queries for those particular keys
  • Dual writing and/or query translation to allow the underlying storage technology to be changed (for example, from DynamoDB to Apache Cassandra)
  • As an alternative to Change Data Capture technology to send writes to a message stream such as Apache Kafka in addition to the primary database
  • Adding auditing, encryption or other security measures

Of course, Shotover is designed to be configurable and extensible so use your imagination and let us know what uses you find!

Deploying Shotover

Shotover can be deployed in several different ways based on the problem you are trying to solve, but they all fall into three categories:

  • As an application sidecar - Shotover is pretty lightweight, so feel free to deploy it as a sidecar to each of your application instances.
  • As a stand-alone proxy - If you are building a Service/DBaaS/Common data layer, you can deploy Shotover on standalone hardware and really let it fly.
  • As a sidecar to your database - You can also stick Shotover on the same instance/server as your database is running on; we do it, so we won't judge you.


  • Support relevant xDS APIs (so Shotover can play nicely with service mesh implementations)
  • Support hot-reloads and a dynamic configuration API.
  • Performance metrics.
  • Additional sources (DynamoDB and PostgreSQL are good first candidates).
  • Add support for rate limiting, explicit back-pressure mechanisms, etc.
  • Additional distributed algorithm transform primitives (e.g RAFT, 2PC, etc)
  • Additional sink transforms (these generally get implemented alongside sources).
  • Support user-defined / generated sources (e.g. thrift or a gRPC service from a proto definition).
  • Simulation testing once tokio-rs/simulation reaches compatibility with tokio-2.0.
  • Zero-copy pass-through transforms and in-place query editing (performance).


Shotover refers to the Shotover (Kimi-ākau) river in Otago, New Zealand - close to Queenstown and eventually flowing into Lake Wakatipu via the Kawarau River, it's famous for white water rafting, bungy-jumping, fast rapids and jet boating.

  • Validate topology.yaml

    Validate topology.yaml

    • [x] every transform chain ends in a terminating transform
    • [x] a terminating transform is not followed by a non-terminating transform transforms are compatible with each other e.g. RedisTimestampTagger -> CassandraDestination will make a follow up PR for this as this one is large enough
    opened by conorbros 22
  • Implement TLS support for incoming redis connections

    Implement TLS support for incoming redis connections


    The plan is to specify paths to keys and certs like this:

          batch_size_hint: 1
          listen_addr: ""
            certificate_path: "examples/redis-tls/tls_keys/redis.crt"
            private_key_path: "examples/redis-tls/tls_keys/redis.key"
        - RedisDestination:
            remote_address: ""
              certificate_path: "examples/redis-tls/tls_keys/redis.crt"
              private_key_path: "examples/redis-tls/tls_keys/redis.key"
      testtopic: 5
      redis_prod: redis_chain

    I think repeating the same paths when we are just doing a simple pass through like this is fine. It keeps the configuration format simple and allows flexibility of seperate keys between incoming and outgoing connections and even between different sources and outgoing endpoints. Open to other ideas though.

    This PR

    But the scope of this PR is to just implement redis support for incoming TLS connections. After this PR I will do two more PRs for:

    1. redis outgoing
    2. cassandra ingoing and outgoing


    I have used the key/certificate formats as described here Are there any other specific key/certificate formats I should/need to support and test with?


    Currently the redis-tls/ script can be used to create a connection when shotover is configured to use redis tls. But I still need to do the following:

    • [x] add integration test
    • [x] address TODO comments
    • [x] trim out unneeded keys from examples/redis-tls/tls_keys, not sure if we need any of these for different test cases.
    opened by rukai 21
  • Update metrics and pktparse

    Update metrics and pktparse

    The timing macro in the latest version of metrics has been replaced with histogram.

    pktparse needed the feature flag to be set to serde instead of derive.

    opened by conorbros 18
  • Rust doc core traits

    Rust doc core traits

    I've started the process of documenting some of the core traits and other important bits of shotover. This is still a WIP, but please sound off in the comments for any areas I haven't covered as far as cargo doc goes.

    opened by benbromhead 14
  • Cassandra source closes socket

    Cassandra source closes socket

    In writing a set of integration tests. Cassandra-rs will fail to connect to shotover configured with a Cassandra source, while cqlsh will connect succesfully.

    After a quick look at wireshark, it appears that the cassandra-rs driver (a wrapper around the c/c++ datastax one) tries a few unsupported protocol version, which fail or get downgraded. Cassandra itself wont shutdown the tcp connection, whereas shotover will causeing the driver to error out.

    Given Cassandra supports this behaviour (as broken as it seems), shotover needs to support this. Protocol version errors shouldn't cause us to drop the connection.

    good first issue 
    opened by benbromhead 14
  • Remove Cassandra cluster tests

    Remove Cassandra cluster tests

    - Always run Shotover on 9043 and Cassandra on it's default port of 9042 so it's easier to reason about what you are connecting to - Remove the cluster test as it does not properly test cluster functionality. Currently the driver makes the first connection to Shotover and then establishes the rest of the connections directly to Cassandra
    opened by conorbros 12
  • Redis cluster ports rewrite

    Redis cluster ports rewrite

    • rename RedisClusterSlotsRewrite to RedisClusterTopologyRewrite done in #282
    • have it catch "CLUSTER SLOTS", "CLUSTER REPLICAS", and "CLUSTER NODES" messages and rewrite the ports

    Other Redis commands that also return ports:

    • (replaced by cluster replicas in version 5, do we need to handle this one still?)
    opened by conorbros 12
  • Tee transform breaks auth isolation because BufferedChains are shared

    Tee transform breaks auth isolation because BufferedChains are shared

    Describe the bug

    This is another auth isolation bug that is very similar to #204. Authentication support in RedisSinkCluster assumes that each instance of itself is dedicated per client connection to Shotover. Transforms like Tee (and the since-removed PoolConnections) stores state in shared references (Arc) in a way that violates this assumption.

    To Reproduce

    Steps to reproduce the behavior:

    1. Add auth support to the redis-cluster-dr example.
    2. Connect to primary cluster using redis-cli without authentication.
    3. Connect to primary cluster using redis-cli with authentication.
    4. Connect to secondary cluster using redis-cli with authentication.
    5. Attempt to write something using (2), which should fail with a NOAUTH.
    6. Check that the write did not go through using (4)... and this is is the problem. The write went through.

    The successful authentication from (3) also authenticates the shared DR chain, which is also used by (2).

    Expected behaviour

    • Unauthenticated connections must be prevented from writing to the secondary (DR) cluster.
    • Authenticated contexts must be kept isolated between connections.
    • BufferedChains possibly shouldn't be shared by default?

    Systems and Version:

    • Shotover Version 0.1.0
    bug redis 
    opened by XA21X 11
  • Cassandra flags

    Cassandra flags


    • Enables setting the tracing flag in cassandra-cpp
    • Fixes parsing of flags in cassandra-protocol

    At the moment Shotover is just stripping flags from messages. This PR implements support for flags. Currently this PR just tests we can send flags without error, but the followup: #854 uses this support to get tracing information from queries sent through Shotover.

    • [ ] switch to shotover fork of cassandra-cpp
    opened by conorbros 10
  • Create custom cassandra image for single instance integration tests

    Create custom cassandra image for single instance integration tests

    On my machine it now takes 5s to startup the cassandra container instead of 80s. I have not touched multi-instance integration tests because I dont think the same speedups are possible there.

    I discovered the magic speedups here: Disabling gossiping is fine because its only a single instance. Disabling virtual nodes is more iffy, but I figure its fine because the multi-instance clusters are still running with a proper virtual node setup.

    It might still be worth investigating if there is anything we can do to speedup or skip gossiping on multi-instance clusters as every node starts with a complete list of seeds. But we would want to be very careful that it doesnt alter post-setup functionality from what a production cassandra cluster would be like.

    The cassandra.yaml is from here: The only changes I made is to set enable_user_defined_functions and enable_scripted_user_defined_functions.

    opened by rukai 10
  • Switch Cassandra Docker image to bitnami

    Switch Cassandra Docker image to bitnami

    Switch all our usages of Cassandra docker images to bitnami because:

    • The maintainers are more open to PRs and have merged my PR's adding new features that we needed.
    • Removes the need for the hack because the environment variables have been added.
    opened by conorbros 10
  • Run cassandra_int_test tls tests against scylla driver

    Run cassandra_int_test tls tests against scylla driver

    For some reason the datastax driver tls tests are failing on my local machine with:

    thread 'cassandra_int_tests::source_tls_and_single_tls::case_2_datastax' panicked at 'called `Result::unwrap()` on an `Err` value: "Cassandra error SSL_NO_PEER_CERT: Underlying connection error: Error verifying peer certificate: No peer certificate found"', shotover-proxy/tests/helpers/

    To investigate the problem I added support for the scylla driver which passes just fine. I dont think its worth me investigating much further, I now have a TLS test that passes locally that I can use and its probably just some bug (UB?) in cassandra_cpp.

    opened by rukai 0
  • cassandra_int_tests: Refactor CassandraConnection execute methods

    cassandra_int_tests: Refactor CassandraConnection execute methods

    CassandraConnection implementation changes:

    • improves support for the scylla and cdrs-tokio driver backends, I think the only thing they are missing now is TLS support.
    • greatly reduces duplicated logic across: batch, prepared and regular queries. image :eyes:

    CassandraConnection API changes:

    • _fallible methods return more useful types:
      • On success they return the generic Vec of results instead of some cassandra_cpp specific type.
      • On failure they return the cdrs-tokio errors instead of cassandra_cpp errors because cdrs-tokio errors are nicer to construct and read from
    • _expect_err methods are replaced with _fallible methods, this gives us a more composable API.
    • The execute method is kept instead of just using execute_fallible because it provides a better error message on failure then just unwrap.
    • The execute_batch method is kept instead of just using execute_batch_fallible because it provides better assertions.
    opened by rukai 0
  • cluster_single_rack_v4::case_1_cdrs has many tracing errors

    cluster_single_rack_v4::case_1_cdrs has many tracing errors

    cluster_single_rack_v4::case_1_cdrs has a lot of tracing errors and it looks like it indicates a bug in our logic.

    We should investigate and fix the logic bug but we should also remove or fix the cfg!(test) which ended up doing nothing because cfg!(test) isnt enabled by integration tests.

    Introduced by the addition of cluster_single_rack_v4::case_1_cdrs in

    opened by rukai 0
  • Fix connections with no messages sent during node outage

    Fix connections with no messages sent during node outage


    • prereq PR -
    • cassandra errors that are generated in response to internal shotover errors are now Overloaded errors instead of Server errors. This is needed because the cassandra_cpp drivers will terminate the connection on Server errors but will allow the user to retry a failed message when Overloaded occurs.
    • The cassandra connection abstraction is refactored to allow for error handling:
      • Internal errors are now returned as a ResponseError instead of silently being converted to a cassandra error message.
      • The ResponseError contains the connections destination allowing the transform to recreated dead connections
      • The stream_id is only required in the case of errors allowing us to replace the Response struct with a simple type alias of Result<Message, ResponseError>
    • test_node_going_down is completely refactored to make adding unique test cases easy
      • The test logic is now split up across multiple functions that can be optionally called for each case.
      • cluster_single_rack_node_lost is removed because test_node_going_down now tests every case within a single call.
      • The refactor enabled me to add 2 new test cases to reproduce the problem this PR fixes

    I'm opening this up for review despite the unmerged prereq, the changes in helpers/ can be just ignored as they are a subset of those in

    opened by rukai 0
  • test_metrics: make it easier to understand failures

    test_metrics: make it easier to understand failures

    Possibly a bit overengineered but I just could not figure out what I was supposed to change in the expected data to make the test pass in the old implementation.

    This PR gives us:

    • Stronger assertions - we now assert entire keys exist, and in some cases assert on the corresponding value too.
    • Much better error reporting - the assertion messages give the actual output in a format exactly the same as expected string allowing easy comparison between them.

    It seems like since the test was originally written the metrics fields within a line have been changed to be alphabetically sorted, this makes our job a lot easier and allows us to assert that entire keys are included in the metrics output.

    prereq to:

    opened by rukai 0
  • v0.1.7(Oct 26, 2022)


    • Replace generic codec with direct usage of CassandraCodec (#766) #766 (Lucas Kent)
    • 9ac2931: Log cassandra connection errors (#765) (Lucas Kent) #765
    • 3ca93e7: CassandraSinkCluster fix connecting to non-local clusters (#770) (Lucas Kent) #770
    • fix protocol negotiation with clients that support protocol v5 (#771) #771 (Lucas Kent)
    • eb2d8b3: Only show filter warning once (#761) (Conor) #761
    • 3a86fcd: Build aarch64 in CI (#764) (Lucas Kent) #764
    • f2227f6: Cleanup cassandra protocol negotiation (#772) (Lucas Kent) #772
    • fe5b4d0: add timeout to new tcp connections (#774) (Conor) #774
    • Control connection always connects to configured dc/rack (#777) #777 (Lucas Kent)
    • split into v3 and v4 variants (#780) #780 (Lucas Kent)
    • 02cf509: move topology to mod (#782) (Conor) #782
    • 0bbea6d: use socket addr for nodes (#781) (Conor) #781
    • 778d7de: Fix system.peers v2 rewriting (#783) (Lucas Kent) #783
    • 04a744e: Upgrade remaining cassandra int tests to cassandra 4.0.6 (#785) (Lucas Kent) #785
    • 1c31882: remove MessageValue::Rows (#787) (Lucas Kent) #787
    • 10174bf: use docker anchors (#791) (Conor) #791
    • 9e1187c: Update deps (#793) (Lucas Kent) #793
    • e2b8032: Add cassandra codec benches (#789) (Lucas Kent) #789
    • af2fa3a: Remove unused MessageValue variants (#788) (Lucas Kent) #788
    • 16853ae: Cut CI bench compile time by a few minutes (#797) (Lucas Kent) #797
    • 9ff268b: Add null and Tuple values to int test ResultValue (#792) (Lucas Kent) #792
    • 9d87c29: Dynamic port (#786) (Conor) #786
    • 13034bc: Log control connection address (#800) (Lucas Kent) #800
    • f1c4751: Improve span naming (#794) (Lucas Kent) #794
    • 2c2b6b6: Split cassandra_int_tests into its own CI job (#796) (Lucas Kent) #796
    • 14ea9e9: CassandraSinkCluster fix routing for system keyspaces (#799) (Lucas Kent) #799
    • b3df35d: Cassandra_int_test refactor connection creation (#798) (Lucas Kent) #798
    • 43865b7: store tokens as murmur3 instead of string (#801) (Conor) #801
    • 8716f69: Parse Cassandra execute statements (#802) (Conor) #802
    • 475e7f4: unused -> dead_code (#805) (Lucas Kent) #805
    • 2b938cc: Fix cassandra protocol null handling (#784) (Lucas Kent) #784
    • a46fefa: cdrs-tokio test suite integration (#741) (Conor) #741
    • specify every node in CASSANDRA_SEEDS (#809) #809 (Lucas Kent)
    • filter out Topology and Status events (#807) #807 (Lucas Kent)
    • add standard_test_suite helper (#810) #810 (Lucas Kent)
    • 56f3ef3: Parse cassandra register messages (#813) (Lucas Kent) #813
    • 724ae49: Use statement integration tests (#803) (Lucas Kent) #803
    • 3d4d361: Update GA actions (#815) (Lucas Kent) #815
    • 6588bcc: update deps (#816) (Conor) #816
    • df03487: add host_id field to CassandraNode (#818) (Conor) #818
    • 9d5b50c: Improve DebugPrinter (#817) (Lucas Kent) #817
    • 486ca44: Bench CI speedups (#814) (Lucas Kent) #814
    • 2985349: CassandraSinkCluster keyspace based routing - handle use statements (#806) (Lucas Kent) #806
    • topology task now processes events (#812) #812 (Lucas Kent)
    • 3e100eb: Faster DockerCompose drop (#821) (Lucas Kent) #821
    • 9778c87: improve error messages (#822) (Conor) #822
    • 79b9ebc: Improve cassandra startup time by a few seconds (#820) (Lucas Kent) #820
    • 8e53ce5: update to rust 1.64 (#823) (Lucas Kent) #823
    • 36f7adb: Remove manual redis volumes from docker-compose.yml (#827) (Lucas Kent) #827
    • 7a962a6: Fix misnamed redis variables (#828) (Lucas Kent) #828
    • e62628f: Create custom cassandra image for single instance integration tests (#825) (Lucas Kent) #825
    • f97df89: Remove 1s sleep in DockerCompose::drop (#829) (Lucas Kent) #829
    • 9aa0cd2: Update deps (#819) (Lucas Kent) #819
    • ab63447: docker-compose: Store cassandra db in tmpfs (#830) (Lucas Kent) #830
    • 3583a92: CassandraNode new method (#832) (Conor) #832
    • 9c03153: update cql3 parser (#833) (Conor) #833
    • 3955be9: cassandra_int_tests add case that forces cassandra message encoding (#804) (Lucas Kent) #804
    • 6a9c307: Update clap to 4.0 (#835) (Lucas Kent) #835
    • Fix system.peers rpc_address (#837) #837 (Lucas Kent)
    • ccbb3c1: cassandra prepared statement benches (#834) (Conor) #834
    • 9386f81: Token aware routing (#824) (Conor) #824
    • Keep node list up to date via a tokio::watcher (#831) #831 (Lucas Kent)
    • Disallow inserting/removing the nodes list from outside of NodePool (#843) #843 (Lucas Kent)
    • 7b6509d: fix test (#845) (Conor) #845
    • e99c638: Remove tracing_log dep (#848) (Lucas Kent) #848
    • c83d978: Improve Cassandra new connection errors (#847) (Lucas Kent) #847
    • 95e2090: Cassandra clusters specify initial token for large startup speedup (#844) (Lucas Kent) #844
    • cross connection prepared statements (#836) #836 (Lucas Kent)
    • c7c9f49: Create custom image for cassandra 3.11.0 (#852) (Lucas Kent) #852
    • Do not log error on TCP RST (#850) #850 (Lucas Kent)
    • b8feea7: Create custom image for tls cassandra (#851) (Lucas Kent) #851
    • 17ab717: share prepared metadata between connections (#841) (Conor) #841
    • a2ce64e: Fix BenchResources drop order (#856) (Lucas Kent) #856
    • a6ebd95: Create new connections concurrently for prepared statements (#842) (Conor) #842
    • 10acaa6: Fix cassandra_cpp rpc_address warning (#860) (Lucas Kent) #860
    • add test_node_going_down (#858) #858 (Lucas Kent)
    • dcf76d4: Round Robin load balancing for CassandraSinkCluster (#846) (Conor) #846
    • cf87466: Upgrade CI to min ubuntu 20.04 (#839) (Lucas Kent) #839
    • cleanly shutdown topology task (#861) #861 (Lucas Kent)
    • 39ac5f8: Fix Ubuntu 22.04 builds (#864) (Lucas Kent) #864
    • rewrite rpc_address (#859) #859 (Lucas Kent)
    • reduce total table count (#862) #862 (Lucas Kent)
    • 6b613d3: Update deps (#863) (Lucas Kent) #863
    • 0e83fec: Set correct flags when encoding cassandra frame (#869) (Lucas Kent) #869
    • b6edc8f: document cassandra connection rx_process task (#867) (Lucas Kent) #867
    • 1d34bbb: Use cassandra_cpp async api (#865) (Lucas Kent) #865
    • 983e699: Move stop_service into DockerCompose (#866) (Lucas Kent) #866
    • d9c0a43: Cassandra flags (#853) (Conor) #853
    • f4b5a7f: Update deps + restore cassandra-cpp to upstream (#878) (Lucas Kent) #878
    • 5b7ef5e: rename init_handshake_connection -> control_connection (#874) (Lucas Kent) #874
    • fccf27c: Fix and test token aware routing (#854) (Conor) #854
    • 331a09e: Route cassandra_cpp logs -> log -> tracing (#849) (Lucas Kent) #849
    • 91a52ce: existing connections handle down node (#873) (Lucas Kent) #873
    • fcc5de6: Rename all *.yml -> *.yaml (#881) (Lucas Kent) #881
    • f6de0ca: re-enable tests (#871) (Conor) #871
    • 128aed8: release 0.1.7 (#884) (Conor) #884
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.7.tar.gz(4.42 MB)
  • v0.1.6(Aug 29, 2022)


    • 17060be: redis pubsub (#645) (Lucas Kent) #645
    • c49a38b: Implement cassandra int test driver selection (#725) (Lucas Kent) #725
    • 6224a67: Move cassandra sink receive logic into connection::receive (#727) (Lucas Kent) #727
    • b672548: Int test function propogation (#731) (Lucas Kent) #731
    • ee70553: Implement basic cassandra cluster routing (#723) (Lucas Kent) #723
    • ec83b7c: Fix another intermittent cluster failure (#734) (Lucas Kent) #734
    • 5d2e8d5: refactor redis_int_tests. (#732) (Lucas Kent) #732
    • 193e239: Update deps (#724) (Lucas Kent) #724
    • 1a117cb: Update to rust 1.63 (#742) (Lucas Kent) #742
    • f4d4878: Fix intermittent failure (final I swear) (#738) (Lucas Kent) #738
    • a57c01c: Fix a (different) intermittent failure (#743) (Lucas Kent) #743
    • 8447702: Use nodes list when making initial handshake connection (#736) (Lucas Kent) #736
    • 2d6206e: CassandraSinkCluster implement USE routing (#739) (Lucas Kent) #739
    • f911f49: Improve redis int test assert messages (#746) (Lucas Kent) #746
    • d19e190: CassandraSinkCluster query system.local for local node info (#735) (Lucas Kent) #735
    • make handshake logic robust (#747) #747 (Lucas Kent)
    • 832b836: use future-rs latest (#698) (Conor) #698
    • d2ca77d: Fix intermittent redis failure (#745) (Lucas Kent) #745
    • d9d306e: Update deps (#748) (Lucas Kent) #748
    • 79c181f: Splitup (#752) (Lucas Kent) #752
    • a5d94e3: Fix debug cassandra message dump (#751) (Lucas Kent) #751
    • 2645e25: test test_topology_task in TLS mode (#754) (Lucas Kent) #754
    • c5b4d6e: CassandraSinkCluster rewrite system.local (#744) (Lucas Kent) #744
    • 6c81054: Rename add_pushed_messages_tx -> set_pushed_messages_tx (#759) (Lucas Kent) #759
    • 97d30e7: Add test_cluster_multi_rack (#757) (Lucas Kent) #757
    • d88886f: CassandraSinkCluster system.peers rewrite (#756) (Lucas Kent) #756
    • 3fe6caa: drop docker logs to trace level (#763) (Conor) #763
    • 6b4ee3a: ConnectionFactory (#755) (Conor) #755
    • 3c8aef2: remove drop function test (#760) (Conor) #760
    • 4d6303f: Move CassandraSinkCluster into beta status (#753) (Lucas Kent) #753
    • 12a9f4e: Release shotover v0.1.6 (#762) (Lucas Kent) #762
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.6.tar.gz(4.38 MB)
  • v0.1.5(Aug 5, 2022)


    • b4fce95: protect docs (#700) (Conor) #700
    • 3453115: Update deps (#710) (Lucas Kent) #710
    • fb5d5a9: Split test_cassandra_peers_rewrite into two tests (#709) (Lucas Kent) #709
    • a42da2c: Close connection on transform error (#707) (Lucas Kent) #707
    • fe1dfde: Tiny cleanup in redis int test (#714) (Lucas Kent) #714
    • 85539c4: Replace pushed_messages_tx if let with exhaustive match (#715) (Lucas Kent) #715
    • 7394ad1: Fix transform TLS docs (#711) (Lucas Kent) #711
    • f10252d: Add CassandraSinkCluster (#717) (Lucas Kent) #717
    • 2916f2f: Remove loop from CassandraSinkSingle (#716) (Lucas Kent) #716
    • 090bd46: small cleanup in CassandraSinkSingle (#718) (Lucas Kent) #718
    • ad1e4fe: cassandra-cluster-tls int test (#722) (Conor) #722
    • 4dc4b90: Make private key optional in TlsConnectorConfig (#720) (Conor) #720
    • ea318be: Release shotover 0.1.5 (#728) (Lucas Kent) #728
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.5.tar.gz(4.30 MB)
  • v0.1.4(Jul 18, 2022)


    • 8cbef21: redis connection pool cleanup+improvement (#653) (Lucas Kent) #653
    • e751663: Update rust + deps version. (#654) (Lucas Kent) #654
    • 830ed00: Add RequestThrottling docs to the Cassandra example (#647) (Conor) #647
    • 1289c3d: Rename connection_error -> reason_for_no_nodes (#651) (Lucas Kent) #651
    • 7b362d4: enable cert check (#655) (Conor) #655
    • e070956: remove unused example (#649) (Conor) #649
    • 2b8d6de: Remove topics & Mpsc source (#652) (Conor) #652
    • cf17971: Move ChannelMessage to and rename (#657) (Conor) #657
    • 6893fbf: RedisSinkCluster handle attempts to use RESP3 (#659) (Lucas Kent) #659
    • b7f1dca: store response as single Message instead of Vec (#660) (Lucas Kent) #660
    • 73b1187: Improve cassandra_connection panic message (#663) (Lucas Kent) #663
    • 6520a39: Remove ChannelResult and refactor short_circuit (#658) (Lucas Kent) #658
    • d4317b3: minor redis cleanup (#667) (Lucas Kent) #667
    • 6b7ab5c: Refactor Protect transform (#664) (Lucas Kent) #664
    • 7cb854b: remove unused from_topology_file_without_observability (#672) (Lucas Kent) #672
    • 759fd9f: fix naming of cassandra peers example (#670) (Conor) #670
    • fe0d70c: cassandra events (#668) (Conor) #668
    • 352dcd5: remove depends_on (#669) (Conor) #669
    • e94f3e7: Remove Cassandra certs from repo (#616) (Conor) #616
    • ff1a52c: Move cassandra_int_tests modules into separate files (#673) (Lucas Kent) #673
    • 1bf9c34: Update deps (#671) (Lucas Kent) #671
    • 53c831c: cassandra peers rewrite - rewrite all native_ports (#678) (Lucas Kent) #678
    • 1e101b3: remove sodium oxide (#677) (Conor) #677
    • eb780b3: change port to u16 (#682) (Conor) #682
    • f4a5dd7: rename (#683) (Conor) #683
    • 1216d85: Update deps, lots of cassandra-protocol breaking changes (#680) (Lucas Kent) #680
    • f7c571e: Reorder CassandraOperation enum (#679) (Lucas Kent) #679
    • 799fc70: RedisSinkCluster Hiding/Handling modes (#642) (Lucas Kent) #642
    • d2583b9: CQL parser rewrite (#661) (Lucas Kent) #661
    • 0efa1c0: Fix intermittent failure in test_cluster_dr_redis (#681) (Lucas Kent) #681
    • b882b97: CassandraOperation::queries returns batch queries (#595) (Lucas Kent) #595
    • e95b04c: Convert batch QUERYs into BATCHs (#684) (Lucas Kent) #684
    • 6b72cf8: Add benches for protect transform (#687) (Lucas Kent) #687
    • 6fea1c0: compose versions (#686) (Conor) #686
    • 44526a6: Small cleanup (#688) (Lucas Kent) #688
    • 5f0049c: new rust version (#690) (Conor) #690
    • 6727a57: Pushed messages (#662) (Conor) #662
    • f0683a1: Remove unneeded Result from source return type (#689) (Lucas Kent) #689
    • c970222: Detect panics in tests (#691) (Lucas Kent) #691
    • b3ff6cb: Remove allocation in simple redis command checks (#694) (Lucas Kent) #694
    • 30e15d7: store encrypted as blob (#685) (Conor) #685
    • e2b8fc1: Remove byteorder dep (#692) (Lucas Kent) #692
    • 2ba92a0: redis bulkstring handling fixes (#693) (Lucas Kent) #693
    • a332ad3: use version specified in cassandra frame during encode/decode (#695) (Lucas Kent) #695
    • fd5115c: update deps (#697) (Conor) #697
    • 272d59e: Minor improvements (#699) (Lucas Kent) #699
    • e14cd8a: Add redis hexdump debug logs (#701) (Lucas Kent) #701
    • c4af416: Release shotover 0.1.4 (#705) (Lucas Kent) #705
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.4.tar.gz(4.29 MB)
  • v0.1.3(May 19, 2022)


    • 590b255: check in cargo lock (#571) (Conor) #571
    • 3ea7fbb: update deps (#568) (Conor) #568
    • 1346fa3: Rename transform config get_source -> get_transform (#569) (Lucas Kent) #569
    • e3e509f: Add check for untracked/uncommitted files in CI (#572) (Lucas Kent) #572
    • bc8b34a: Cassandra Request Throttling Benches (#565) (Conor) #565
    • 4ab3aaa: Cassandra request throttling non-integration bench (#566) (Lucas Kent) #566
    • 29efc31: Count BATCH queries for request throttling (#562) (Conor) #562
    • ba84b33: RequestThrottling docs (#573) (Conor) #573
    • 513486f: Minimum value for Request Throttling config (#567) (Conor) #567
    • 7ca6ef6: Parse cassandra batch messages (#576) (Lucas Kent) #576
    • d04564b: Fail to start shotover when configured port already taken (#580) (Lucas Kent) #580
    • 4b0be7b: bump up threshold (#579) (Conor) #579
    • b08d33a: split up message methods (#577) (Conor) #577
    • 1c97be1: fix docs (#582) (Conor) #582
    • 373b611: Add DebugForceParse transform (#583) (Lucas Kent) #583
    • ae4526e: move cassandra test helpers to helpers module (#584) (Conor) #584
    • 5e15f37: Add cassandra_bench example (#549) (Lucas Kent) #549
    • 97f6ac0: Add CassandraOperation::queries method to abstract over QUERY and BATCH (#570) (Lucas Kent) #570
    • d5f90a7: Batch query counting bug fix (#574) (Conor) #574
    • a57c879: batch over query tests (#586) (Conor) #586
    • 23ef672: Cleanup and improve assertions of ShotoverProcess (#585) (Lucas Kent) #585
    • 469d3f5: Accept base64 string instead of individual bytes in protect transform config (#587) (Conor) #587
    • 52a80ad: rename .cargo/config to .cargo/config.toml (#591) (Lucas Kent) #591
    • 74a0622: Improve ShotoverProcess error reporting (#590) (Lucas Kent) #590
    • 01dde88: Generate redis TLS certs at test time (#588) (Lucas Kent) #588
    • 65439e7: store single cql statement instead of a vec (#589) (Lucas Kent) #589
    • d2dd274: Switch over to published Docker image on Cassandra example (#578) (Conor) #578
    • 3856b98: Rename redis-tls/tls_keys -> redis-tls/certs (to match cassandra naming) (#593) (Lucas Kent) #593
    • eabb0bf: Add read timeout to redis_connection_async_tls. (#592) (Lucas Kent) #592
    • 189e15a: Store Wrapper.transforms as an IterMut instead of a cloned Vec (#596) (Lucas Kent) #596
    • d64e898: Remove entry from deny.toml & cargo update (#599) (Conor) #599
    • 37f3645: Reenable parallelization of packet parsing in packet tests. (#600) (Lucas Kent) #600
    • 1a0f731: Improve cassandra bench compare API (#601) (Lucas Kent) #601
    • 4d99105: Bench logging changes (#604) (Conor) #604
    • bf806ab: Don't re-register counter on cassandra sink clone (#609) (Conor) #609
    • c56f5b5: Simplify eval routing (#610) (Lucas Kent) #610
    • 1da06a2: Fix invalid command routes (#611) (Lucas Kent) #611
    • eb42bcc: Update to rust 1.60 (#603) (Lucas Kent) #603
    • 3ea1cd9: Rewrite redis_int_tests to assert on write only responses (#612) (Lucas Kent) #612
    • 5bc2133: rustfmt.toml change (#614) (Conor) #614
    • 82442a2: Fix RedisSinkCluster returning an array of responses instead of a single response (#608) (Lucas Kent) #608
    • 2c18758: Improve metrics docs (#615) (Conor) #615
    • ec694ab: move cassandra raw frame methods to a module (#613) (Conor) #613
    • 64610aa: Avoid triggering a message parse in the Null transform (#622) (Lucas Kent) #622
    • 1a1fdec: Update deps (#617) (Lucas Kent) #617
    • bec6410: Implement redis cluster sink ResponseJoin abstraction (#618) (Lucas Kent) #618
    • f8ba7f2: Fix RedisClusterPortsRewrite noauth handling (#624) (Lucas Kent) #624
    • a630a1c: Improve CassandraPeersRewrite int tests (#628) (Lucas Kent) #628
    • 185a3bf: Move redis-cluster-auth config (#626) (Lucas Kent) #626
    • e6e852b: Only parse the opcode when checking for errors in Cassandra sink (#627) (Conor) #627
    • 2f54531: read multiple cassandra frames (#633) (Conor) #633
    • 4af74c3: new benches (#635) (Conor) #635
    • 824c0f5: Use anyhow .context() instead of manually constructing error messages (#625) (Lucas Kent) #625
    • e16253c: rework redis cluster command mapping (#623) (Lucas Kent) #623
    • 7427336: use check_frame instead of from_buffer (#637) (Conor) #637
    • fd94949: CassandraPeersRewrite bugfix (#640) (Conor) #640
    • bbcff5e: Redis benchmarks test both set and get commands (#638) (Lucas Kent) #638
    • 68438e6: RoutingInfo::Random is actually random (#636) (Lucas Kent) #636
    • 7b497b1: Remove RedisClusterSink Command enum (#641) (Lucas Kent) #641
    • b7ca913: Remove MessageValue::None (#643) (Lucas Kent) #643
    • fd47e70: temp ci fix (#648) (Conor) #648
    • c912a2d: Change timeout in TcpCodecListener (#644) (Conor) #644
    • 9710bc1: Release shotover 0.1.3 (#650) (Lucas Kent) #650
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.3.tar.gz(4.27 MB)
  • v0.1.2(Mar 15, 2022)


    • 677e270: Debug transform docs (#371) (Conor) #371
    • 61a7e22: Always pass chain name into Wrapper (#374) (Conor) #374
    • a0ecbcf: Tee int tests (#359) (Conor) #359
    • 3e6974a: Cassandra protocol version negotiation (#331) (Claude Warren) #331
    • a2706a5: Minor cassandra cleanup (#380) (Lucas Kent) #380
    • 85b543d: Reuse wait for socket implementation across cassandra and redis (#379) (Lucas Kent) #379
    • ce3cb63: Fix broken doc links and enforce via mdbook-linkcheck plugin (#373) (Lucas Kent) #373
    • d7ccfb3: cleanup (#375) (Conor) #375
    • 5bc3c4a: Fix docs build (#383) (Lucas Kent) #383
    • 48ab30f: Cassandra integration test improvements (#382) (Lucas Kent) #382
    • b6c5c4b: Easy win in test runtime (#384) (Lucas Kent) #384
    • 5f77824: Fix docker_compose wait_for panic message (#386) (Lucas Kent) #386
    • 4bfe7db: Random cleanup (#387) (Lucas Kent) #387
    • fe0c68f: Update to new rust release (#390) (Lucas Kent) #390
    • 10f33b5: Use upstream cassandra-protocol (#356) (Lucas Kent) #356
    • 8d657cb: Join on source task (#388) (Lucas Kent) #388
    • 2a216b4: Rename CassandraProtocol2 to CassandraCodec (#393) (Conor) #393
    • 159d648: Cassandra keyspace int tests (#394) (Conor) #394
    • 0242019: Fix hang in RedisSinkSingle when wrapper.messages.is_empty() (#398) (Lucas Kent) #398
    • f0c9026: Cassandra table int tests (#395) (Conor) #395
    • 71bbdcd: Allow Cassandra passthrough to be configured in docker-compose.yml (#397) (Conor) #397
    • 15e58f4: update deps (#400) (Conor) #400
    • 68c1f21: Update to rust 1.57 (#401) (Lucas Kent) #401
    • 8fda707: clean up bufferedchain API (#402) (Conor) #402
    • 8364846: Add Wrapper::flush flag (#389) (Lucas Kent) #389
    • 70e03f8: cassandra type int tests (#396) (Conor) #396
    • 288afe5: Remove all TODOs from docs (#408) (Lucas Kent) #408
    • 6801c53: Cassandra functions int tests (#399) (Conor) #399
    • 1e23524: Fix QueryTypeFilter on main chain (#405) (Lucas Kent) #405
    • d1849b7: Cleanup load balance (#411) (Lucas Kent) #411
    • 590ef5e: Fix redis auth issue (#406) (Lucas Kent) #406
    • c9e52e6: remove CoalesceBehaviour (#418) (Lucas Kent) #418
    • 14b3a72: Implement test_cassandra_redis_cache integration test (#417) (Lucas Kent) #417
    • 16e928d: Get the query type for a message by a common get_query_type method (#416) (Lucas Kent) #416
    • e780579: cleanup (#423) (Conor) #423
    • a6460aa: Various fixes to transform docs (#421) (Lucas Kent) #421
    • 1bd248b: Improve cassandra int test execute_query error (#425) (Lucas Kent) #425
    • 5bf9ae3: Update cassandra-protocol (#415) (Lucas Kent) #415
    • 15d8583: Update deps (#422) (Lucas Kent) #422
    • 92480ef: Improve cassandra redis cache int test + tracing (#426) (Lucas Kent) #426
    • be3ddb6: add metrics to redis single (#410) (Conor) #410
    • 5926318: Cassandra metrics (#414) (Conor) #414
    • 8a1ed7e: Various redis cache cleanup (#428) (Lucas Kent) #428
    • e44e3a4: Redis cluster with a cluster aware client docs (#346) (Conor) #346
    • 49f13b3: Remove unused fields from destructures (#431) (Lucas Kent) #431
    • 02471a2: Update deps (#434) (Lucas Kent) #434
    • 7b07c10: Update to clap 3.0.0 (#439) (Lucas Kent) #439
    • fc69ed6: Cleanup borrows (#432) (Lucas Kent) #432
    • de4b8ee: Fix stray shotover processes (#440) (Lucas Kent) #440
    • 9a0649d: Add new value variants (#433) (Conor) #433
    • 1dd4347: Redis cache doesnt blow up when the cache path is taken (#430) (Lucas Kent) #430
    • 20783b8: Redis cache cleanup (#441) (Lucas Kent) #441
    • 06c4442: RedisTimestampTagger cleanup (#443) (Lucas Kent) #443
    • 8398674: redis cache new int test case (#446) (Lucas Kent) #446
    • 2775e99: Value support for Cassandra types (#409) (Conor) #409
    • 858e085: Update to Rust 1.58 (#449) (Conor) #449
    • 2da414b: Optimise loop (#450) (Conor) #450
    • 1ceb040: Use new f string style format macro (#451) (Lucas Kent) #451
    • 5eaeedb: Cassandra native types tests (#404) (Conor) #404
    • 44826b0: Cassandra set tests (#452) (Conor) #452
    • deca90c: Cassandra map tests (#456) (Conor) #456
    • 39be75b: Replace imports of Cassandra and Redis Frames (#455) (Claude Warren) #455
    • 0dd485a: Rename Frame -> RedisFrame (#463) (Lucas Kent) #463
    • ee4ff4f: update deps (#457) (Conor) #457
    • 4012eee: redis_timestamp_tagger bench uses better test data to avoid skipping return value processing (#460) (Lucas Kent) #460
    • 699a974: Fix QueryTypeFilter unit test (#461) (Lucas Kent) #461
    • 3d79add: fix error messages (#471) (Conor) #471
    • c8b4297: add #[must_use] to methods returning self (#470) (Conor) #470
    • 8c372e0: remove get_demo_config (#465) (Lucas Kent) #465
    • f0d8a1d: Fix CI benchmark alert comments (#467) (Lucas Kent) #467
    • 7dff553: Tee FailOnMismatch returns the correct number of messages (#468) (Lucas Kent) #468
    • 6154ab3: Implement From between Value and SQLValue (#464) (Lucas Kent) #464
    • 5f15d9a: Update deps (#442) (Lucas Kent) #442
    • 64fd8d6: Use metrics handles in transforms (#469) (Conor) #469
    • bd3bd12: Remove new no state method from TransformChain (#477) (Conor) #477
    • 45bbbb7: Fix formatting on bench comments (#478) (Lucas Kent) #478
    • 215e902: Set QueryType correctly in CassandraCodec (#448) (Claude Warren) #448
    • 82f656f: Rename RawFrame -> Frame (#480) (Lucas Kent) #480
    • df8dc36: Re-enable test_protect_kms_transform (#484) (Claude Warren) #484
    • 926cf30: small Protect transform cleanup (#489) (Lucas Kent) #489
    • 04aa463: Move MessageDetails::ReturnToSender to a field on Message (#485) (Conor) #485
    • 3b664ef: ConnectionPool -> CassandraConnection (#483) (Conor) #483
    • e665309: Rename Value -> MessageValue (#482) (Lucas Kent) #482
    • f1c5720: Add noise threshold for (#488) (Lucas Kent) #488
    • 77ecf9e: Loopback transform directly returns the message (#487) (Conor) #487
    • 59800fa: Fix CI failures when a new benchmark is added (#403) (Lucas Kent) #403
    • 6d30792: Remove dead test (#490) (Lucas Kent) #490
    • dc07697: Cleanup RedisCodec (#479) (Lucas Kent) #479
    • 4452188: No metadata cassandra codec fix (#493) (Conor) #493
    • efbc677: Initial protect test cleanup (#492) (Lucas Kent) #492
    • 7656d5f: rename (#496) (Conor) #496
    • 5be6778: Cassandra prepared statements int tests (#486) (Conor) #486
    • d2f031f: CassandraConnection cleanup (#497) (Conor) #497
    • c6e7afe: Fix ShotoverProcess timeout (#502) (Lucas Kent) #502
    • 097b803: Split protocols module into frame + codec modules (#506) (Lucas Kent) #506
    • f0cf376: Replace instances of Message::new with Message::from_frame (#504) (Lucas Kent) #504
    • 92c4351: Remove incorrect coalesce dummy message (#503) (Lucas Kent) #503
    • 5460c77: Implement Protect integration tests (#494) (Lucas Kent) #494
    • dfea291: small doc fixes (#515) (Conor) #515
    • 8afcbfd: Add empty cassandra_benches file (#513) (Conor) #513
    • 98d6c40: remove duplicated docker-entrypoint script (#511) (Conor) #511
    • 2dfca49: Fix redis benchmark initialization (#514) (Lucas Kent) #514
    • ed7baff: Replace cassandra_protocol::frame::Frame with a more strongly typed CassandraFrame (#508) (Lucas Kent) #508
    • 3f987dc: Add benchmark for filter transform (#518) (Lucas Kent) #518
    • 672e236: Update deps (#519) (Lucas Kent) #519
    • c761d2b: Cassandra benchmark (#512) (Conor) #512
    • 58bc3c6: Add debug traces to hex dump cassandra messages (#509) (Lucas Kent) #509
    • 62a98c1: Rewrite TimestampTagger and ConsistentScatter to use message.original (#501) (Conor) #501
    • 9a1f9a4: Cassandra peers (#507) (Conor) #507
    • 14cbfd7: fix compilation (#523) (Conor) #523
    • c2411cc: rewrite redis cache to use message.original (#516) (Lucas Kent) #516
    • 1c07a4f: Remove actions-rs/toolchain (#524) (Lucas Kent) #524
    • 822d5cf: Misc message details progress (#525) (Lucas Kent) #525
    • a282fb6: Add some more cassandra integration benches (#521) (Lucas Kent) #521
    • f316ec8: rewrite protect to use message.original (#526) (Lucas Kent) #526
    • 531c0e1: Rewrite QueryCounter to use message.original (#527) (Lucas Kent) #527
    • b9b427a: Delete KafkaSink (#531) (Lucas Kent) #531
    • e19c884: Improve RedisTimestampTagger logic for deciding whether to wrap or not (#536) (Lucas Kent) #536
    • 78ca01f: Cassandra TLS (#437) (Conor) #437
    • b2a87a9: remove cassandra cluster (#528) (Conor) #528
    • 1e72c2b: Benchmark logs grep includes 6 previous lines instead of 5 (#534) (Lucas Kent) #534
    • e158c79: tls benches (#539) (Conor) #539
    • 7275289: Cassandra Peers Rewrite docs and example (#530) (Conor) #530
    • 9e50031: Replace message.message_details with message.frame() (#532) (Lucas Kent) #532
    • ffc93b4: Rename examples -> example-configs, test-topologies -> test-configs (#548) (Lucas Kent) #548
    • e4fb470: Update deps (#551) (Lucas Kent) #551
    • 7a1e526: Automate DockerCompose wait logic (#552) (Lucas Kent) #552
    • da1e1d0: Move ShotoverProcess into test-helpers (#550) (Lucas Kent) #550
    • ef6f1bb: remove unneeded trait (#555) (Conor) #555
    • 441316b: Switch Cassandra Docker image to bitnami (#540) (Conor) #540
    • 33dcd25: Update deps (#560) (Lucas Kent) #560
    • 68970f2: Cassandra request throttling (#547) (Conor) #547
    • c757f1f: Improve bench time by minimizing docker container creation (#558) (Lucas Kent) #558
    • c4b85df: bump up threshold (#561) (Conor) #561
    • 41cca1d: Rename cassandra tls example/test to match redis (#564) (Lucas Kent) #564
    • af72580: release 0.1.2 (#556) (Conor) #556
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.2.tar.gz(4.19 MB)
  • v0.1.1(Nov 11, 2021)

    What's Changed

    • Bench CI improvements by @rukai in
    • Test infrastructure uses debug! instead of info! by @rukai in
    • Fix config/topology.yaml links by @rukai in
    • Swap to mdbook by @rukai in
    • Remove MessageDetails::Bypass by @rukai in
    • Update deps by @conorbros in
    • Update sqlparser by @conorbros in
    • Fix doc headings by @conorbros in
    • Rewrite redis clustering example docs by @rukai in
    • Fix testing on ubuntu 18.04 by @rukai in
    • cleanup by @rukai in
    • remove use of feature specific to cassandra-proto fork by @rukai in
    • force netlify to always deploy by @rukai in
    • Tee subchain fixes by @conorbros in
    • Debug returner transform fixes by @conorbros in
    • Instrument async code with tracing spans by @rukai in
    • Remove another cassandra-proto fork feature by @rukai in
    • Dockerfile for Shotover by @conorbros in
    • cassandra unittests assert decoded value by @rukai in
    • Bump version to v0.1.1 by @conorbros in
    • Add must_use attribute to test helpers by @rukai in
    • dependency install script and testing release workflow by @conorbros in

    Full Changelog:

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Nov 2, 2021)


    • dfefaeb: remove a BulkString -> utf8 conversion (#236) (Lucas Kent) #236
    • 872e74f: Create a file (#238) (Ben Bromhead) #238
    • b481eeb: Improve contributing documentation (#241) (Lucas Kent) #241
    • 5d3dfd9: Add non-ascii bulk string test case to redis int tests (#235) (Lucas Kent) #235
    • 821096a: Fix redis lowercase command handling (#242) (Lucas Kent) #242
    • eed9087: Spelling fixes (#243) (Lucas Kent) #243
    • d7ed72d: Cleanup duplicated redis codec logic (#245) (Lucas Kent) #245
    • ac445b7: Setup cargo deny to enforce apache compatible licenses (#239) (Lucas Kent) #239
    • 99c15fe: Skip container setup when skipping benchmark (#252) (Lucas Kent) #252
    • 661a466: Add Differences to Redis section for RedisCluster docs (#247) (Lucas Kent) #247
    • 0de2a8b: Cleanup unneeded clones in redis codec (#250) (Lucas Kent) #250
    • b6df71d: Use upstream redis-proto (#249) (Lucas Kent) #249
    • 81c4a85: Add benchmark reporting (#251) (Lucas Kent) #251
    • f61b083: Add new transform benchmark and improve null transform benchmark (#253) (Lucas Kent) #253
    • 130e69e: give a nice panic message when there is no terminating transform (#255) (Lucas Kent) #255
    • f6dd706: Fix chain_benches (#258) (Lucas Kent) #258
    • 4b4d15c: Rename Destination transforms (#259) (Conor) #259
    • 3aec7cd: Remove unused file (#261) (Conor) #261
    • d798324: Fix benchmark CI (#260) (Lucas Kent) #260
    • 72777ba: Update issue templates (#257) (Conor) #257
    • 9759533: Real fix for bench CI (#265) (Lucas Kent) #265
    • a305741: Create NOTICE (#266) (Justin Mclean) #266
    • e7dc5a1: Rename destination to sink (#267) (Lucas Kent) #267
    • 48b8654: Remove decode_as_response flag from redis codec (#264) (Lucas Kent) #264
    • b24527a: Fix bench reporting (#280) (Lucas Kent) #280
    • 19e0274: Fix ConsistencyBehaviour::LOG handling (#277) (Lucas Kent) #277
    • c4352fa: Rename to RedisClusterPortsRewrite (#282) (Conor) #282
    • 75ca259: Add nice ToC to (#274) (Lucas Kent) #274
    • ada5ddf: Refactor wrapper message (#279) (Lucas Kent) #279
    • 5190a38: Benchmark for Redis cluster ports rewrite (#283) (Conor) #283
    • aa0123e: Rust doc core traits (#276) (Ben Bromhead) #276
    • 947d321: Allow dead code for is_empty (#284) (Conor) #284
    • b49d80a: split null transform into null and loopback (#286) (Lucas Kent) #286
    • 6235a07: Remove TransformsFromConfig trait (#278) (Lucas Kent) #278
    • 761c18a: Redis cluster ports rewrite (#275) (Conor) #275
    • 9b55876: rust 2021 (#288) (Lucas Kent) #288
    • d9c6da8: Remove needless clones (#287) (Lucas Kent) #287
    • 532db19: Remove unwraps from cluster ports rewrite & clippy fixes (#292) (Conor) #292
    • 51bbbfe: Update deps (#289) (Conor) #289
    • b61f5a4: Rename transforms (#293) (Lucas Kent) #293
    • 4cca9e3: add to all workflows (#299) (Conor) #299
    • 4640df5: Fix naming (#296) (Conor) #296
    • 42d903f: Rewrite transform docs (#297) (Lucas Kent) #297
    • 03b3f68: Update license info (#303) (Ben Bromhead) #303
    • c389daf: Make more high level (#290) (Ben Bromhead) #290
    • 2d72436: Validate topology.yaml (#263) (Conor) #263
    • bd25ffa: Add logo (#304) (Lucas Kent) #304
    • 1404183: Document and improve API of tee transform (#305) (Lucas Kent) #305
    • a540728: Remove forwarder transform (#307) (Lucas Kent) #307
    • 391caa2: Fix transform documentation yaml snippets (#308) (Lucas Kent) #308
    • 5bb5a23: Cassandra heap size (#309) (Conor) #309
    • 146ff73: Remove batch size hint (#311) (Conor) #311
    • 0ab802e: Add redis replication integration test (#310) (Lucas Kent) #310
    • 312f17f: Remove redis-cluster-pipeline (#312) (Conor) #312
    • d7aa0b3: more doc fixes (#313) (Lucas Kent) #313
    • 90b7d2e: Remove dependency on github secrets (#315) (Lucas Kent) #315
    • 7dc1b35: Update deps and add badge to readme (#314) (Lucas Kent) #314
    • 1d0ce72: test examples (#318) (Conor) #318
    • 3857c6e: Docs cleanup (#319) (Conor) #319
    • a9b8861: Release workflow (#317) (Conor) #317
    • 8e0b781: Refactor getting started docs (#320) (Lucas Kent) #320
    • ddd8458: Refactor TcpCodecListener (#322) (Conor) #322
    • 00c8a18: Clean up (#324) (Conor) #324
    • 03c53e3: Add source-types documentation page and improve config/ example (#321) (Lucas Kent) #321
    • ff1dfe8: Fix example links in readme (#327) (Joe Schmetzer) #327
    • c87d977: Remove Value::Timestamp (#325) (Lucas Kent) #325
    • 7a72628: Minor markdown / grammar fixes (#329) (Robert Treat) #329
    • 4935523: Cassandra cluster compose (#332) (Lucas Kent) #332
    • 6d77515: various fixes to improve CI (#334) (Lucas Kent) #334
    • 32ea744: rewrite CI fixing caching and failing on warnings (#333) (Lucas Kent) #333
    • b624a35: Fix transform source names (#336) (Conor) #336
    • 8dfcc81: Register metrics on startup (#328) (Conor) #328
    • e6c0456: Fix (#339) (Conor) #339
    • 06bc1c5: Bump version to v0.1.0 (#300) (Kuangda He) #300
    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.1.0.tar.gz(4.57 MB)
  • v0.0.23(Oct 5, 2021)

    What's Changed

    • INS-12991: Pre-cleanup by @XA21X in
    • Automatic benchmarking by @benbromhead in
    • Adding Apache Licence by @t-insta in
    • PR to try and fix test stall on github actions by @benbromhead in
    • update some docs by @benbromhead in
    • Clean up Transform method sig by @benbromhead in
    • Fix warnings by @rukai in
    • Tests relying on aws are ignored by @rukai in
    • Improve error logging by @rukai in
    • Replace Result::Err with panic in tests by @rukai in
    • Tests are marked as serial per test by @rukai in
    • create and use DockerCompose abstraction by @rukai in
    • Cleanup returns into implicitly returning expressions where appropriate by @rukai in
    • Refactor shotover-proxy crate into a crate within a workspace by @rukai in
    • Cleanup example config files by @rukai in
    • share setup code between tests and benchmarks by @rukai in
    • Cleanup shotover init by @rukai in
    • Cleanup unused and non deps by @rukai in
    • Run rustfmt on the codebase and enforce rustfmt via github actions by @rukai in
    • Misc cleanup around sources by @rukai in
    • Tests trigger shotover shutdown and then unwrap the result of the join handle by @rukai in
    • Remove TestContext and improve test connection handling by @rukai in
    • Documentation spelling/formatting fixes by @conorbros in
    • Update dependencies by @conorbros in
    • Add log level override via RUST_LOG environment variable by @XA21X in
    • Use task-local to pass chain name into transforms by @XA21X in
    • Refactor SlotMap for future support of replicas by @XA21X in
    • Fix detection of closed connections in cluster connection pools by @XA21X in
    • Improve slot map creation error handling by @rukai in
    • Update metrics and pktparse by @conorbros in
    • Added Cargo.lock and pinned clap version by @Claude-at-Instaclustr in
    • properly pin to latest release of clap by @rukai in
    • Runner changes: will use existing tokio::runtime or create one for itself and race condition fix by @conorbros in
    • Clippy fixes by @conorbros in
    • Remove lua support by @conorbros in
    • Remove unsafe usages by @conorbros in
    • Remove unused deps and update pktparse version by @rukai in
    • Implement TLS support for incoming redis connections by @rukai in
    • Readme improvements by @rukai in
    • Refactor for base authentication support by @XA21X in
    • Fix tracing setup in unittests by @rukai in
    • CI benchmarks compilation fixes by @rukai in
    • Clippy fixes by @conorbros in
    • Provide a useful error when docker-compose is not installed by @rukai in
    • Handle SIGTERM signal appropriately by @conorbros in
    • Remove redis serial key from unit tests by @rukai in
    • WIP: Test timing fixes by @Claude-at-Instaclustr in
    • INS-12991: Redis authentication support by @XA21X in
    • Improve bind failure handling by @rukai in
    • Cleanup TunableConsistencyScatter by @rukai in
    • add read timeout to test connections by @rukai in
    • Fix test_active_active_redis by removing unsupported pipeline test case by @rukai in
    • delete test_shotover_panics_in_single_thread_runtime by @rukai in
    • Remove and/or combine redundant redis integration test code by @rukai in
    • Fix redis auth test docker wait logic by @rukai in
    • run tests in both debug and release on CI by @rukai in
    • CLUSTER SLOTS rewrite by @conorbros in
    • Various refactors by @rukai in
    • Rename CodecDestination to CassandraCodecDestination by @conorbros in
    • Cleanup transform names by @rukai in
    • Implement outgoing redis TLS by @rukai in
    • Update dependencies by @conorbros in
    • Cluster rewrite docs by @conorbros in
    • Implement TLS for RedisCluster transform by @rukai in
    • Fix clippy lints by @rukai in
    • store redis credentials as Bytes instead of String by @rukai in
    • rewrite integration tests to use async by @rukai in
    • Update deps by @conorbros in
    • Clippy lints by @conorbros in
    • fix test_cluster_tls by @rukai in
    • Cleanup #derives by @rukai in
    • Cleanup redis int tests by @rukai in
    • Implement TLS benchmark by @rukai in
    • Fix silent failure in server encoder by @rukai in
    • fix shotover panicking when the trigger_shutdown_tx is dropped without first sending a shutdown message by @rukai in
    • Update redis-proto dependency to be closer to master by @rukai in

    New Contributors

    • @XA21X made their first contribution in
    • @t-insta made their first contribution in
    • @rukai made their first contribution in
    • @conorbros made their first contribution in
    • @Claude-at-Instaclustr made their first contribution in

    Full Changelog:

    Source code(tar.gz)
    Source code(zip)
  • v0.0.21(Feb 3, 2021)

  • v0.0.20(Feb 2, 2021)

    This release contains the following fixes and features:

    #83 - Fixes log level issue. #84 - Move to Tokio 1.0. #85 - Reworked Redis cluster implementation with full duplex TCP and automatic pipelining.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.19(Dec 22, 2020)

    This release contains the following fixes and features:

    #82 - Ability to enforce hard limits

    Introduces a new optional configuration variable for the redis and cassandra source, hard_connection_limit.

    By default it's set to false or set to false if not included in the configuration file. When set to false behavior is the same as previous versions of shotover (when the number of allowed connections are exceeded, shotover will only accept them once other connections drop, however the underlying tcp connection will just sit in the tcp accept pool).

    When set to true, shotover will stop listening on the cassandra or redis port when the connection limit has been exceeded. This will result in a E_CONNECTIONREFUSED error to the client. This is usefull when forcing misbehaving clients to not connect.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.18(Dec 20, 2020)

    This release contains the following fixes and features:

    #81 - Some minor changes to the way Redis timestamp tagging works, also includes dropping tcp connections that are idle for longer than 30seconds #80 - AST/Metadat processing is now opt-in. This results in a significantly faster shotover experience when using transforms that don't require enriched metadata. #79 - Better handling of Redis topology changes. We can now have shotover try and automatically retry requests, or error out to the client and let the client retry.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.17.1(Dec 6, 2020)

    This release contains the following fixes and features:

    #78 - Fixes the query type for some misclassified redis operations. Also introduces the QueryCounter transform which records metrics around query types being processed on a given chain.

    Note: tag contains a minor revision number due to a publishing goof up.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.16(Dec 4, 2020)

    This release contains the following fixes and features:


    • changes the way MPSC uses topics, it will now have its own chain and will create a new channel for each connection, rather than putting everything into the one channel
    • this means buffer sizes are per connection (less likely to fill up, if they do, only impacts one client)
    • example config will now block on pushing to the MPSC tee (this is configurable), with the timeout being enforced downstream
    • this (small) amount of back pressure results in way less messages being dropped, for a tradeoff in throughput, but way more reliable


    • The Redis codec could get in a weird situation where it wouldn't grab as many frames as it could, for a pipelined request. (the frame was being fetched in the next processing loop though).
    Source code(tar.gz)
    Source code(zip)
  • v0.0.15(Dec 1, 2020)

    This release contains the following fixes and features:

    #75 - Adds two new transforms, filter (for filtering out specific types of queries) and coalesce (for batching individual commands). This also introduces an automatic coalescing for MPSC based sources that don't need a response. This patch also now includes an example configuration for Redis DR topologies

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.15.tar.gz(4.99 MB)
    shotover-proxy-static_linux_amd64-0.0.15.tar.gz(5.18 MB)
  • v0.0.14(Nov 24, 2020)

    This release contains the following fixes and features:

    #72 - Fixes for the CI system to no longer use unsafe GitHub action commands #73 - A significant rework of the redis cluster transform that includes: concurrent pipeline execution across masters, internal MOVE/ASK logic, better inlining hints. #74 - Performance optimisations for MPSC Tee behavior, a TEE configured to use IGNORE behavior will now drop messages if the queue is full

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.14.tar.gz(4.97 MB)
    shotover-proxy-static_linux_amd64-0.0.14.tar.gz(5.16 MB)
  • v0.0.13(Nov 23, 2020)

  • v0.0.12(Nov 10, 2020)

  • v0.0.11(Nov 9, 2020)

  • v0.0.10(Nov 4, 2020)

  • v0.0.9(Oct 30, 2020)

  • v0.0.8(Oct 13, 2020)

  • v0.0.7(Sep 24, 2020)

  • v0.0.6(Sep 22, 2020)

    This release contains the following fixes and features:

    #50 - Support buffered communication between transforms if needed. #50 - Support sync/async responses across channels. #50 - Removed the internal message clock which was fragile and leaked implementation details across transforms. #50 - Transforms that ignore results from a connection are now responsible for draining the late/ignored response. See Tuneable Consistency Scatter for an example on how to do this. #51 - Improves on #50 by providing common messaging logic for chains. #52 - Some test improvements and resiliency - tests were starting to become kinda flaky. #52 - Fixed some bugs from #50 and #51 #54 - Connection limits for Redis and Cassandra sources are now configurable via a connection_limit flag. This is set to 512 by default. #54 - Shotover can now be built by rust stable. #54 - MPSC source can now return a response via oneshot channels.

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.6.tar.gz(5.06 MB)
    shotover-proxy-osx_amd64-0.0.6.tar.gz(4.57 MB)
    shotover-proxy-static_linux_amd64-0.0.6.tar.gz(5.21 MB)
  • v0.0.5(Sep 14, 2020)

    This release contains the following fixes and features:

    #47 - Pipelining support for Redis Clusters - You can now pipeline requests when using the RedisCluster transform. This supports pipeline rewriting to route requests in a pipeline to the correct master. #45 - Dynamoc logging control - You can now change log levels and log filters without needing to restart shotover. #44 and #41 - Internal refactor that cleaned up a bunch of stuff internally and allowed us to remove most Mutexs from most Transforms. #49 - Support for Redis 6 style auth with RedisCluster Transform.

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.5.tar.gz(5.02 MB)
    shotover-proxy-osx_amd64-0.0.5.tar.gz(4.53 MB)
    shotover-proxy-static_linux_amd64-0.0.5.tar.gz(5.17 MB)
  • v0.0.4(Aug 26, 2020)


    This release contains the following fixes and features:

    • #36 - Pipelining support for Redis - Supports arbitary pipeline sizes, with the ability to hint at the size of an expected pipeline for better performance.
    • #25 - Better logging control - You can now change the levels logged and its all pretty low impact.
    • #26 - Metrics - Shotover now provides a little more detail around end to end proxy performance and individual performance. Plus its all prometheus compatible.

    Breaking changes:

    Configuration has now been split into two files, config and topology. Topology defines how shotover routes requests. Config defines shotover internal behaviour.

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.4.tar.gz(4.46 MB)
    shotover-proxy-static_linux_amd64-0.0.4.tar.gz(4.75 MB)
  • v0.0.3(Aug 20, 2020)

  • v0.0.2(Aug 18, 2020)

    This release largely fixes performance issues the Redis-cluster transform. Previously redis-cluster was implemented using a blocking/synchonous cluster aware client. A port to using async for redis-rs was written and is now being used.

    Operations per second to a redis cluster should generally see a boost in throughput of between 15 - 50% and a significant reduction in p99 latency.

    Source code(tar.gz)
    Source code(zip)
    shotover-proxy-linux_amd64-0.0.2.tar.gz(3.71 MB)
  • v0.0.1(Aug 17, 2020)

Simple and fast layer 4 proxy in Rust

Fourth 这一波在第四层。 English Fourth是一个Rust实现的Layer 4代理,用于监听指定端口TCP流量,并根据规则转发到指定目标。 功能 监听指定端口代理到本地或远端指定端口 监听指定端口,通过TLS ClientHello消息中的SNI进行分流 安装方法 为了确保获得您架构

Rui Li 17 Nov 8, 2022
Proxy sentry request to a sentry server using a tunnel/proxy endpoint

Sentry Tunnel This is a proxy that forwards tunneled sentry requests to the real sentry server. The implementation is based on the explanation provide

Paul FLORENCE 11 Oct 15, 2022
UDP proxy with Proxy Protocol and mmproxy support

udppp UDP proxy with Proxy Protocol and mmproxy support. Features Async Support Proxy Protocol V2 SOCKET preserve client IP addresses in L7 proxies(mm

b23r0 9 Nov 22, 2022
Lightweight proxy that allows redirect HTTP(S) traffic through a proxy.

Proxyswarm Proxyswarm is a lightweight proxy that allows redirect HTTP(S) traffic through a proxy. WARNING: This app isn't recomended for download lar

Jorge Alejandro Jimenez Luna 4 Apr 16, 2022
Web3-proxy: a fast caching and load balancing proxy for web3 (Ethereum or similar) JsonRPC servers.

web3-proxy Web3-proxy is a fast caching and load balancing proxy for web3 (Ethereum or similar) JsonRPC servers. Signed transactions (eth_sendRawTrans

null 49 Nov 14, 2022
A TCP proxy using HTTP - Reach SSH behind a Nginx reverse proxy

?? TCP over HTTP ?? The Questions ?? What does it do? You can proxy TCP traffic over HTTP. A basic setup would be: [Your TCP target] <--TCP-- [Exit No

Julian 182 Nov 2, 2022
A tcp proxy server/client which exchange the data in temp files

ftcp A tcp proxy server/client which exchange the data in temp files 通过在临时文件中交换数据来进行TCP代理的一个服务端/客户端 学校内网中有针对教学楼的防火墙导致教室电脑难以上网( 但学校内建有公共ftp服务器,因此就有了这个借

Daile Liu 2 Feb 17, 2022
An End-to-End Privacy Computing Protocol on Layer 2

Eigen Network Eigen Network is an end-to-end privacy computation network for a better digital economy based on hybrid privacy computation protocols an

Eigen Lab 24 Oct 13, 2022
Layer 4 load balancer with dynamic configuration loading

Convey Layer 4 load balancer with dynamic configuration loading featuring proxy, passthrough and direct server return modes Features Stats page (at /s

Ben Parli 281 Nov 23, 2022
Final Project for "Computer Networking Security": A Layer-3 VPN implementation over TLS

Final Project for "Computer Networking Security": A Layer-3 VPN implementation over TLS

Siger Yang 2 Jun 7, 2022
Aggressively reliable delivery layer. Above UDP. Nothing else.

Aggressively reliable delivery layer. Above UDP. Nothing else.

IchHabeKeineNamen 2 Jun 5, 2022
Easy per application transparent proxy built on cgroup.

cproxy can redirect TCP and UDP traffic made by a program to a proxy, without requiring the program supporting a proxy. Compared to many existi

Xiangru Lian 256 Nov 15, 2022
server security proxy write by Rust

server-security-proxy server security proxy write by Rust how to use config toml file

baoyachi. Aka Rust Hairy crabs 3 May 24, 2021
A tcp over http2 + tls proxy

mtunnel A tcp over http2 + tls proxy. Usage 1. get certificates, by following steps. 2. make your config client config: { "local_addr": "

cssivision 9 Sep 5, 2022
A versatile and efficient proxy framework with nice features suitable for various use cases.

A versatile and efficient proxy framework with nice features suitable for various use cases.

null 1.6k Dec 1, 2022
Hudsucker is a MITM HTTP/S proxy written in Rust.

hudsucker Hudsucker is a MITM HTTP/S proxy written in Rust. Features Modify HTTP/S requests Modify HTTP/S responses Modify websocket messages Usage Fo

null 81 Nov 22, 2022
Drop-in proxy for Discord gateway connections and sessions allowing for zero downtime deploys

gateway-proxy This is a very hacky project, so it might stop working if Discord changes their API core. This is unlikely, but keep that in mind while

Jens Reidel 38 Nov 10, 2022
Minecraft proxy

mc-proxy This is a fully functional proxy for online and offline-mode Minecraft servers. It is based on an optimized, custom-made packet parser for Mi

null 21 Oct 7, 2022
A remote shell, TCP tunnel and HTTP proxy for Replit.

Autobahn A remote shell, TCP tunnel and HTTP proxy for Replit. Hybrid SSH/HTTP server for Replit. Based on leon332157/replish. Autobahn runs a WebSock

Patrick Winters 12 Sep 24, 2022