On Sep 28, 2017 7:10 AM, "Enrico Olivelli" <eolive...@gmail.com> wrote:

2017-09-28 15:34 GMT+02:00 Sijie Guo <guosi...@gmail.com>:

> - these interfaces are more an admin interface. you can get an bookkeeper
> admin object and then access ledger manager to fetch metadata, does that
> work for you?
>

Yes as a workaround I am taking exactly this approch...listLedgers ->
getLedgerMetadata (using BK 4.5)

As the project I am working on will use 4.6 and the new
org.apache.bookkeeper.client.api as I need volatily durability ledgers it
is a pity to me that I will be stuck to use BookKeeperAdmin and
LedgerMetadata
only for listing ledgers


We can propose the interface for bk admin. But I don't see a reason that
listing ledgers being as part of bookkeeper.



> - metadata filter is just a wrapper over ledger iterator or async process
> ledger of ledger manager. most likely you will be the logic implementer. I
> don't see any strong reason we need to expose this filter as well. I would
> suggesting deferring this kind of requirements when we really need it.
>

we could at least add listLedgers + getLedgerMetadata API in the new API so
that new clients won't need BookKeeperAdmin, which takes a direct ZK client


-1 for any direct zk access. It should be hidden behind a ledger manager.

or a legacy o.a.b.client.BookKeper object

I have a good use case, to access the list of ledgers which satisfy a given
condition on custom metadata, we introduced custom metadata in order to
mark ledgers and to meta operations, classifications....


If metadata store doesn't support predicate pushdown, you still iterate all
the ledgers and do the filter at your side. So I don't see a reason to
support filter.

And if you are filtering custom metadata, this logic sounds tight to
application logic, no?


It is not blocker but if you are ok I will create an issue, but before
creating an issue I would like to draft a starting idea which would work
for the community as usual


I don't see a strong value having a metadata filter, given it doesn't buy
you any benefits at current metadata store. So I am -0 to this idea.


Thanks
Enrico





>
>
>
> On Thu, Sep 28, 2017 at 9:05 AM Enrico Olivelli <eolive...@gmail.com>
> wrote:
>
> > 2017-09-28 14:55 GMT+02:00 Sijie Guo <guosi...@gmail.com>:
> >
> > > On Sep 28, 2017 6:20 AM, "Enrico Olivelli" <eolive...@gmail.com>
> wrote:
> > >
> > > Hi,
> > > I am looking for an API to read ledger metadata without actually
> opening
> > a
> > > ledger.
> > >
> > > Currently opening a ledger sets a watch on ZK and this is really
> > expensive
> > > and in any case the desired action is not to "open a ledger" but to
> > access
> > > meta information about the ledger.
> > >
> > > My real usecase is that I want to list ledgers and filter the results
> > using
> > > custom metadata.
> > >
> > > If there is no available solution I would like to file and issue and a
> > > proposal to have a new method in the new API like
> > >
> > > org.apache.bookkeeper.client.api.LedgerMetadata {
> > >     public long getId();
> > >     public Map<String, byte[]> getCustomMetadata();
> > >     public long getCtime();
> > > }
> > >
> > >
> > > I am fine with an interface for ledger metadata. It can help hide the
> > > implementation details.
> > >
> > >
> > > org.apache.bookkeeper.client.api.BookKeeper {
> > >
> > >       LedgerMetadata getLedgerMetadata(long ledgerId);
> > >       void listLedgers(String query, Consumer<LedgerMetadata>
consumer)
> > >
> > > }
> > >
> > >
> > > I am not sure if we want this. Now, you can access the ledger manager
> for
> > > reading and listing metadata. And this is how it was used by bk shell.
> I
> > > would not suggest adding this to the public API until we really see a
> > value
> > > there.
> > >
> >
> > BookKeeper object does not expose LedgerManager, I don't know if we want
> to
> > expose it in the new API
> >
> > we could add an API like:
> >
> > interface org.apache.bookkeeper.client.api.LedgerMetadataFilter {
> >     // marker interface
> > }
> >
> > class org.apache.bookkeeper.client.api.CustomMetadataFilter implements
> > LedgerMetadataFilter {
> >      // filter custom metadata field == value
> >        CustomMetadataFilter(String key, byte[] value);
> > }
> >
> > class org.apache.bookkeeper.client.api.CompositeMetadataFilter
> implements
> > LedgerMetadataFilter {
> >      // apply a sequence of filters in AND
> >      CompositeMetadataFilter(LedgerMetadataFilter ... filters);
> > }
> >
> >
> > void listLedgers(LedgerFilter filter, Consumer<LedgerMetadata> consumer)
> >
> > Does this sound better to you ? it is more simpler but clear and the
> > implemenation will be really easy
> >
> >
> >
> > >
> > >
> > > for the "query" we can define a simple "expression language"
> > >
> > > metadata.owner = 'xxx' and (metadata.type = 'yyyy' or metadata.type =
> > > 'zzzz')
> > >
> > >
> > > I am not a fan of having a query language for such purpose in bk. At
> > least,
> > > I don't see a lot of use cases that need this kind of query
> capabilities.
> > > If you can share more use cases about this, that would be good for
> > > discussions.
> > >
> > >
> > > we can provide a basic implementation of that language which actually
> > works
> > > on LedgerMetadata objects and internally we will loop over the ledgers
> > and
> > > apply the expression to every ledger
> > > the basic implementation can leverage standard expression languages
> like
> > EL
> > >
> > > smarter implementations of LedgerManager will be able to narrow the
> > search
> > > and save resources
> > >
> > > Thoughts ?
> > >
> > > -- Enrico
> > >
> >
>

Reply via email to