Make operation-handle-querying use only a little memory #857
Labels
No Label
0.2.0
0.3.0
0.4.0
0.5.0
0.5.1
0.6.0
0.6.1
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.10.1
1.10.2
1.10a2
1.11.0
1.12.0
1.12.1
1.13.0
1.14.0
1.15.0
1.15.1
1.2.0
1.3.0
1.4.1
1.5.0
1.6.0
1.6.1
1.7.0
1.7.1
1.7β
1.8.0
1.8.1
1.8.2
1.8.3
1.8β
1.9.0
1.9.0-s3branch
1.9.0a1
1.9.0a2
1.9.0b1
1.9.1
1.9.2
1.9.2a1
LeastAuthority.com automation
blocker
cannot reproduce
cloud-branch
code
code-dirnodes
code-encoding
code-frontend
code-frontend-cli
code-frontend-ftp-sftp
code-frontend-magic-folder
code-frontend-web
code-mutable
code-network
code-nodeadmin
code-peerselection
code-storage
contrib
critical
defect
dev-infrastructure
documentation
duplicate
enhancement
fixed
invalid
major
minor
n/a
normal
operational
packaging
somebody else's problem
supercritical
task
trivial
unknown
was already fixed
website
wontfix
worksforme
No Milestone
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Reference: tahoe-lafs/trac-2024-07-25#857
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The documentation on operation handles starting at source:docs/frontends/webapi.txt@4112#L203 says:
hm, interesting. I have no idea how to improve this. There are two sources of memory usage. The first is the underlying results list, to which a new record is appended for each file/directory that is traversed. This one grows over time, unrelated to the act of querying the operation.
The second when the operation is queried, and the API specifies a JSON string that basically copies the underlying results list (converting some fields into a more JSON-representable format). The problem here is that the
simplejson.dumps()
call produces a single large string, probably withStringIO
, which will probably use (briefly) about twice the memory as the original results list (one copy for lots of little stringlets, a second copy for the merged result, then the first copy is released).Maybe there's a way to use
simplejson.dump
instead (which takes a file-like object as a target for.write()
calls), and glue it onto the HTTP response channel. simplejson is going to run synchronously anyways, so it won't save us from one copy of that string (living in the HTTP transport write buffer), but maybe it could save us from the temporary condition of having two copies of that string.OTOH, maybe we should give up the convenience of doing slow deep traversal operations within the node, and require the webapi client to do it, moving the buffering requirements out to their side. Or, make an API for slow deep traversals that streams the results, but pauses the operation if/when the HTTP channel is lost, to avoid the need to store unclaimed results. Or an API that requests results in chunks, and explicitly releases earlier chunks, so that the node could discard old results that the client has safely retrieved.