cocoindex-io/cocoindex · error · RuntimeError

Iggy topic {self._stream}/{self._topic} does not exist.

Error message

Iggy topic {self._stream}/{self._topic} does not exist.

What it means

During readiness resolution the Iggy source fetches the topic to read its initial high-watermark. If the server reports the stream/topic does not exist (get_topic returns None), a RuntimeError is raised because offsets cannot be resolved for a nonexistent topic.

Source

Thrown at python/cocoindex/connectors/iggy/_source.py:296

        self._polling_retry_interval = polling_retry_interval
        self._init_retries = init_retries
        self._init_retry_interval = init_retry_interval
        self._allow_replay = allow_replay
        self._initial_high_watermark = initial_high_watermark
        self._watch_guard = SingleWatcherGuard("Iggy TopicStream")

    def payloads(self) -> LiveStream[bytes]:
        """View of this stream yielding each message payload as bytes."""
        return _TopicPayloadsStream(self)

    async def _resolve_initial_high_watermark(self) -> int:
        """Resolve the initial next-offset watermark for readiness."""
        if self._initial_high_watermark is not None:
            return self._initial_high_watermark

        topic = await self._client.get_topic(self._stream, self._topic)
        if topic is None:
            raise RuntimeError(
                f"Iggy topic {self._stream}/{self._topic} does not exist."
            )
        if topic.partitions_count != 1:
            raise RuntimeError(
                "The Python Iggy SDK does not expose per-partition high watermarks. "
                "Pass initial_high_watermark for multi-partition topics, or consume "
                "a single-partition topic."
            )
        return int(topic.messages_count)

    async def _create_consumer(self) -> IggyConsumer:
        """Create an Iggy consumer group configured for manual offset storage."""
        return await self._client.consumer_group(
            name=self._consumer_group,
            stream=self._stream,
            topic=self._topic,
            partition_id=self._partition_id,
            polling_strategy=PollingStrategy.Next(),

View on GitHub (pinned to e84aa99b32)

Solutions

  1. Create the Iggy stream/topic (or fix the configured names) before starting the source
  2. Verify stream and topic names against `iggy` CLI listing
  3. Point the connector at the correct Iggy server/environment where the topic exists

Example fix

// before
src = iggy.IggySource(client, stream="my_strem", topic="events")
// after
src = iggy.IggySource(client, stream="my_stream", topic="events")  # topic must exist server-side
Defensive patterns

Strategy: validation

Validate before calling

topic = await client.get_topic(stream_name, topic_name)
if topic is None:
    raise RuntimeError(f"Create topic {stream_name}/{topic_name} before consuming")

Try / catch

try:
    await source.start()
except RuntimeError as e:
    if "does not exist" in str(e):
        await ensure_topic_exists(client, stream_name, topic_name)

Prevention

When it happens

Trigger: Starting _watch/consumption against an Iggy stream/topic name that was never created (or was deleted), before _resolve_initial_high_watermark can read messages_count.

Common situations: Typos in stream/topic names in configuration; pointing at an environment where the topic was not provisioned; a topic deleted between runs.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of cocoindex-io/cocoindex@e84aa99b32 (2026-09-08). Data as JSON: /api/errors/a91cc15f7be64bdb. Report an issue: GitHub.