Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [ecf-dev] multiple service call

Hi Abhisek,

Thanks. I believe this is because the discovery locator cache on the consumer is not being purged upon ungraceful shutdown of remote provider. So when the service host startups up the second time, the consumer discovery thinks it's already there...and doesn't notify.

I've opened this bug to track:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=313445

Scott

abhisek saikia wrote:
Hi Scott
  Thanks for your response.
  I am using jmdns discovery and ECF generic
Yes,on termination of host,in the consumer side i am geting the event removedService(ServiceReference arg0, Object proxy) of ServiceTrackerCustomizer .but after that if i start the host equinox,consumer is not able to receive any event of addingService(ServiceReference reference) of the ServiceTrackerCustomizer. If i use close osgi console command,consumer is able to receive addingService event once the host started again. Thanks an Regards Abhisek

On Wed, May 19, 2010 at 1:58 AM, Scott Lewis <slewis@xxxxxxxxxxxxx <mailto:slewis@xxxxxxxxxxxxx>> wrote:

    Hi Abhisek,

    abhisek saikia wrote:

        Hi Scott

          Today i tried with ECF
        org.eclipse.ecf.sdk_3.3.0.v20100518-1435 from head.It has the
        fix for this issue.I tested my use case for multiple service
        call.Its working fine.
           But the other issue is still there(abrupt termination of
        provider).
          This issue can be reproduced with any ECF generic sample. I
        also have attached the sample which i tried
         Steps to reproduce:
            1.start consumer equinox
            2.start provider equinox
            3.let the service calls happen
            4.terminate provider equinox using kill -9(if using unix
        environment)  or kill from task manager(windows) or press
        terminate button(if launching from eclipse)


    Ok.  So I would like to work through this case a little bit with
    you...understand what you are seeing...and we'll open a bug and
    address it if necessary.

    First please verify these assumptions:

    a) Using zeroconf/jmdns for discovery
    b) Using ECF generic for distribution
    c) You are using 'provider' rather than 'host' for terminology (I
    know that OSGi remote services spec uses 'provider' but I/we don't
    use that because we also have the concept of a 'provider',
    separate from the remote services role...i.e. host and consumer.

    Here's my assumptions about what is happening (please
    verify/clarify):  you start the consumer first (1), and then the
    host (2).  The remote service is registered by host, and published
    via jmdns discovery provider.  The consumer discovers the remote
    service, creates a proxy, and the consumer's
    ServiceTrackerCustomizer.addingService method is called. In the
    consumer example code this results in several remote service calls
    (i.e. via the proxy, as well as via async/Future and
    async/Callback.  These calls complete successfully.

    At this point, the host is terminated.  What happens then on the
    consumer for you?  On my tests, if I terminate the host via
    Eclipse (i.e. the red stop button), I immediately see the
    following output on my consumer console:

    IHello Service proxy removed
    [log;-0700 2010.05.18
    13:04:13:273;INFO;org.eclipse.ecf.osgi.services.distribution;OSGi
    ECF service distribution: unregistered
endpointDescription=RemoteServiceEndpointDescriptionImpl[svcInterfaces=[org.eclipse.ecf.examples.remoteservices.hello.IHello];supportedConfigTypes=[ecf.generic.server];serviceIntents=null;location=null;remoteServiceId=0;discoveryServiceID=ServiceID[type=ServiceTypeID[typeName=_osgiservices._tcp.default._iana];location=osgiservices://192.168.1.102:3787/svc_0;full=_osgiservices._tcp.default._iana@osgiservices://192.168.1.102:3787/svc_0];endpointID=null;endpointAsID=StringID[ecftcp://localhost:3787/server];connectTargetID=null;remoteServicesFilter=null;props={ecf.rsvc.ns=ecf.namespace.generic.remoteservice
    <http://192.168.1.102:3787/svc_0;full=_osgiservices._tcp.default._iana@osgiservices://192.168.1.102:3787/svc_0%5D%3BendpointID%3Dnull%3BendpointAsID%3DStringID%5Becftcp://localhost:3787/server%5D;connectTargetID=null;remoteServicesFilter=null;props=%7Becf.rsvc.ns=ecf.namespace.generic.remoteservice>,
    osgi.remote.service.interfaces=org.eclipse.ecf.examples.remoteservices.hello.IHello,
    ecf.sp.cns=org.eclipse.ecf.core.identity.StringID, ecf.rsvc.id
    <http://ecf.rsvc.id>=[B@c3e967, ecf.sp.ect=ecf.generic.server,
    ecf.sp.cid=[B@1079ff}]
      proxyServiceRegistration=
    {org.eclipse.ecf.examples.remoteservices.hello.IHello}={service.imported=org.eclipse.ecf.provider.remoteservice.generic.RemoteServiceImpl@1cb374f,
    service.imported.configs=[ecf.generic.client], service.id
    <http://service.id>=52}
    ]

    The first line 'IHello Service proxy removed' indicates that the
    remote service registration *is* getting cleaned up when the
    connect with the remote host is terminated...this is some comment
    code that I added to the ServiceTrackerCustomizer.removedService
    method (which is called when the appropriate service is removed).
    The log message confirms (via the IProxyDistributionListener) that
    the remote service proxy registration was removed.

    This is basically as it should be...as the remote service proxy is
    being cleaned up.  Notice, however, that there is no undiscovery
    event received on the consumer.  That's because with zeroconf,
    since the host was terminated abnormally, the host was not able to
    send out an zeroconf 'unpublish' to the consumer.  The ECF generic
    provider *did* get the socket close, and this was/is used to do
    the proxy remove clean up...but the discovery mechanism still has
    the remote service in it's cache.

    So, in fact, zeroconf still believes the remote services is out
    there.  Zeroconf has what's called a 'time to live' for the
    multicast message...and until that expires the remote osgi service
    information will be present.

    But my question is...assuming you are seeing the same thing as
    above...what do you do now?...and what is the result?...and how
    does this result differ from what you are expecting to happen?

    Thanks.  With your further assistance I think this should be easy
    to identify and fix.

    Scott

        And about container connect,which spring is using might not be
        an issue with ECF,may be in spring code we need to handle in
        such a way that we connect only after remote service has been
        discovered.May be angelo can provide more clarification on it.

        In the present version i faced only one issue which i have
        mentioned.

        Thanks and Regards

        Abhisek

        On Tue, May 18, 2010 at 12:42 AM, Scott Lewis
        <slewis@xxxxxxxxxxxxx <mailto:slewis@xxxxxxxxxxxxx>
        <mailto:slewis@xxxxxxxxxxxxx <mailto:slewis@xxxxxxxxxxxxx>>>
        wrote:

           Hi Abhisek,

           abhisek saikia wrote:

               Hi Scott

                    Existing or new container both are ok for me.For
        me just
               the service call should be successful which i guess
        should be
               the major specification of ECF :).I am currently not going
               with container.connect option with multiple containers
        as it
               had the defect for which client(consumer) needs to be
        started
               first ,Also been reproduced by angelo @
http://dev.eclipse.org/mhonarc/lists/ecf-dev/msg03635.html
           Could you and/or Angelo please open a bug about this
        issue?...and
           include the explanation from Angelo in the bug description?
              Also, please address this question on the bug:

           On the consumer, if the spring framework is creating a
        container,
           and connecting to a targetId with code like this (the
        following is
           copied from Angelo's mailing list post):

           protected IContainer createContainer() throws
           ContainerCreateException,
                     ContainerConnectException {
                 IContainer container = super.createBasicContainer();
                 if (targetId != null) {
                     container.connect(targetId, connectContext);
                 }
                 return container;
             }

           Whenever this code is executed (e.g. upon startup), then
        this logic:

                 if (targetId != null) {
                     container.connect(targetId, connectContext);
                 }

           *will* synchronously attempt to connect to the service
        host...and
           if the service host is not yet started (whether localhost
        or some
           other process) you will get a a connect exception...e.g.
        like he got:

           Caused by: org.eclipse.ecf.core.ContainerConnectException:
           Exception during connection to ecftcp://localhost:3787/server
           <stack trace deleted>
             ... 17 more
           Caused by: java.net.ConnectException: Connection refused:
        connect

           This means simply that the spring initialization code is
        trying to
           connect directly to a given host container (i.e. targetId), and
           that container hasn't had a chance to startup, register the
        remote
           service, and then publish the remote service for discovery
        by the
           consumer.  In other words, the consumer framework startup is
           racing against the startup/initialization of the host.

           One way to avoid the need to explicitly call
           container.connect(targetId, connectContext) at *all* is to
        (on the
           consumer) wait until the remote service is discovered via
           discovery...and only *then* have the container connect to the
           target container.  The logic for doing so (i.e. connect to the
           target container) is already present in the
           DefaultProxyContainerFinder, and the equivalent to targetId is
           already included in the metadata available via discovery.   One
           major change in DefaultProxyContainerFinder *since* the
        release of
           ECF 3.2 was represented by this bug:

           https://bugs.eclipse.org/bugs/show_bug.cgi?id=303979

           This makes it unnecessary to even create a proxy container in
           advance of the service discovery, as after this bug was
        addressed
           a container will be automatically created (if one doesn't
        already
           exist) for dealing with incoming remote services being
        discovered.
            In other words, I believe that with the most recent code from
           HEAD it should be unnecessary for the spring framework bean
        to be
           created on the consumer side at all.  Both the container
        creation
           and the connection can/could all be done lazily...at remote
           service discovery time instead of eagerly (at spring bean
        creation
           time).

           But I'm probably misunderstanding something about your/Angelo's
           use case.   So let's please move this to a new bug,
        however, and
           we can discuss further/diagnose/etc on that new bug.

           Thanks,

           Scott


                Anyway as per your suggestion i will try with the
        unreleased
               code chunk of ECF .

               Thanks and Regards

               Abhisek

               On Mon, May 17, 2010 at 11:33 PM, Scott Lewis
               <slewis@xxxxxxxxxxxxx <mailto:slewis@xxxxxxxxxxxxx>
        <mailto:slewis@xxxxxxxxxxxxx <mailto:slewis@xxxxxxxxxxxxx>>
               <mailto:slewis@xxxxxxxxxxxxx
        <mailto:slewis@xxxxxxxxxxxxx> <mailto:slewis@xxxxxxxxxxxxx
        <mailto:slewis@xxxxxxxxxxxxx>>>>

               wrote:

                  Hi Abhisek,

                  You seem to be using ECF 3.2 release version
        (Release date:
                Feb
                  19, 2010).  There have been a number of bugs fixed since
                  then...one of which having to do with a problem of
        not properly
                  publishing the same service multiple times.  For
        testing, bug
                  identification, etc I would urge you to get the
        latest from
               HEAD,
                  as we are in the testing phase for ECF 3.3/Helios
        release right
                  now...and so it would be most helpful to get some
               assistance from
                  the community with testing ECF 3.3/Helios for your
        specific use
                  cases.  If you need instructions for how to get the
        lastest
               from
                  HEAD in your workspace please let me know...and/or
        see section
                  'Anonymous CVS Access to ECF Source Code':
                   http://www.eclipse.org/ecf/dev_resources.php

                  abhisek saikia wrote:


                      Hi Scott
                         I used
        org.eclipse.ecf.sdk_3.2.0.v20100219-1253.zip
<http://www.eclipse.org/downloads/download.php?file=/rt/ecf/3.2/3.6/org.eclipse.ecf.sdk_3.2.0.v20100219-1253.zip>
                          My issue is a bit different.I have 2
        providers(in 2
                      different machines) and one  consumer in another
               machine.The
                      providers implement the same Interface.I am
        using Service
                      tracker in consumer side.I am able to receive
        only one
               remote
                      reference.While debugging ECF code i found if a
               container is
                      already connected(i.e it already discovered
        provider in
                      machine 1),it cant find the remote service
        reference from
                      machine 2(as the code has a check for
               isContainerConnect which
                      is true while remotelocation becomes machine2,
        as its
               already
                      connected to provider of machine 1) .


                  A couple of things.  First...since 3.2 there has
        been some
                  improvement/change of the logic in
               DefaultProxyContainerFinder wrt
                  handling of multiple remote services.

                  Second...it is possible that this represents a
        bug/problem
               in the
                  DefaultProxyContainerFinder for handling your use case.

                  Third...it's also possible that for your use case
        there is an
                  ambiguity about what you want to happen on the
        multiple-service
                  consumer...i.e. do you want the *existing* proxy
        container
               to be
                  used, or do you want a *new* container to be
               created/connected for
                  this remote service?  There are some facilities already
               present in
                  ECF to support some of these use cases, so it may be a
               matter of
                  figuring out what you wish to happen and then using
        those
               facilities.

                  So...I recommend that you get the latest code from HEAD,
               and try
                  this same use case again.  If it still has problems
        then lets
                  identify them, and we'll address those problems
        and/or needed
                  generalization to handle your use case.


                  Thanks,

                  Scott


                  _______________________________________________
                  ecf-dev mailing list
                  ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
        <mailto:ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>>
               <mailto:ecf-dev@xxxxxxxxxxx
        <mailto:ecf-dev@xxxxxxxxxxx> <mailto:ecf-dev@xxxxxxxxxxx
        <mailto:ecf-dev@xxxxxxxxxxx>>>


                  https://dev.eclipse.org/mailman/listinfo/ecf-dev


------------------------------------------------------------------------



               _______________________________________________
               ecf-dev mailing list
               ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
        <mailto:ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>>
               https://dev.eclipse.org/mailman/listinfo/ecf-dev
           _______________________________________________
           ecf-dev mailing list
           ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
        <mailto:ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>>
           https://dev.eclipse.org/mailman/listinfo/ecf-dev


        ------------------------------------------------------------------------

        _______________________________________________
        ecf-dev mailing list
        ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
        https://dev.eclipse.org/mailman/listinfo/ecf-dev


    _______________________________________________
    ecf-dev mailing list
    ecf-dev@xxxxxxxxxxx <mailto:ecf-dev@xxxxxxxxxxx>
    https://dev.eclipse.org/mailman/listinfo/ecf-dev


------------------------------------------------------------------------

_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/ecf-dev



Back to the top