mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 09:02:15 -06:00
fix fuse cache bugs
This commit is contained in:
parent
0ea7881652
commit
14899d3a7c
|
@ -296,8 +296,8 @@ class CPPF(Operations):
|
||||||
for n, cn in enumerate(self.filecache):
|
for n, cn in enumerate(self.filecache):
|
||||||
cache_path, cache1 = cn.tag
|
cache_path, cache1 = cn.tag
|
||||||
cache2 = cache1 + len(cn.data)
|
cache2 = cache1 + len(cn.data)
|
||||||
msg += "\n#{} = {} {} {}\n{}\n".format(
|
msg += "\n#{} |{}| {}:{} {}".format(
|
||||||
n, cache1, len(cn.data), cache2, cache_path
|
n, len(cn.data), cache1, cache2, cache_path
|
||||||
)
|
)
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
@ -353,7 +353,10 @@ class CPPF(Operations):
|
||||||
cdr = None
|
cdr = None
|
||||||
ncn = -1
|
ncn = -1
|
||||||
with self.filecache_mtx:
|
with self.filecache_mtx:
|
||||||
dbg("cache request from {} to {}, size {}".format(get1, get2, file_sz))
|
dbg(
|
||||||
|
"cache request {}:{} |{}|".format(get1, get2, file_sz)
|
||||||
|
+ self._describe()
|
||||||
|
)
|
||||||
for cn in self.filecache:
|
for cn in self.filecache:
|
||||||
ncn += 1
|
ncn += 1
|
||||||
|
|
||||||
|
@ -373,7 +376,7 @@ class CPPF(Operations):
|
||||||
buf_ofs = get1 - cache1
|
buf_ofs = get1 - cache1
|
||||||
buf_end = buf_ofs + (get2 - get1)
|
buf_end = buf_ofs + (get2 - get1)
|
||||||
dbg(
|
dbg(
|
||||||
"found all ({}, {} to {}, len {}) [{}:{}] = {}".format(
|
"found all (#{} {}:{} |{}|) [{}:{}] = {}".format(
|
||||||
ncn,
|
ncn,
|
||||||
cache1,
|
cache1,
|
||||||
cache2,
|
cache2,
|
||||||
|
@ -385,11 +388,11 @@ class CPPF(Operations):
|
||||||
)
|
)
|
||||||
return cn.data[buf_ofs:buf_end]
|
return cn.data[buf_ofs:buf_end]
|
||||||
|
|
||||||
if get2 < cache2:
|
if get2 <= cache2:
|
||||||
x = cn.data[: get2 - cache1]
|
x = cn.data[: get2 - cache1]
|
||||||
if not cdr or len(cdr) < len(x):
|
if not cdr or len(cdr) < len(x):
|
||||||
dbg(
|
dbg(
|
||||||
"found car ({}, {} to {}, len {}) [:{}-{}] = [:{}] = {}".format(
|
"found cdr (#{} {}:{} |{}|) [:{}-{}] = [:{}] = {}".format(
|
||||||
ncn,
|
ncn,
|
||||||
cache1,
|
cache1,
|
||||||
cache2,
|
cache2,
|
||||||
|
@ -404,11 +407,11 @@ class CPPF(Operations):
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if get1 > cache1:
|
if get1 >= cache1:
|
||||||
x = cn.data[-(cache2 - get1) :]
|
x = cn.data[-(max(0, cache2 - get1)) :]
|
||||||
if not car or len(car) < len(x):
|
if not car or len(car) < len(x):
|
||||||
dbg(
|
dbg(
|
||||||
"found cdr ({}, {} to {}, len {}) [-({}-{}):] = [-{}:] = {}".format(
|
"found car (#{} {}:{} |{}|) [-({}-{}):] = [-{}:] = {}".format(
|
||||||
ncn,
|
ncn,
|
||||||
cache1,
|
cache1,
|
||||||
cache2,
|
cache2,
|
||||||
|
@ -436,18 +439,11 @@ class CPPF(Operations):
|
||||||
msg += self._describe()
|
msg += self._describe()
|
||||||
raise Exception(msg)
|
raise Exception(msg)
|
||||||
|
|
||||||
if car and cdr:
|
if car and cdr and len(car) + len(cdr) == get2 - get1:
|
||||||
dbg("<cache> have both")
|
dbg("<cache> have both")
|
||||||
|
return car + cdr
|
||||||
|
|
||||||
ret = car + cdr
|
elif cdr and (not car or len(car) < len(cdr)):
|
||||||
if len(ret) == get2 - get1:
|
|
||||||
return ret
|
|
||||||
|
|
||||||
msg = "{} + {} != {} - {}".format(len(car), len(cdr), get2, get1)
|
|
||||||
msg += self._describe()
|
|
||||||
raise Exception(msg)
|
|
||||||
|
|
||||||
elif cdr:
|
|
||||||
h_end = get1 + (get2 - get1) - len(cdr)
|
h_end = get1 + (get2 - get1) - len(cdr)
|
||||||
h_ofs = h_end - 512 * 1024
|
h_ofs = h_end - 512 * 1024
|
||||||
|
|
||||||
|
@ -457,7 +453,7 @@ class CPPF(Operations):
|
||||||
buf_ofs = (get2 - get1) - len(cdr)
|
buf_ofs = (get2 - get1) - len(cdr)
|
||||||
|
|
||||||
dbg(
|
dbg(
|
||||||
"<cache> cdr {}, car {}-{}={} [-{}:]".format(
|
"<cache> cdr {}, car {}:{} |{}| [-{}:]".format(
|
||||||
len(cdr), h_ofs, h_end, h_end - h_ofs, buf_ofs
|
len(cdr), h_ofs, h_end, h_end - h_ofs, buf_ofs
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -475,7 +471,7 @@ class CPPF(Operations):
|
||||||
buf_ofs = (get2 - get1) - len(car)
|
buf_ofs = (get2 - get1) - len(car)
|
||||||
|
|
||||||
dbg(
|
dbg(
|
||||||
"<cache> car {}, cdr {}-{}={} [:{}]".format(
|
"<cache> car {}, cdr {}:{} |{}| [:{}]".format(
|
||||||
len(car), h_ofs, h_end, h_end - h_ofs, buf_ofs
|
len(car), h_ofs, h_end, h_end - h_ofs, buf_ofs
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -497,7 +493,7 @@ class CPPF(Operations):
|
||||||
buf_end = buf_ofs + get2 - get1
|
buf_end = buf_ofs + get2 - get1
|
||||||
|
|
||||||
dbg(
|
dbg(
|
||||||
"<cache> {}-{}={} [{}:{}]".format(
|
"<cache> {}:{} |{}| [{}:{}]".format(
|
||||||
h_ofs, h_end, h_end - h_ofs, buf_ofs, buf_end
|
h_ofs, h_end, h_end - h_ofs, buf_ofs, buf_end
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -536,12 +532,11 @@ class CPPF(Operations):
|
||||||
path = path.strip("/")
|
path = path.strip("/")
|
||||||
|
|
||||||
ofs2 = offset + length
|
ofs2 = offset + length
|
||||||
log("read {} @ {} len {} end {}".format(path, offset, length, ofs2))
|
|
||||||
|
|
||||||
file_sz = self.getattr(path)["st_size"]
|
file_sz = self.getattr(path)["st_size"]
|
||||||
|
log("read {} |{}| {}:{} max {}".format(path, length, offset, ofs2, file_sz))
|
||||||
if ofs2 > file_sz:
|
if ofs2 > file_sz:
|
||||||
ofs2 = file_sz
|
ofs2 = file_sz
|
||||||
log("truncate to len {} end {}".format(ofs2 - offset, ofs2))
|
log("truncate to |{}| :{}".format(ofs2 - offset, ofs2))
|
||||||
|
|
||||||
if file_sz == 0 or offset >= ofs2:
|
if file_sz == 0 or offset >= ofs2:
|
||||||
return b""
|
return b""
|
||||||
|
|
|
@ -135,9 +135,9 @@ class AuthSrv(object):
|
||||||
self.warn_anonwrite = True
|
self.warn_anonwrite = True
|
||||||
|
|
||||||
if WINDOWS:
|
if WINDOWS:
|
||||||
self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):(.*)")
|
self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):([^:]*)$")
|
||||||
else:
|
else:
|
||||||
self.re_vol = re.compile(r"^([^:]*):([^:]*):(.*)")
|
self.re_vol = re.compile(r"^([^:]*):([^:]*):([^:]*)$")
|
||||||
|
|
||||||
self.mutex = threading.Lock()
|
self.mutex = threading.Lock()
|
||||||
self.reload()
|
self.reload()
|
||||||
|
@ -220,11 +220,13 @@ class AuthSrv(object):
|
||||||
if self.args.v:
|
if self.args.v:
|
||||||
# list of src:dst:permset:permset:...
|
# list of src:dst:permset:permset:...
|
||||||
# permset is [rwa]username
|
# permset is [rwa]username
|
||||||
for vol_match in [self.re_vol.match(x) for x in self.args.v]:
|
for v_str in self.args.v:
|
||||||
try:
|
m = self.re_vol.match(v_str)
|
||||||
src, dst, perms = vol_match.groups()
|
if not m:
|
||||||
except:
|
raise Exception("invalid -v argument: [{}]".format(v_str))
|
||||||
raise Exception("invalid -v argument")
|
|
||||||
|
src, dst, perms = m.groups()
|
||||||
|
print("\n".join([src, dst, perms]))
|
||||||
|
|
||||||
src = fsdec(os.path.abspath(fsenc(src)))
|
src = fsdec(os.path.abspath(fsenc(src)))
|
||||||
dst = dst.strip("/")
|
dst = dst.strip("/")
|
||||||
|
|
|
@ -11,6 +11,7 @@ PYTHONPATH=.. python3 -m copyparty -v /dev/shm/fusefuzz/r::r -i 127.0.0.1
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
v = "virt"
|
||||||
for n in range(5):
|
for n in range(5):
|
||||||
with open(f"r/{n}", "wb") as f:
|
with open(f"r/{n}", "wb") as f:
|
||||||
f.write(b"h" * n)
|
f.write(b"h" * n)
|
||||||
|
@ -19,7 +20,7 @@ def main():
|
||||||
with open("r/f", "wb", fsz) as f:
|
with open("r/f", "wb", fsz) as f:
|
||||||
f.write(b"\xab" * fsz)
|
f.write(b"\xab" * fsz)
|
||||||
|
|
||||||
for rsz in range(62, 66):
|
for rsz in range(64 * 1024 - 2, 64 * 1024 + 2):
|
||||||
ofslist = [0, 1, 2]
|
ofslist = [0, 1, 2]
|
||||||
for n in range(3):
|
for n in range(3):
|
||||||
ofslist.append(fsz - n)
|
ofslist.append(fsz - n)
|
||||||
|
@ -34,12 +35,12 @@ def main():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for n in range(1, 3):
|
for n in range(1, 3):
|
||||||
with open(f"v/{n}", "rb") as f:
|
with open(f"{v}/{n}", "rb") as f:
|
||||||
f.read()
|
f.read()
|
||||||
|
|
||||||
prev_ofs = -99
|
prev_ofs = -99
|
||||||
with open("r/f", "rb", rsz) as rf:
|
with open("r/f", "rb", rsz) as rf:
|
||||||
with open("v/f", "rb", rsz) as vf:
|
with open(f"{v}/f", "rb", rsz) as vf:
|
||||||
while True:
|
while True:
|
||||||
ofs += shift
|
ofs += shift
|
||||||
if ofs < 0 or ofs > fsz or ofs == prev_ofs:
|
if ofs < 0 or ofs > fsz or ofs == prev_ofs:
|
||||||
|
@ -66,6 +67,39 @@ def main():
|
||||||
|
|
||||||
ofs += len(rb)
|
ofs += len(rb)
|
||||||
|
|
||||||
|
for n in range(1, 3):
|
||||||
|
with open(f"{v}/{n}", "rb") as f:
|
||||||
|
f.read()
|
||||||
|
|
||||||
|
with open("r/f", "rb", rsz) as rf:
|
||||||
|
with open(f"{v}/f", "rb", rsz) as vf:
|
||||||
|
for n in range(2):
|
||||||
|
ofs += shift
|
||||||
|
if ofs < 0 or ofs > fsz:
|
||||||
|
break
|
||||||
|
|
||||||
|
if ofs != rf.tell():
|
||||||
|
rf.seek(ofs)
|
||||||
|
vf.seek(ofs)
|
||||||
|
|
||||||
|
rb = rf.read(rsz)
|
||||||
|
vb = vf.read(rsz)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"fsz {fsz} rsz {rsz} ofs {ofs0} shift {shift} ofs {ofs} = {len(rb)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if rb != vb:
|
||||||
|
raise Exception(f"{len(rb)} != {len(vb)}")
|
||||||
|
|
||||||
|
ofs -= rsz
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
f() { cat virt/{1,2,AAAAAAAAAAAAA}; echo; dd if=virt/f bs=${1} | cmp r/f; }
|
||||||
|
901120
|
||||||
|
"""
|
||||||
|
|
Loading…
Reference in a new issue