# Stream workers first, they are special. The documentation says:
# "each stream can only have a single writer"

# Account-data
upstream account_data {
    server unix:/run/matrix-synapse/inbound_accountdata.sock max_fails=0;
    keepalive 10;
}

# Userdir
upstream userdir {
    server unix:/run/matrix-synapse/inbound_userdir.sock max_fails=0;
    keepalive 10;
}

# Typing
upstream typing {
    server unix:/run/matrix-synapse/inbound_typing.sock max_fails=0;
    keepalive 10;
}

# To device
upstream todevice {
    server unix:/run/matrix-synapse/inbound_todevice.sock max_fails=0;
    keepalive 10;
}

# Receipts
upstream receipts {
    server unix:/run/matrix-synapse/inbound_receipts.sock max_fails=0;
    keepalive 10;
}

# Presence
upstream presence {
    server unix:/run/matrix-synapse/inbound_presence.sock max_fails=0;
    keepalive 10;
}

# Push rules
upstream push_rules {
    server unix:/run/matrix-synapse/inbound_push_rules.sock max_fails=0;
    keepalive 10;
}

# End of the stream workers, the following workers are of a "normal" type

# Media
# If more than one media worker is used, they *must* all run on the same machine
upstream media {
    server unix:/run/matrix-synapse/inbound_mediaworker.sock max_fails=0;
    keepalive 10;
}

# Synchronisation by clients:

# Normal sync. Not particularly heavy, but happens a lot
upstream normal_sync {
    # Use the username mapper result for hash key
    hash $mxid_localpart consistent;
    server unix:/run/matrix-synapse/inbound_normal_sync1.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_normal_sync2.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_normal_sync3.sock max_fails=0;
    keepalive 10;
}
# Initial sync
# Much heavier than a normal sync, but happens less often
upstream initial_sync {
    # Use the username mapper result for hash key
    hash $mxid_localpart consistent;
    server unix:/run/matrix-synapse/inbound_initial_sync1.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_initial_sync2.sock max_fails=0;
    keepalive 10;
}

# Login
upstream login {
    server unix:/run/matrix-synapse/inbound_login.sock max_fails=0;
    keepalive 10;
}

# Clients
upstream client {
    hash $mxid_localpart consistent;
    server unix:/run/matrix-synapse/inbound_clientworker1.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_clientworker2.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_clientworker3.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_clientworker4.sock max_fails=0;
    keepalive 10;
}

# Federation
# "Normal" federation, balanced round-robin over 4 workers.
upstream incoming_federation {
    server unix:/run/matrix-synapse/inbound_federation_reader1.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader2.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader3.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader4.sock max_fails=0;
    keepalive 10;
}
# Inbound federation requests, need to be balanced by IP-address, but can go
# to the same pool of workers as the other federation stuff.
upstream federation_requests {
    hash $remote_addr consistent;
    server unix:/run/matrix-synapse/inbound_federation_reader1.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader2.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader3.sock max_fails=0;
    server unix:/run/matrix-synapse/inbound_federation_reader4.sock max_fails=0;
    keepalive 10;
}

# Main thread for all the rest
upstream inbound_main {
  server unix:/run/matrix-synapse/inbound_main.sock max_fails=0;
  keepalive 10;
}
