# Buggy code
def watch_workers(self):
    from kubernetes import client, config

    cls = type(self)
    worker_set = set()
    workers_from_resource = set()

    if os.environ.get("KUBE_API_ADDRESS"):  # pragma: no cover
        k8s_config = client.Configuration()
        k8s_config.host = os.environ["KUBE_API_ADDRESS"]
    else:
        k8s_config = config.load_incluster_config()

    watcher = self.watcher_cls(k8s_config, os.environ["MARS_K8S_POD_NAMESPACE"])

    for workers in watcher.watch_workers():  # pragma: no branch
        if not cls._watcher_running:  # pragma: no cover
            break

        if self._resource_ref is None:
            self.set_schedulers(self._cluster_info_ref.get_schedulers())
            self._resource_ref = self.get_actor_ref(ResourceActor.default_uid())
        if self._resource_ref is not None:  # pragma: no branch
            workers_from_resource = set(self._resource_ref.get_worker_endpoints())

        removed = (worker_set - set(workers)) or (
            worker_set - set(workers_from_resource)
        )
        if removed:
            logger.debug("Remove of workers %r detected by kubernetes.", removed)
            if self._resource_ref:  # pragma: no branch
                self._resource_ref.detach_dead_workers(
                    list(removed), _tell=True, _wait=False
                )
        worker_set = set(workers)


# Traceback (ValueError)
Traceback (most recent call last):
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 365, in _wrapped
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/scheduler/graph.py", line 382, in execute_graph
self._execute_graph(compose=compose)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/scheduler/graph.py", line 410, in _execute_graph
self.prepare_graph(compose=compose)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 365, in _wrapped
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 439, in _inner
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/scheduler/graph.py", line 648, in prepare_graph
self._target_tileable_datas + fetch_tileables, tileable_graph)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 439, in _inner
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 348, in build
tileables, tileable_graph=tileable_graph)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 439, in _inner
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 262, in build
self._on_tile_failure(tileable_data.op, exc_info)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 301, in inner
raise exc_info[1].with_traceback(exc_info[2]) from None
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 242, in build
tiled = self._tile(tileable_data, tileable_graph)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 337, in _tile
return super()._tile(tileable_data, tileable_graph)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 203, in _tile
tds = on_tile(tileable_data.op.outputs, tds)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/scheduler/graph.py", line 630, in on_tile
return self.context.wraps(handler.dispatch)(first.op)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/context.py", line 72, in h
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/utils.py", line 439, in _inner
return func(*args, **kwargs)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tiles.py", line 119, in dispatch
tiled = op_cls.tile(op)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/dataframe/merge/concat.py", line 182, in tile
return cls._tile_dataframe(op)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/dataframe/merge/concat.py", line 94, in _tile_dataframe
inputs = [item.rechunk(normalized_nsplits)._inplace_tile() for item in inputs]
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/dataframe/merge/concat.py", line 94, in <listcomp>
inputs = [item.rechunk(normalized_nsplits)._inplace_tile() for item in inputs]
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/dataframe/base/rechunk.py", line 96, in rechunk
chunk_size = get_nsplits(a, chunk_size, itemsize)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tensor/rechunk/core.py", line 38, in get_nsplits
return decide_chunk_sizes(tileable.shape, chunk_size, itemsize)
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tensor/utils.py", line 551, in decide_chunk_sizes
return normalize_chunk_sizes(shape, tuple(chunk_size[j] for j in range(len(shape))))
File "/home/admin/work/tip_dev-pymars-0.6.0a3.zip/mars/tensor/utils.py", line 66, in normalize_chunk_sizes
raise ValueError('chunks shape should be of the same length, '
ValueError: chunks shape should be of the same length, got shape: 100000, chunks: (nan, nan, nan, nan, nan, nan)

# Fixed code
def watch_workers(self):
    from kubernetes import client, config

    cls = type(self)

    if os.environ.get("KUBE_API_ADDRESS"):  # pragma: no cover
        k8s_config = client.Configuration()
        k8s_config.host = os.environ["KUBE_API_ADDRESS"]
    else:
        k8s_config = config.load_incluster_config()

    watcher = self.watcher_cls(k8s_config, os.environ["MARS_K8S_POD_NAMESPACE"])

    for workers in watcher.watch_workers():  # pragma: no branch
        if not cls._watcher_running:  # pragma: no cover
            break

        if self._resource_ref is None:
            self.set_schedulers(self._cluster_info_ref.get_schedulers())
            self._resource_ref = self.get_actor_ref(ResourceActor.default_uid())

        if self._resource_ref:  # pragma: no branch
            self._resource_ref.mark_workers_alive(workers)