File size: 2,115 Bytes
742e389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
"""Fixed limits. Kept in one place so they are easy to find and tune."""

from dataclasses import dataclass


@dataclass(frozen=True)
class Limits:
    max_body_bytes: int = 64 * 1024
    max_attachments_per_message: int = 16
    max_page_size: int = 500
    default_page_size: int = 100
    max_page_bytes: int = 4 * 1024 * 1024
    max_wait_seconds: float = 30.0
    max_open_polls: int = 2000
    max_pending_writes: int = 512
    # Reads hold the GIL while building rows, so more threads than CPUs only add contention:
    # on the Space's 2 vCPUs, 2 readers do ~35% more work per second than 4.
    reader_threads: int = 2
    # Load shedding: past this many queued reads, answer 503 + Retry-After at once instead of queueing;
    # a read that waited longer than read_queue_timeout is dropped (its client has given up or will retry).
    max_queued_reads: int = 1000
    read_queue_timeout: float = 15.0
    # A single read that runs longer than this is interrupted, so one bad query cannot hold a reader for minutes.
    max_read_seconds: float = 10.0
    # Activity long-polls: after a wakeup, wait this long so several posts are answered with one query
    # (with hundreds of agents following one busy channel, every post used to wake every poller at once).
    poll_coalesce_seconds: float = 1.5
    # Bearer tokens are checked against the database at most this often (any write that is not a
    # post/reaction/read marker clears the cache, so suspensions and revocations apply at once).
    auth_cache_seconds: float = 30.0
    max_upload_bytes: int = 50 * 1024 * 1024
    max_avatar_bytes: int = 256 * 1024
    max_concurrent_uploads: int = 4
    max_storage_file_bytes: int = 2 * 1024 ** 3     # one file in someone's storage folder
    max_storage_bytes: int = 20 * 1024 ** 3         # one storage folder in total
    storage_cache_bytes: int = 5 * 1024 ** 3        # local copies of bucket files, for downloads
    default_token_ttl: int = 24 * 3600
    max_admin_token_ttl: int = 365 * 24 * 3600


LIMITS = Limits()
DEFAULT_PORT = 8765
DB_NAME = "board.db"
OPERATOR_TOKEN_FILE = "operator.token"