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


> - 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
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....

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

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