0

world: retry chunk read on OSError too

Closes #1790.

If a chunk fails reading due to an underlying operating system
IO error, we can invoke the retry logic too. No clue what could
cause this to happen beyond hardware faults.

Also lower the sleep time to 0.25s down from 0.5s because half a
second of sleeping for each chunk this happens on seems incredibly
overkill.

Making the nbt code raise a CorruptChunkError in this case also means
that failing to read a chunk due to an IOError is not a fatal error
anymore, it'll simply skip it and move on.
This commit is contained in:
Nicolas F
2020-06-25 15:30:54 +02:00
parent c53268e8fe
commit 1355f8c49e
2 changed files with 8 additions and 6 deletions

View File

@@ -292,7 +292,10 @@ class MCRFileReader(object):
self._file.seek(offset) self._file.seek(offset)
# read in the chunk data header # read in the chunk data header
try:
header = self._file.read(5) header = self._file.read(5)
except OSError as e:
raise CorruptChunkError("An OSError occurred: {}".format(e.strerror))
if len(header) != 5: if len(header) != 5:
raise CorruptChunkError("chunk header is invalid") raise CorruptChunkError("chunk header is invalid")
data_length, compression = self._chunk_header_format.unpack(header) data_length, compression = self._chunk_header_format.unpack(header)

View File

@@ -1355,12 +1355,11 @@ class RegionSet(object):
except nbt.CorruptionError as e: except nbt.CorruptionError as e:
tries -= 1 tries -= 1
if tries > 0: if tries > 0:
# Flush the region cache to possibly read a new region file # Flush the region cache to possibly read a new region file header
# header logging.debug("Encountered a corrupt chunk or read error at %s,%s. "
logging.debug("Encountered a corrupt chunk at %s,%s. Flushing cache and retrying", x, z) "Flushing cache and retrying", x, z)
#logging.debug("Error was:", exc_info=1)
del self.regioncache[regionfile] del self.regioncache[regionfile]
time.sleep(0.5) time.sleep(0.25)
continue continue
else: else:
logging.warning("The following was encountered while reading from %s:", self.regiondir) logging.warning("The following was encountered while reading from %s:", self.regiondir)