Skip to content

Commit aeaa1ae

Browse files
authored
Prevent infinite loop in get_splits (#983)
1 parent 19273a7 commit aeaa1ae

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

strax/chunk.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ def receive(self, chunk) -> list:
606606
split_indices = self.get_splits(chunk.data, target_size_b, DEFAULT_CHUNK_SPLIT_NS)
607607
# Split the cache into chunks and return list of chunks
608608
chunks = []
609-
for index in split_indices:
609+
for index in np.diff(split_indices):
610610
_chunk, chunk = chunk.split(
611611
t=chunk.data["time"][index] - int(DEFAULT_CHUNK_SPLIT_NS // 2),
612612
allow_early_split=False,
@@ -628,12 +628,19 @@ def flush(self) -> list:
628628
def get_splits(data, target_size, min_gap=DEFAULT_CHUNK_SPLIT_NS):
629629
"""Get indices where to split the data into chunks of approximately target_size."""
630630
assumed_i = int(target_size // data.itemsize)
631+
if assumed_i == 0:
632+
raise ValueError("Target size is too small.")
631633
gap_indices = np.argwhere(strax.diff(data) > min_gap).flatten() + 1
632634
split_indices = [0]
635+
argmin = 0
633636
if len(gap_indices) != 0:
637+
n = 0
634638
while split_indices[-1] + assumed_i < gap_indices[-1]:
635-
split_indices.append(
636-
gap_indices[np.abs(gap_indices - assumed_i - split_indices[-1]).argmin()]
637-
)
638-
split_indices = np.diff(split_indices)
639+
if n > len(data):
640+
raise ValueError("Trapped in infinite loop!")
641+
_argmin = np.abs(gap_indices[argmin + 1 :] - assumed_i - split_indices[-1]).argmin()
642+
split_indices.append(gap_indices[argmin + 1 :][_argmin])
643+
argmin += _argmin + 1
644+
n += 1
645+
split_indices = np.array(split_indices)
639646
return split_indices

strax/storage/common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ def _read_format_split_chunk(
602602
split_indices = strax.Rechunker.get_splits(
603603
chunk.data, source_size_mb * 1e6, strax.DEFAULT_CHUNK_SPLIT_NS
604604
)
605-
for index in split_indices:
605+
for index in np.diff(split_indices):
606606
_chunk, chunk = chunk.split(
607607
t=chunk.data["time"][index] - int(strax.DEFAULT_CHUNK_SPLIT_NS // 2),
608608
allow_early_split=False,

0 commit comments

Comments
 (0)