Use `md5` hashed shm keys for macOS compat

Shorten SHM buffer key names to fit Darwin's 31
char filename limit by hashing the `fqme`/content
portion with `md5` and truncating to 8 hex chars.

Deats,
- `.fsp._api`: replace `piker.{actor}[{uuid}].{sym}`
  format with `{uuid[:8]}_{hash}.fsp`
- `.tsp._history`: add `platform.system()` check to
  conditionally shorten `.hist`/`.rt` keys on Darwin
  while keeping the full key format on Linux

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code

NOTE that this patch was orig by @dnks and broken out from a larger
commit which added unnecessary/out-of-scope changes we didn't end up
requiring.
macos_support
Gud Boi 2026-03-11 10:42:18 -04:00
parent 8b3365a249
commit 52e65dbe0d
2 changed files with 17 additions and 5 deletions

View File

@ -200,9 +200,13 @@ def maybe_mk_fsp_shm(
) )
# (attempt to) uniquely key the fsp shm buffers # (attempt to) uniquely key the fsp shm buffers
# Use hash for macOS compatibility (31 char limit)
import hashlib
actor_name, uuid = tractor.current_actor().uid actor_name, uuid = tractor.current_actor().uid
uuid_snip: str = uuid[:16] # Create short hash of sym and target name
key: str = f'piker.{actor_name}[{uuid_snip}].{sym}.{target.name}' content = f'{sym}.{target.name}'
content_hash = hashlib.md5(content.encode()).hexdigest()[:8]
key: str = f'{uuid[:8]}_{content_hash}.fsp'
shm, opened = maybe_open_shm_array( shm, opened = maybe_open_shm_array(
key, key,

View File

@ -32,6 +32,7 @@ from __future__ import annotations
from datetime import datetime from datetime import datetime
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
import platform
from pprint import pformat from pprint import pformat
from types import ModuleType from types import ModuleType
from typing import ( from typing import (
@ -1380,13 +1381,20 @@ async def manage_history(
service: str = name.rstrip(f'.{mod.name}') service: str = name.rstrip(f'.{mod.name}')
fqme: str = mkt.get_fqme(delim_char='') fqme: str = mkt.get_fqme(delim_char='')
key: str = f'piker.{service}[{uuid[:16]}].{fqme}'
# use a short hash of the `fqme` to deal with macOS
# file-name-len limit..
if platform.system() == 'Darwin':
import hashlib
fqme_hash: str = hashlib.md5(fqme.encode()).hexdigest()[:8]
key: str = f'{uuid[:8]}_{fqme_hash}'
# (maybe) allocate shm array for this broker/symbol which will # (maybe) allocate shm array for this broker/symbol which will
# be used for fast near-term history capture and processing. # be used for fast near-term history capture and processing.
hist_shm, opened = maybe_open_shm_array( hist_shm, opened = maybe_open_shm_array(
size=_default_hist_size, size=_default_hist_size,
append_start_index=_hist_buffer_start, append_start_index=_hist_buffer_start,
key=f'{key}.hist',
key=f'piker.{service}[{uuid[:16]}].{fqme}.hist',
# use any broker defined ohlc dtype: # use any broker defined ohlc dtype:
dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields), dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields),
@ -1405,7 +1413,7 @@ async def manage_history(
rt_shm, opened = maybe_open_shm_array( rt_shm, opened = maybe_open_shm_array(
size=_default_rt_size, size=_default_rt_size,
append_start_index=_rt_buffer_start, append_start_index=_rt_buffer_start,
key=f'piker.{service}[{uuid[:16]}].{fqme}.rt', key=f'{key}.rt',
# use any broker defined ohlc dtype: # use any broker defined ohlc dtype:
dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields), dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields),