-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
datamodel Length() not usable with lazy nodes (e.g. ADLs) #531
Comments
I agree that this is a problem, and it would be good to resolve it without too much of a hack. I know that during development there was an attempt to reign in the verbosity of the API—it's already very verbose but it could be a lot more by allowing everything to error .. but maybe they should in a world where we're building multi-layered abstractions over these things with complex behaviour underneath. In terms of options:
I'd prefer this, but it's going to be very painful breaking that contract, with everyone needing to make the jump together. Are we prepared to deal with that pain?
This could end up being more dangerous; a length is often used for iteration. Silently changing contract on this could leave users exposed to surprising, or damaging, behaviour. It might be best to be noisy about it.
Does this buy us anything that option 1 doesn't give us? It breaks the interface so the same dependency upgrade pain will exist, we just get to wriggle out of having to check for Another option exists, to ignore the problem and keep on papering over it. The unixfs-preload one is pretty annoying because one way to handle problems like this is to hold on to an error and return it on a later call to an error returning API call, but with unixfs-preload, no more calls to the Node are made so it gets lost entirely! |
Closes: #531 ADL and other Node implementations that need to perform non-trivial work in calculating their Length(), such as by loading multiple child blocks, may encounter errors which should not be silently ignored.
#532, just to see what that would look like internally |
Noticed while discovering ipfs/go-unixfsnode#54
The contract on
node.Length()
isgo-ipld-prime/datamodel/node.go
Lines 131 to 133 in 65bfa53
This means that if there is any sort of lazy loading or computation involved in working with a node that is definitely a list or map that there is nothing valid to return.
-1
but that's a contract violationI suspect the options here are:
Length
to return an error-1
to mean any type of errorLength
While 2 seems the easiest, it has the ability to break a bunch of code without people noticing. Simple compile-time checked fixes like 1 seem a safer option.
Whether 1 or 3 is preferred seems like a matter of taste.
Note: the other functions on the Node interface which could potentially run into a similar issue are
Kind()
,IsAbsent()
, andIsNull()
However, it seems like these are less likely to be lazily constructed thanLength
and therefore less likely to be a problem.Similarly, the map and list iterators can return errors once they're in use (and they can be checked in advance with
Kind()
) and so are also less problematic.The text was updated successfully, but these errors were encountered: