Re: Using the async GridFS api with asynchronously available data

From: Ross Lawley <ross@xxxxxxxxxxx>
To: mongodb-user <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Mon, 18 Apr 2016 04:13:26 -0700 (PDT)
Why ads?


Hi Steve,


To mirror Jeff's comment in JAVA-1282 
<https://jira.mongodb.org/browse/JAVA-1282?focusedCommentId=1231411&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1231411> this 
is an example of the producer-consumer problem - someone has to control the 
data flow.  As the file being uploaded into GridFS could be huge, the 
driver doesn't handle buffering because to do so would risk the potential 
for an out of memory exception. This is similar to the AsynchronousSocketChannel 
API 
<https://docs.oracle.com/javase/8/docs/api/java/nio/channels/AsynchronousSocketChannel.html#write-java.nio.ByteBuffer-A-java.nio.channels.CompletionHandler-> that 
also expects the producer to handle the flow and control of the data.


You are correct in that you should call uploadStream.write chronologically 
with each buffer and if a new buffer comes in before the uploadStream can 
process it, it should be buffered and then processed when the 
uploadStream.write callback is triggered. I know Vert.x has back pressure 
support via the reactive streams 
<http://vertx.io/docs/vertx-reactive-streams/java/> api, so it may be 
possible to convert the code that writes the data to that API and save 
replicating the buffering logic 

In case I implement my own AsyncInputStream, the same thing applies. I 
would need to somehow buffer the data until the read method is called by 
the driver where I can provide a slice of data, which in turn seems quite 
cumbersome to me. And just in case, if the next slice of data is not yet 
available when the read method is called, and I provide 0 bytes, does the 
driver periodically poll if the data is available yet?


I'm not sure I follow here, but given that when reading data from GridFS 
you can provide the buffer which will be used and information about the 
bytes transferred in the callback.  So I think I'm missing something here, 
could you provide an example of using that kind of api in Vert.x?

-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/48ffc7c5-6c41-401e-a2ef-444110aea4c7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?