blob: 31a026c8cc92a18c660124195f0659fe32388af0 [file] [log] [blame]
APACHE COMMONS: serf -*-indented-text-*-
OPEN ISSUES
* rather than having serf_bucket_alloc_t, can we make
apr_allocator_t work "well" for bunches o' small allocations?
Justin says: Take the 'freelist' code from apr-util's bucket allocator
and merge that (somehow) with apr_allocator_t.
(< MIN_ALLOC_SIZE allocations - i.e. <8k)
A: Sander says that the cost-per-alloc'd-byte is too
expensive. the apr_allocator works best for 4k multiples. it
provides a buffer between system alloc and the app. small
allocs should be built as another layer.
* memory usage probably needs some thought. in particular, the mix
between the bucket allocators and any pools associated with the
connection and the responses. see the point below about buckets
needing pools.
Justin says: Oh, geez, this is awful. Really awful. pools are just
going to be abused. For now, I've tied a pool with the
serf_bucket_allocator as I can't think of a better
short-term solution. I think we can revisit this once we
have a better idea how the buckets are going to operate. I'd
like to get a better idea how filters are going to be written
before deciding upon our pool usage.
gstein says: I think an allocator will be used for for a whole
context's worth of buckets. any pool within this
system ought to be transaction-scoped (e.g. tied to a
particular request/response pair).
* the current definition has a "metadata" concept on a per-bucket
basis. however, to record this metadata, we really want to be able
to use apr_hash_t, which implies having a pool.
we do have a respool associated with the response. how does that
get transferred to the individual buckets for their usage? what
about the request side of things?
Justin says: Yes, the request side will need a pool, too. Since we're
using APR, almost all of APR is closed off if we don't have
a pool. So, we do need to allow for buckets to have access to
some pool. The $64mil question is how.
gstein says: each bucket is alloc'd from a serf_bucket_alloc_t
which has an associated pool. the bucket can fetch
that and use it.
Q: is this going to be workable?
* How does serf_aggregate_bucket_become(bucket) work?
Justin says: We want bucket to be an aggregate bucket, and for the first
bucket in that aggregate bucket to be the 'original' bucket.
I think we just swap internal data structures, but not sure.
gstein says: we don't necessarily want to preserve the original
bucket. consider a REQUEST bucket which could
"become" an aggregate containing two buckets: one for
the serialized request-line and headers, and one for
the body. there is no REQUEST bucket any more.
* If anyone knows how to use APR_RING, we could probably use that for the
aggregate bucket list.
gstein says: I think this implies a little entry structure which
contains the "link", plus a pointer to the bucket. I
was thinking of just using an apr array.
* How does something like deflate get inserted into both the request and
response?
Justin says: I'm still not crystal clear on how this should work.
I'd like the concept of a 'filter' somehow as we can
shield the 'user programmer' from this, but I dunno.
A 'hook' after the request is created, but before it
is sent???
gstein says: when assembling the request bucket, a "deflate"
bucket can be wrapped around the body bucket. it
reads raw content, compresses it, and returns
that. when a response arrives, an "inflate" bucket is
wrapped around the body bucket to inflate the
response. (of course, the decision points are made
based upon headers and server capabilities whatnot)
filters are just buckets that wrap other buckets.
* how to signify "bucket is done"? len==0? NULL data pointer? return
APR_EOF? Note that we intend for the response handler to return
APR_EOF to denote that the response has been completely read. I'm
of a mind to say "return APR_EOF".
A: return APR_EOF. data may also be returned at the same
time. this allows a bucket to return "all available
information" which includes data and the notation that no more
data exists.
* if the poll() does not return POLLHUP, then how do we detect EOF?
we'd end up seeing POLLIN, go for a read(), and probably get a
SIGHUP or SIGPIPE as a result. if it just keeps returning len==0,
then we could have a problem. part of the issue here is that we
get a POLLIN from poll(), but the reading occurs in an entirely
different context (call a response handler, which reads a bucket,
which trickles down to a socket bucket, and then reading the
socket object). transmitting "there should be something to read"
over to that other context could be difficult.
see: http://www.greenend.org.uk/rjk/2001/06/poll.html
* review the various OUT parameters and see if any make sense to
allow a NULL value to designate non-interest in the result.