Handling resource exhaustion

Memory exhaustion

(See also dos-spec.md.)

If RAM becomes low, an OR should begin destroying circuits until more memory is free again. We recommend the following algorithm:

  • Set a threshold amount of RAM to recover at 10% of the total RAM.
- Sort the circuits by their 'staleness', defined as the age of the oldest data queued on the circuit. This data can be: * Bytes that are waiting to flush to or from a stream on that circuit. * Bytes that are waiting to flush from a connection created with BEGIN_DIR. * Cells that are waiting to flush or be processed. - While we have not yet recovered enough RAM: * Free all memory held by the most stale circuit, and send DESTROY cells in both directions on that circuit. Count the amount of memory we recovered towards the total.