Skip to main content

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

Fix has been released to https://bugs.eclipse.org/bugs/show_bug.cgi?id=313445

I would appreciate testing in your environment Abhisek to verify that it now works for your use case.

Thanks,

Scott

abhisek saikia wrote:
Thanks a lot Scott

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

    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>
        <mailto: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>
<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>
           <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>
           <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>>
               <mailto: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>>>
                      <mailto: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>>>
                      <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 <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>>
               <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>>
               <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