Well, if we cannot rollback services easily then *why* we have a mode where
we declare a kind of false "atomicity"?

On Wed, Sep 6, 2017 at 6:21 PM, Vladimir Ozerov <voze...@gridgain.com>
wrote:

> Well, if we cannot rollback services easily then when we have a mode where
> we declare a kind of false "atomicity"?
>
> On Wed, Sep 6, 2017 at 6:17 PM, Dmitriy Setrakyan <dsetrak...@apache.org>
> wrote:
>
>> On Wed, Sep 6, 2017 at 8:10 AM, Vladimir Ozerov <voze...@gridgain.com>
>> wrote:
>>
>> > Dima,
>> >
>> > No, my point is to remove method with flag and never allow partial
>> > deployment. I do not needsee any practical use cases for this.
>> >
>>
>> The problem is not in practical use cases, but also in our ability to
>> rollback the already started services. I think it is much easier for us to
>> support the partial deployment than try to implement complex rollback
>> procedures. Also, from a user standpoint, it can be easily explained and
>> seems to be a potentially useful feature. I would keep the partial
>> deployment.
>>
>>
>> >
>> > On Wed, Sep 6, 2017 at 6:06 PM, Dmitriy Setrakyan <
>> dsetrak...@apache.org>
>> > wrote:
>> >
>> > > Vova, makes sense. Couple of comments.
>> > >
>> > >
>> > >    1. allowPartialUpdate -> allowPartialDeploy
>> > >    2. I do not think we need the 2nd deployAll method. This is not the
>> > API
>> > >    where we need convenience shortcuts.
>> > >    3. Partial deployment is a failure, not success, so the exception
>> > should
>> > >    be thrown. However, we must make sure that this exception has list
>> of
>> > >    services that failed to deploy with proper error messages, if
>> > possible.
>> > >
>> > > D.
>> > >
>> > > On Wed, Sep 6, 2017 at 8:01 AM, Vladimir Ozerov <voze...@gridgain.com
>> >
>> > > wrote:
>> > >
>> > > > Igniters,
>> > > >
>> > > > Personally, I do not like the flag name - hard to understand and
>> use.
>> > > What
>> > > > if instead we define the following API:
>> > > >
>> > > > void deployAll(Collection<ServiceConfiguration> cfgs, boolean
>> > > > allowPartialUpdate) throws ServiceDeploymentException
>> > > > void deployAll(Collection<ServiceConfiguration> cfgs)
>> > > > throws ServiceDeploymentException
>> > > >
>> > > > The second method will delegate to deployAll(cfgs, false). This way
>> in
>> > > the
>> > > > vast majority of cases user would not even bother about existence of
>> > this
>> > > > flag.
>> > > >
>> > > > But let's go deeper. If I allowed partial deployment and several
>> > service
>> > > > failed - is it success or failure? On the one hand, it is a kind of
>> > > success
>> > > > as I expected this, so I do not want exceptions. On the other hand
>> this
>> > > is
>> > > > a kind of failure, so Exception might be ok. All this makes API
>> hard to
>> > > > reason about. Personally I do not understand why user may want to
>> allow
>> > > > partial registration in practice. We should allow only
>> all-or-nothing
>> > > mode.
>> > > > And if something went wrong, we should return the list of offending
>> > > > services in exception. This way API reduces to:
>> > > >
>> > > > void deployAll(Collection<ServiceConfiguration> cfgs)
>> > > > throws ServiceDeploymentException
>> > > >
>> > > > Clean, simple, covers 99% of real use cases.
>> > > >
>> > > > Thoughts?
>> > > >
>> > > >
>> > > > On Fri, Aug 18, 2017 at 4:16 AM, Dmitriy Setrakyan <
>> > > dsetrak...@apache.org>
>> > > > wrote:
>> > > >
>> > > > > Sounds good! Thanks for the detailed info. Can you please provide
>> the
>> > > > > updated API in the ticket?
>> > > > >
>> > > > > On Thu, Aug 17, 2017 at 12:41 AM, Denis Mekhanikov <
>> > > > dmekhani...@gmail.com>
>> > > > > wrote:
>> > > > >
>> > > > > > > Can we add an "allOrNone" flag to the deployment method?
>> > > > > >
>> > > > > > Sounds good, I think we can.
>> > > > > >
>> > > > > > > However, hot do you ensure atomicity here?
>> > > > > >
>> > > > > > We can guarantee that if some of configurations are invalid, or
>> a
>> > > > > > transaction, that writes configuration to the internal cache,
>> > fails,
>> > > > then
>> > > > > > no services will be deployed.
>> > > > > >
>> > > > > > Currently we don't track failures on the server side and
>> services
>> > are
>> > > > > > considered successfully deployed once their configurations are
>> > > written
>> > > > to
>> > > > > > the cache. So, it's not possible that all configurations are
>> valid,
>> > > but
>> > > > > > only a part of the services fail to deploy. If we change this
>> > > behavior
>> > > > > and
>> > > > > > start tracking failures during deployment and initialization on
>> the
>> > > > > server,
>> > > > > > then we could automatically cancel services that are already
>> > deployed
>> > > > in
>> > > > > a
>> > > > > > batch.
>> > > > > >
>> > > > > > чт, 17 авг. 2017 г. в 8:34, Dmitriy Setrakyan <d...@gridgain.com>:
>> > > > > >
>> > > > > > > On Wed, Aug 16, 2017 at 8:17 AM, Denis Mekhanikov <
>> > > > > dmekhani...@gmail.com
>> > > > > > >
>> > > > > > > wrote:
>> > > > > > >
>> > > > > > > > I've had a few off-line conversations with other Igniters
>> > > regarding
>> > > > > > this
>> > > > > > > > question and almost all of them think that services should
>> be
>> > > > > deployed
>> > > > > > > with
>> > > > > > > > "all-or-none" failing policy.
>> > > > > > > > We have a similar functionality for caches:
>> Ignite#createCaches
>> > > > > method
>> > > > > > > > don't allow partial deployments, and I think, we should also
>> > > stick
>> > > > to
>> > > > > > > this
>> > > > > > > > principle for services.
>> > > > > > > >
>> > > > > > >
>> > > > > > > Can we add an "allOrNone" flag to the deployment method? If
>> true,
>> > > > then
>> > > > > > all
>> > > > > > > services will have to either be deployed or failed. However,
>> hot
>> > do
>> > > > you
>> > > > > > > ensure atomicity here? If you are deploying 10 services, and
>> > only 1
>> > > > > > fails,
>> > > > > > > what do you do with the other 9, given that they have already
>> > been
>> > > > > > deployed
>> > > > > > > and may have started serving API requests?
>> > > > > > >
>> > > > > > >
>> > > > > > > >
>> > > > > > > > Another question that I'd like to discuss here is that
>> > currently
>> > > > > > > > IgniteServices#deployAsync method may fail with an exception
>> > > > instead
>> > > > > of
>> > > > > > > > returning a future. Shouldn't we change this behavior to
>> make
>> > > async
>> > > > > > > > operations always return a future whose get() method would
>> > throw
>> > > an
>> > > > > > > > exception?
>> > > > > > > >
>> > > > > > >
>> > > > > > > Makes sense to me. I think throwing exception from async
>> method
>> > is
>> > > > > plain
>> > > > > > > wrong.
>> > > > > > >
>> > > > > > > >
>> > > > > > > > вт, 15 авг. 2017 г. в 11:42, Dmitriy Setrakyan <
>> > > > > dsetrak...@apache.org
>> > > > > > >:
>> > > > > > > >
>> > > > > > > > > Denis,
>> > > > > > > > >
>> > > > > > > > > I don't think we need a king deployment result.
>> > > > > > > > >
>> > > > > > > > > The "deployAllAsync" method should never throw an
>> exception,
>> > it
>> > > > > > should
>> > > > > > > > > always return the future. However, the
>> IgniteFuture.get(...)
>> > > > method
>> > > > > > > does
>> > > > > > > > > throw an exception, and in this exception you should
>> provide
>> > > the
>> > > > > info
>> > > > > > > > about
>> > > > > > > > > the failures.
>> > > > > > > > >
>> > > > > > > > > D.
>> > > > > > > > >
>> > > > > > > > > On Tue, Aug 15, 2017 at 1:31 AM, Denis Mekhanikov <
>> > > > > > > dmekhani...@gmail.com
>> > > > > > > > >
>> > > > > > > > > wrote:
>> > > > > > > > >
>> > > > > > > > > > Dmitriy, thank you for your reply!
>> > > > > > > > > >
>> > > > > > > > > > I see a possibility of a bad scenario here. If we use
>> > > > > > deployAllAsync
>> > > > > > > > > method
>> > > > > > > > > > and it throws an exception, then the constructed future
>> > won't
>> > > > be
>> > > > > > > > returned
>> > > > > > > > > > and we won't have a way to wait for the rest of the
>> > services
>> > > to
>> > > > > > > deploy.
>> > > > > > > > > > Maybe we should return some king of deployment result,
>> > > > > containing a
>> > > > > > > > > future
>> > > > > > > > > > along with a collection of failed services, instead of
>> > > throwing
>> > > > > an
>> > > > > > > > > > exception?
>> > > > > > > > > >
>> > > > > > > > > > пн, 14 авг. 2017 г. в 18:03, Dmitriy Setrakyan <
>> > > > > > > dsetrak...@apache.org
>> > > > > > > > >:
>> > > > > > > > > >
>> > > > > > > > > > > Hi Denis, I agree, we should have an API for batch
>> > service
>> > > > > > > > deployment.
>> > > > > > > > > My
>> > > > > > > > > > > comments are inline...
>> > > > > > > > > > >
>> > > > > > > > > > > On Mon, Aug 14, 2017 at 2:22 AM, Denis Mekhanikov <
>> > > > > > > > > dmekhani...@gmail.com
>> > > > > > > > > > >
>> > > > > > > > > > > wrote:
>> > > > > > > > > > >
>> > > > > > > > > > > > Hi Igniters!
>> > > > > > > > > > > >
>> > > > > > > > > > > > Currently Ignite doesn't have support for batch
>> service
>> > > > > > > deployment,
>> > > > > > > > > but
>> > > > > > > > > > > it
>> > > > > > > > > > > > may be a very useful feature in case of a big
>> number of
>> > > > nodes
>> > > > > > in
>> > > > > > > a
>> > > > > > > > > > > cluster
>> > > > > > > > > > > > and services to be deployed. Each deployment
>> includes
>> > > write
>> > > > > > into
>> > > > > > > an
>> > > > > > > > > > > > internal transactional cache, which is the longest
>> part
>> > > of
>> > > > > the
>> > > > > > > > > > procedure.
>> > > > > > > > > > > >
>> > > > > > > > > > > > I propose to optimize it by performing multiple
>> writes
>> > > in a
>> > > > > > > single
>> > > > > > > > > > > > transaction. It implies an introduction of a few new
>> > > > methods
>> > > > > in
>> > > > > > > > > > > > IgniteServices interface.
>> > > > > > > > > > > > I am thinking about the following signatures:
>> > > > > > > > > > > >
>> > > > > > > > > > > >   void deployAll(Iterable<ServiceConfiguration>
>> cfgs)
>> > > > throws
>> > > > > > > > > > > > IgniteException;
>> > > > > > > > > > > >   IgniteFuture<Void>
>> > > > > > > deployAllAsync(Iterable<ServiceConfiguration>
>> > > > > > > > > > > > cfgs) throws IgniteException;
>> > > > > > > > > > > >
>> > > > > > > > > > > > I'd like to know your opinion on the following
>> > questions:
>> > > > > > > > > > > >
>> > > > > > > > > > > >    - Do you agree with the proposed signatures?
>> > > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > Yes, but Iterable should be changed to Collection to
>> be
>> > > > > > consistent
>> > > > > > > > with
>> > > > > > > > > > > other similar APIs in Ignite.
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > >    - What should happen in case of a failure (some
>> of
>> > the
>> > > > > > > > > > configurations
>> > > > > > > > > > > >    don't pass validation, or a service with
>> specified
>> > > name
>> > > > > but
>> > > > > > > > > > different
>> > > > > > > > > > > >    configuration already exists)? Should partial
>> > > > deployments
>> > > > > be
>> > > > > > > > > > performed
>> > > > > > > > > > > > in
>> > > > > > > > > > > >    case when some of them fail?
>> > > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > Yes, we should allow partial deployment. The exception
>> > > thrown
>> > > > > > > should
>> > > > > > > > > > have a
>> > > > > > > > > > > collection of services that have failed deployment. It
>> > > looks
>> > > > > like
>> > > > > > > you
>> > > > > > > > > > will
>> > > > > > > > > > > need to create ServiceDeploymentException (extends
>> > > > > > IgniteException)
>> > > > > > > > to
>> > > > > > > > > > > handle this case (in which case, you have to make sure
>> > that
>> > > > > other
>> > > > > > > > > deploy
>> > > > > > > > > > > methods also throw it).
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > >
>> > > > > > > > > > > > Regarding the second question I think that we
>> shouldn't
>> > > > > deploy
>> > > > > > > any
>> > > > > > > > > > > services
>> > > > > > > > > > > > in a batch if we encounter any problems with some of
>> > > them.
>> > > > > > > > > > > >
>> > > > > > > > > > > > Also cancelAll method may be optimized in a similar
>> > way,
>> > > > but
>> > > > > no
>> > > > > > > > > > interface
>> > > > > > > > > > > > changes are needed there.
>> > > > > > > > > > > >
>> > > > > > > > > > > > Ticket: https://issues.apache.org/
>> > > jira/browse/IGNITE-5145
>> > > > > > > > > > > >
>> > > > > > > > > > > > --
>> > > > > > > > > > > > Cheers,
>> > > > > > > > > > > > Denis Mekhanikov
>> > > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>>
>
>

Reply via email to