GizStack
View .mdOpen in ChatGPTOpen in Claude

gizlang:mesh

which servers of one service are alive, and which of them owns a key. A node listens on a TCP port and, every interval, exchanges its view with each node it knows (and each seed) in one short connection: it sends its own line and reads the live members of the other node. A member not heard of for holdMs is dead. Ownership is rendezvous hashing: each key goes to the live member with the highest hash of (member, key), so a join or a leave moves only the keys of that member. A mesh belongs to the thread that made it; threads of one process share one node, not one mesh each.

gizlang
import * as Mesh from "gizlang:mesh";

Types

Member

gizlang
type Member = { id: string; host: string; port: i64; meta: string; seen: i64; }

One node: its name, the address that other nodes connect to, and meta, a word without spaces that the node tells the others (for example the port of its service). seen is the time (Task.now) it was last heard of.

  • id: string
  • host: string
  • port: i64
  • meta: string
  • seen: i64

Mesh

gizlang
type Mesh

The live view of one node.

  • self: gizlang_mesh.Member
  • holdMs: i64

Functions

join

gizlang
function join(sys: System, id: string, host: string, port: i64, meta: string, seeds: Vec<string>, intervalMs: i64, holdMs: i64): Mesh throws IoError

Join the mesh as id, listening on host:port (0 picks a port; the Mesh says which). seeds are "host:port" of nodes to find the others through. The view refreshes every intervalMs; a node silent for holdMs is dead (holdMs should be a few intervals).

Effects: fail, read, write, io.

Methods

Mesh.alive

gizlang
function Mesh.alive(self: Mesh): Vec<Member>

The live members, this node first.

Effects: fail, read, io.

Mesh.owner

gizlang
function Mesh.owner(self: Mesh, key: string): Member

The member that owns key (rendezvous hashing over the live members).

Effects: fail, read, io.

Mesh.leave

gizlang
function Mesh.leave(self: Mesh, sys: System): void

Leave: stop answering and probing, and tell each member at once, so the others drop this node now and not after their holdMs. Stop taking new requests first (close the listener of the service); this does not touch the requests it is answering.

Effects: fail, read, io.