Norbet Reilly a écrit :

Hi everyone,

Thanks for my inclusion to the project as a "mentored commiter" (I
didn't mind "proby" myself ;-), it's an honour to be involved with
such an exciting opensource project.

I was just wanting to ask one of the ADS gurus what happens exactly at
the LDAP protocol level when an extremely large result set is returned
by ADS for an LDAP search(). Is a client able to start retreiving
results via their NamingEnumeration before the server has completed
its search?

Yep. We don't build the full result first, and then send it to the client. In fact, an iterator is created, and while iterating the result, some entries are pushed back to the client as soon as they are fetched.

I'm hoping there is some sort of "chunking" at the
protocol level so that batches of results are streamed to the client
as they become available, rather then the waiting for the entire
result set to be available first. Is this the case?

It is :) (Alex can confirm)

But there is something that can be done to improve this mechanism : Big objects like jpeg image, for instance, are loaded in memory and sent back to the client. This is dangerous for the server, because if you have more than one client requesting for more than one image, then you can exhaust the memory. Especially if you consider caching, in which case entries are in memory, including their attributes.

Even worst, they will use twice the memory needed to store this image : one as an Attribute, and one as a byte[] in the SearchResultEntry encoded PDU that will be sent back to the client. This is also the case when the cleint send this object when adding it or modifying it. We have thought of using a streaming mechanism allowing us to avoid to keep such objects in memory, with special accessors to get chunks of byte[] from a file instead of loading the full object in memory, but we never had time to build it.

Obviously, this is something we need. It goes deep into the server, but not that much. From Ldap point of view, we just need to modify the LockableAttributeImpl object to deal with a huge attribute, and in this case, stream it to a temporary location on the disk (let say that if an attribute length is longer than 1024 bytes - or char if it's a String -, then a temp file will be used. The trikiest part will be MINA. we are building a ByteBuffer to store the result to send, which will contain the full block of data. What can be done is to modify the way we cooperate with MINA to send chunks of data - 4096 bytes long? - and continue until all the baytes have been sent.

Here is a good piece of interesting work to be done :)

If you are interested, well, we also are to have it into the server! So just don't be afraid, this is not that complicated. We can provide assistance and guidance if needed.

Emmanuel


Thanks


Reply via email to