Skip to content

contextlake 8.10.1

Choose a tag to compare

@github-actions github-actions released this 31 Aug 08:25
· 38 commits to main since this release

Fixed

  • kb index --workspace no longer breaks its worker pool. The cause was
    RepoTooLarge, the exception 8.10.0 added for the memory budget: it could not be
    unpickled. A worker that refuses a repository sends the exception back to the parent,
    and Python rebuilds an exception as cls(*args), where args held only the formatted
    message this class passes to Exception.__init__. The rebuild was three arguments
    short and raised TypeError inside ProcessPoolExecutor's manager thread, which has
    no future to attribute a failure to, so it broke the whole executor: every healthy
    worker was sent SIGTERM and every pending repository failed with A process in the process pool was terminated abruptly. One refused repository ended a 656-repository
    run in about a minute.

    pickle.dumps succeeded on the exception throughout. Only the parent's unpickle
    failed, which is why nothing caught it. The same 17-repository cluster that broke the
    pool twice now completes at --workers 4 with 0 failures, the over-budget repository
    reported as a skip, and all four workers exiting 0.

  • Five more exceptions had the same defect and are fixed with it.
    GrammarNotInstalled is raised on the same indexing path and would break a pool the
    same way when an optional grammar is absent. McpToolError, CircuitOpenError,
    StoreBusy and RunBusy are off that path today. Every exception in the package that
    defines its own __init__ now defines __reduce__, and a test walks the package to
    assert each one survives a round trip, so the next one cannot ship without a sample.

  • A broken worker pool now falls back to serial indexing. That fallback was written
    for this failure and was unreachable: BrokenProcessPool subclasses RuntimeError, so
    the per-repository except Exception caught it, counted one failure against whichever
    repository raised it, and continued, and the handler that re-runs the work-list serially
    never ran once. The failure counters are reset before the serial pass, so a repository
    that genuinely failed before the break is not counted again by it.

  • The reason a pool broke is now reported. str(BrokenProcessPool) is a fixed
    sentence naming no cause, and the real reason is attached as __cause__, which was
    discarded. Reporting only the fixed sentence is why three candidate causes stayed
    unseparated across several investigations.