With 4 engines:
In [1]: from distarray.dist import Context, Distribution
In [2]: context = Context()
In [3]: distribution = Distribution.from_shape(context, (9, 8), dist=('b', 'n'))
In [4]: distribution.localshapes()
Out[4]: [(3, 8), (3, 8), (3, 8), (0, 8)]
This appears to be from this line.
The size of this axis of the grid_shape is set to comm_size, which doesn't divide into the size of the corresponding axis of the DistArray.