From dev-return-98171-archive-asf-public=cust-asf.ponee.io@kafka.apache.org Sun Sep 16 20:37:50 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 31524180652 for ; Sun, 16 Sep 2018 20:37:49 +0200 (CEST) Received: (qmail 91244 invoked by uid 500); 16 Sep 2018 18:37:47 -0000 Mailing-List: contact dev-help@kafka.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@kafka.apache.org Delivered-To: mailing list dev@kafka.apache.org Received: (qmail 91232 invoked by uid 99); 16 Sep 2018 18:37:47 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 16 Sep 2018 18:37:47 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 635FECB75A for ; Sun, 16 Sep 2018 18:37:46 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.495 X-Spam-Level: X-Spam-Status: No, score=0.495 tagged_above=-999 required=6.31 tests=[DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.248, KAM_LOTSOFHASH=0.25, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_PASS=-0.001] autolearn=disabled Authentication-Results: spamd1-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id P4CdjXXmg32r for ; Sun, 16 Sep 2018 18:37:42 +0000 (UTC) Received: from mail-lj1-f193.google.com (mail-lj1-f193.google.com [209.85.208.193]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTPS id AFD3A5F11F for ; Sun, 16 Sep 2018 18:37:41 +0000 (UTC) Received: by mail-lj1-f193.google.com with SMTP id u83-v6so11268136lje.12 for ; Sun, 16 Sep 2018 11:37:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:message-id:subject:to:date:in-reply-to:references :mime-version; bh=FiERvE5ZR2n499utLAWpSc8XzZv3642SnHozqF0B4qs=; b=JJCMkc+TaNTetgbraLpVmpGOt+xP8hu5sE2zSAwtZ0Qv97aJUsgDdYBTTkqxIyAmZ0 1xTxBBwcHlA0xg0m2tJXDl1fnxtS5+PG6D6cAqpFjk382+4XH0DTLkjWiWAEkSfLila5 JuZTypUWfUzGSgipuTGwNy+4dltuHZ/UwAgVLZEjtj9DhJO2acu/ifkhEiQ0jNbbro/O pbMAU9wy2kpVpqkVo5flwkRaPF3g+228YebF4d2Ow1syIQAL5odANJuw8qCIslp+EX2J gwLbG0BJlMPU3sj4+nnjX7SYpHBYhsgzd8/WAl5SgiKNHO4GsNM1SfY3ZmAMwCOl4rQX zafA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:message-id:subject:to:date :in-reply-to:references:mime-version; bh=FiERvE5ZR2n499utLAWpSc8XzZv3642SnHozqF0B4qs=; b=i2WGsl5nrsx0jqQZFatdc7RJFfTjl18YxrMFgcEcQZ2kU7wX8sU2T9Vu2/V+sKxPce hLeM88kbSBtk32X3jCC0HC6JoJwVP8MlMo4jmL59MZz85g50HnIeHKeiaRbxcxv2v/Rn ce/E/MG8Nd0ymXvCtfgUyrIVruCugFfGfmtOa1Rln3XCHoL4EMuSZnUZ4NaMvHcYnkfD IeiiEGy6rR4QUAbdCNbuDOykSg6e8V8kMbVO/sp08OJ+0Fh8fJVSzX1OZ/QyW7Bw6tWc gd2EnJtgOHcpfe7b4ZDSEHxBS6VsNrL2u003SI4PHzpIgg356dwfqLtzbW4qaToWCcJ1 FgYg== X-Gm-Message-State: APzg51CtTUgfSKHv7jiImptfASY/39KCSAQlKdLcuOXp+AesfDSDg0/V w0/IFsUBKXFZZp7qJWcMmsre2rGg X-Google-Smtp-Source: ANB0VdagRAhrpW64BHVU6Trx0SDPMqAAlXn9sAEjnVnissZcMyRwsX+7Gy7yKmJkBVm1xlVVh8FZ6g== X-Received: by 2002:a2e:870b:: with SMTP id m11-v6mr14009367lji.2.1537123060143; Sun, 16 Sep 2018 11:37:40 -0700 (PDT) Received: from newDragon ([91.210.95.4]) by smtp.googlemail.com with ESMTPSA id y17-v6sm2415558ljd.42.2018.09.16.11.37.38 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 16 Sep 2018 11:37:38 -0700 (PDT) Sender: =?UTF-8?B?0J3QuNC60L7Qu9Cw0Lkg0JjQttC40LrQvtCy?= From: Nikolay Izhikov X-Google-Original-From: Nikolay Izhikov Message-ID: <84f5f8236b31f2bc9a713be73e2641401bdabe6c.camel@gmail.com> Subject: Re: [DISCUSS] KIP-358: Migrate Streams API to Duration instead of long ms times To: dev@kafka.apache.org Date: Sun, 16 Sep 2018 21:37:32 +0300 In-Reply-To: References: <8f2d20d6581b6d7d4e104bc75444e125c4eb3ec1.camel@gmail.com> <0cedd9ce-da20-b48a-edb3-ee11995df992@confluent.io> <28125bdff1f42999cbc2641ff1a2b8644a190dad.camel@gmail.com> <12601915b95796d3fe77cf81e3285e123113e699.camel@gmail.com> <0327b2b1294ce483382b283229e3fc0609734f04.camel@gmail.com> <7fc61163-1e2b-5b2e-3e95-da43e1353010@confluent.io> Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-opPNNRD0mHttIERFeGu2" X-Mailer: Evolution 3.28.1-2 Mime-Version: 1.0 --=-opPNNRD0mHttIERFeGu2 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Dear commiters,=20 I got two binding +1 in [VOTE] thread for this KIP [1]. I still need one more. Please, take a look at KIP. [1] https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac790b6a0de= 7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E =D0=92 =D0=A7=D1=82, 13/09/2018 =D0=B2 19:33 +0300, Nikolay Izhikov =D0=BF= =D0=B8=D1=88=D0=B5=D1=82: > Fixed.=20 >=20 > Thanks, for help! >=20 > Please, take a look and vote. >=20 > =D0=92 =D0=A7=D1=82, 13/09/2018 =D0=B2 08:40 -0700, Matthias J. Sax =D0= =BF=D0=B8=D1=88=D0=B5=D1=82: > > No need to start a new voting thread :) > >=20 > > For the KIP update, I think it should be: > >=20 > > > ReadOnlyWindowStore { > > > //Deprecated methods. > > > WindowStoreIterator fetch(K key, long timeFrom, long timeTo); > > > KeyValueIterator, V> fetch(K from, K to, long timeFro= m, long timeTo); > > > KeyValueIterator, V> fetchAll(long timeFrom, long tim= eTo); > > > =20 > > > //New methods. > > > WindowStoreIterator fetch(K key, Instant from, Duration durati= on) throws IllegalArgumentException; > > > KeyValueIterator, V> fetch(K from, K to, Instant from= , Duration duration) throws IllegalArgumentException; > > > KeyValueIterator, V> fetchAll(Instant from, Duration = duration) throws IllegalArgumentException; > > > } > > > =20 > > > =20 > > > WindowStore { > > > //New methods. > > > WindowStoreIterator fetch(K key, long timeFrom, long timeTo); > > > KeyValueIterator, V> fetch(K from, K to, long timeFro= m, long timeTo); > > > KeyValueIterator, V> fetchAll(long timeFrom, long tim= eTo); > > > } > >=20 > > Ie, long-versions are replaced with Instant/Duration in > > `ReadOnlyWindowStore`, and `long` method are added in `WindowStore` -- > > this way, we effectively "move" the long-versions from > > `ReadOnlyWindowStore` to `WindowStore`. > >=20 > > -Matthias > >=20 > > On 9/13/18 8:08 AM, Nikolay Izhikov wrote: > > > Hello, Matthias. > > >=20 > > > > I like the KIP as-is. Feel free to start a VOTE thread. > > >=20 > > >=20 > > > I'm already started one [1]. > > > Can you vote in it or I should create a new one? > > >=20 > > >=20 > > > I've updated KIP. > > > This has been changed: > > >=20 > > > ReadOnlyWindowStore { > > > //Deprecated methods. > > > WindowStoreIterator fetch(K key, long timeFrom, long timeTo); > > > KeyValueIterator, V> fetch(K from, K to, long timeFro= m, long timeTo); > > > KeyValueIterator, V> fetchAll(long timeFrom, long tim= eTo); > > > } > > >=20 > > > WindowStore { > > > //New methods. > > > WindowStoreIterator fetch(K key, Instant from, Duration durati= on) throws IllegalArgumentException; > > > KeyValueIterator, V> fetch(K from, K to, Instant from= , Duration duration) throws IllegalArgumentException; > > > KeyValueIterator, V> fetchAll(Instant from, Duration = duration) throws IllegalArgumentException; > > > } > > >=20 > > > [1] https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac790= b6a0de7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E > > >=20 > > > =D0=92 =D0=A1=D1=80, 12/09/2018 =D0=B2 15:46 -0700, Matthias J. Sax = =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > Great! > > > >=20 > > > > I did not double check the ReadOnlySessionStore interface before, a= nd > > > > just assumed it would take a timestamp, too. My bad. > > > >=20 > > > > Please update the KIP for ReadOnlyWindowStore and WindowStore. > > > >=20 > > > > I like the KIP as-is. Feel free to start a VOTE thread. Even if the= re > > > > might be minor follow up comments, we can vote in parallel. > > > >=20 > > > >=20 > > > > -Matthias > > > >=20 > > > > On 9/12/18 1:06 PM, John Roesler wrote: > > > > > Hi Nikolay, > > > > >=20 > > > > > Yes, the changes we discussed for ReadOnlyXxxStore and XxxStore s= hould be > > > > > in this KIP. > > > > >=20 > > > > > And you're right, it seems like ReadOnlySessionStore is not neces= sary to > > > > > touch, since it doesn't reference any `long` timestamps. > > > > >=20 > > > > > Thanks, > > > > > -John > > > > >=20 > > > > > On Wed, Sep 12, 2018 at 4:36 AM Nikolay Izhikov wrote: > > > > >=20 > > > > > > Hello, Matthias. > > > > > >=20 > > > > > > > His proposal is, to deprecate existing methods on `ReadOnlyWi= ndowStore`> > > > > > >=20 > > > > > > and `ReadOnlySessionStore` and add them to `WindowStore` and> `= SessionStore` > > > > > > > Does this make sense? > > > > > >=20 > > > > > > You both are experienced Kafka developers, so yes, it does make= a sense to > > > > > > me :). > > > > > > Do we want to make this change in KIP-358 or it required anothe= r KIP? > > > > > >=20 > > > > > > > Btw: the KIP misses `ReadOnlySessionStore` atm. > > > > > >=20 > > > > > > Sorry, but I don't understand you. > > > > > > As far as I can see, there is only 2 methods in `ReadOnlySessio= nStore`. > > > > > > Which method should be migrated to Duration? > > > > > >=20 > > > > > >=20 > > > > > > https://github.com/apache/kafka/blob/trunk/streams/src/main/jav= a/org/apache/kafka/streams/state/ReadOnlySessionStore.java > > > > > >=20 > > > > > > =D0=92 =D0=92=D1=82, 11/09/2018 =D0=B2 09:21 -0700, Matthias J.= Sax =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > I talked to John offline about his last suggestions, that I o= riginally > > > > > > > did not fully understand. > > > > > > >=20 > > > > > > > His proposal is, to deprecate existing methods on `ReadOnlyWi= ndowStore` > > > > > > > and `ReadOnlySessionStore` and add them to `WindowStore` and > > > > > > > `SessionStore` (note, all singular -- not to be confused with= classes > > > > > > > names plural). > > > > > > >=20 > > > > > > > Btw: the KIP misses `ReadOnlySessionStore` atm. > > > > > > >=20 > > > > > > > The argument is, that the `ReadOnlyXxxStore` interfaces are o= nly exposed > > > > > > > via Interactive Queries feature and for this part, using `lon= g` is > > > > > > > undesired. However, for a `Processor` that reads/writes store= s on the > > > > > > > hot code path, we would like to avoid the object creation ove= rhead and > > > > > > > stay with `long`. Note, that a `Processor` would use the "rea= d-write" > > > > > > > interfaces and thus, we can add the more efficient read metho= ds using > > > > > > > `long` there. > > > > > > >=20 > > > > > > > Does this make sense? > > > > > > >=20 > > > > > > >=20 > > > > > > > -Matthias > > > > > > >=20 > > > > > > > On 9/11/18 12:20 AM, Nikolay Izhikov wrote: > > > > > > > > Hello, Guozhang, Bill. > > > > > > > >=20 > > > > > > > > > 1) I'd suggest keeping `Punctuator#punctuate(long timesta= mp)` as is > > > > > > > >=20 > > > > > > > > I am agree with you. > > > > > > > > Currently, `Punctuator` edits are not included in KIP. > > > > > > > >=20 > > > > > > > > > 2) I'm fine with keeping KeyValueStore extending > > > > > >=20 > > > > > > ReadOnlyKeyValueStore > > > > > > > >=20 > > > > > > > > Great, currently, there is no suggested API change in `KeyV= alueStore` > > > > > >=20 > > > > > > or `ReadOnlyKeyValueStore`. > > > > > > > >=20 > > > > > > > > Seems, you agree with all KIP details. > > > > > > > > Can you vote, please? [1] > > > > > > > >=20 > > > > > > > > [1] > > > > > >=20 > > > > > > https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac7= 90b6a0de7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E > > > > > > > >=20 > > > > > > > >=20 > > > > > > > > =D0=92 =D0=9F=D0=BD, 10/09/2018 =D0=B2 19:49 -0400, Bill Be= jeck =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > Hi Nikolay, > > > > > > > > >=20 > > > > > > > > > I'm a +1 to points 1 and 2 above from Guozhang. > > > > > > > > >=20 > > > > > > > > > Thanks, > > > > > > > > > Bill > > > > > > > > >=20 > > > > > > > > > On Mon, Sep 10, 2018 at 6:58 PM Guozhang Wang > > > > > >=20 > > > > > > wrote: > > > > > > > > >=20 > > > > > > > > > > Hello Nikolay, > > > > > > > > > >=20 > > > > > > > > > > Thanks for picking this up! Just sharing my two cents: > > > > > > > > > >=20 > > > > > > > > > > 1) I'd suggest keeping `Punctuator#punctuate(long times= tamp)` as > > > > > >=20 > > > > > > is since > > > > > > > > > > comparing with other places where we are replacing with= Duration > > > > > >=20 > > > > > > and > > > > > > > > > > Instant, this is not a user specified value as part of = the DSL but > > > > > >=20 > > > > > > rather a > > > > > > > > > > passed-in parameter, plus with high punctuation frequen= cy creating > > > > > >=20 > > > > > > a new > > > > > > > > > > instance of Instant may be costly. > > > > > > > > > >=20 > > > > > > > > > > 2) I'm fine with keeping KeyValueStore extending > > > > > >=20 > > > > > > ReadOnlyKeyValueStore with > > > > > > > > > > APIs of `long` as well as inheriting APIs of `Duration`= . > > > > > > > > > >=20 > > > > > > > > > >=20 > > > > > > > > > > Guozhang > > > > > > > > > >=20 > > > > > > > > > >=20 > > > > > > > > > > On Mon, Sep 10, 2018 at 11:11 AM, Nikolay Izhikov < > > > > > >=20 > > > > > > nizhikov@apache.org> > > > > > > > > > > wrote: > > > > > > > > > >=20 > > > > > > > > > > > Hello, Matthias. > > > > > > > > > > >=20 > > > > > > > > > > > > (4) While I agree that we might want to deprecate i= t, I am not > > > > > >=20 > > > > > > sure if > > > > > > > > > > >=20 > > > > > > > > > > > this should be part of this KIP? > > > > > > > > > > > > Seems to be unrelated? > > > > > > > > > > > > Should this have been part of KIP-319? > > > > > > > > > > > > If yes, we might still want to updated this other K= IP? WDYT? > > > > > > > > > > >=20 > > > > > > > > > > > OK, I removed this deprecation from this KIP. > > > > > > > > > > >=20 > > > > > > > > > > > Please, tell me, is there anything else that should b= e improved > > > > > >=20 > > > > > > to make > > > > > > > > > > > this KIP ready to be implemented. > > > > > > > > > > >=20 > > > > > > > > > > > =D0=92 =D0=9F=D1=82, 07/09/2018 =D0=B2 17:06 -0700, M= atthias J. Sax =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > (1) Sounds good to me, to just use IllegalArgumentE= xception > > > > > >=20 > > > > > > for both -- > > > > > > > > > > > > and thanks for pointing out that Duration can be ne= gative and > > > > > >=20 > > > > > > we need > > > > > > > > > >=20 > > > > > > > > > > to > > > > > > > > > > > > check for this. For the KIP, it would be nice to ad= d to all > > > > > >=20 > > > > > > methods > > > > > > > > > >=20 > > > > > > > > > > than > > > > > > > > > > > > (even if we don't do it in the code but only docume= nt in > > > > > >=20 > > > > > > JavaDocs). > > > > > > > > > > > >=20 > > > > > > > > > > > > (2) I would argue for a new single method interface= . Not sure > > > > > >=20 > > > > > > about the > > > > > > > > > > > > name though. > > > > > > > > > > > >=20 > > > > > > > > > > > > (3) Even if `#fetch(K, K, long, long)` and `#fetchA= ll(long, > > > > > >=20 > > > > > > long)` is > > > > > > > > > > > > _currently_ not used internally, I would still argu= e they are > > > > > >=20 > > > > > > both dual > > > > > > > > > > > > use -- we might all a new DSL operator at any point= that uses > > > > > >=20 > > > > > > those > > > > > > > > > > > > methods. Thus to be "future prove" I would consider= them dual > > > > > >=20 > > > > > > use. > > > > > > > > > > > >=20 > > > > > > > > > > > > > Since the ReadOnlyWindowStore is only used by IQ, > > > > > > > > > > > >=20 > > > > > > > > > > > > This contradicts your other statement: > > > > > > > > > > > >=20 > > > > > > > > > > > > > org.apache.kafka.streams.state.ReadOnlyWindowStor= e#fetch(K, > > > > > >=20 > > > > > > long) is > > > > > > > > > > >=20 > > > > > > > > > > > used > > > > > > > > > > > > > in KStreamWindowAggregate. > > > > > > > > > > > >=20 > > > > > > > > > > > > Or do you suggest to move `fetch(K, long)` from > > > > > >=20 > > > > > > `ReadOnlyWindowStore` > > > > > > > > > >=20 > > > > > > > > > > to > > > > > > > > > > > > `WindowStore` ? This would not make sense IMHO, as > > > > > >=20 > > > > > > `WindowStore extends > > > > > > > > > > > > ReadOnlyWindowStore` and thus, we would loose this = method for > > > > > >=20 > > > > > > IQ. > > > > > > > > > > > >=20 > > > > > > > > > > > >=20 > > > > > > > > > > > > (4) While I agree that we might want to deprecate i= t, I am not > > > > > >=20 > > > > > > sure if > > > > > > > > > > > > this should be part of this KIP? Seems to be unrela= ted? Should > > > > > >=20 > > > > > > this > > > > > > > > > >=20 > > > > > > > > > > have > > > > > > > > > > > > been part of KIP-319? If yes, we might still want t= o updated > > > > > >=20 > > > > > > this other > > > > > > > > > > > > KIP? WDYT? > > > > > > > > > > > >=20 > > > > > > > > > > > >=20 > > > > > > > > > > > > -Matthias > > > > > > > > > > > >=20 > > > > > > > > > > > >=20 > > > > > > > > > > > > On 9/7/18 12:09 PM, John Roesler wrote: > > > > > > > > > > > > > Hey all, > > > > > > > > > > > > >=20 > > > > > > > > > > > > > (1): Duration can be negative, just like long. We= need to > > > > > >=20 > > > > > > enforce any > > > > > > > > > > > > > bounds that we currently enforce. We don't need t= he `throws` > > > > > > > > > > >=20 > > > > > > > > > > > declaration > > > > > > > > > > > > > for runtime exceptions, but the potential > > > > > >=20 > > > > > > IllegalArgumentException > > > > > > > > > > >=20 > > > > > > > > > > > should > > > > > > > > > > > > > be documented in the javadoc for these methods. I= still feel > > > > > >=20 > > > > > > that > > > > > > > > > > >=20 > > > > > > > > > > > surfacing > > > > > > > > > > > > > the ArithmeticException directly would not be a g= reat > > > > > >=20 > > > > > > experience, so > > > > > > > > > >=20 > > > > > > > > > > I > > > > > > > > > > > > > still advocate for wrapping it in an > > > > > >=20 > > > > > > IllegalArgumentException that > > > > > > > > > > >=20 > > > > > > > > > > > explains > > > > > > > > > > > > > our upper bound for Duration is "max-long number = of > > > > > >=20 > > > > > > milliseconds" > > > > > > > > > > > > >=20 > > > > > > > > > > > > > (2): I agree with your performance intuition. I d= on't think > > > > > >=20 > > > > > > creating > > > > > > > > > > >=20 > > > > > > > > > > > one > > > > > > > > > > > > > object per call to punctuate is going to substant= ially > > > > > >=20 > > > > > > affect the > > > > > > > > > > > > > performance. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > I think the deeper problem with Punctuator is tha= t it's > > > > > >=20 > > > > > > currently a > > > > > > > > > >=20 > > > > > > > > > > SAM > > > > > > > > > > > > > interface. If we add a new method to it, we break= the source > > > > > >=20 > > > > > > code of > > > > > > > > > > >=20 > > > > > > > > > > > anyone > > > > > > > > > > > > > passing a function. We can add the new method wit= h a default > > > > > > > > > > > > > implementation, as Nikolay suggested, but then yo= u get into > > > > > >=20 > > > > > > figuring > > > > > > > > > > >=20 > > > > > > > > > > > out > > > > > > > > > > > > > which one to default, and no one's happy. Alterna= tively, we > > > > > >=20 > > > > > > can just > > > > > > > > > > >=20 > > > > > > > > > > > make a > > > > > > > > > > > > > brand new interface that is still a single method= (but an > > > > > >=20 > > > > > > Instant) > > > > > > > > > >=20 > > > > > > > > > > and > > > > > > > > > > > add > > > > > > > > > > > > > the appropriate overloads and deprecate the old o= nes. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > (3): I disagree. I think only two methods are dua= l use, and > > > > > >=20 > > > > > > we should > > > > > > > > > > > > > separate the internal from external usages. The i= nternal > > > > > >=20 > > > > > > usage should > > > > > > > > > > >=20 > > > > > > > > > > > be > > > > > > > > > > > > > added to WindowStore. > > > > > > > > > > > > > org.apache.kafka.streams.state.ReadOnlyWindowStor= e#fetch(K, > > > > > >=20 > > > > > > long) is > > > > > > > > > > >=20 > > > > > > > > > > > used > > > > > > > > > > > > > in KStreamWindowAggregate. > > > > > > > > > > > > > org.apache.kafka.streams.state.ReadOnlyWindowStor= e#fetch(K, > > > > > >=20 > > > > > > long, > > > > > > > > > > >=20 > > > > > > > > > > > long) is > > > > > > > > > > > > > used in KStreamKStreamJoin. > > > > > > > > > > > > > Both of these usages are as WindowStore, so addin= g these > > > > > >=20 > > > > > > interfaces > > > > > > > > > >=20 > > > > > > > > > > to > > > > > > > > > > > > > WindowStore would be transparent. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > org.apache.kafka.streams.state.ReadOnlyWindowStor= e#fetch(K, > > > > > >=20 > > > > > > K, long, > > > > > > > > > > >=20 > > > > > > > > > > > long) > > > > > > > > > > > > > is only used for IQ > > > > > > > > > > > > >=20 > > > > > >=20 > > > > > > org.apache.kafka.streams.state.ReadOnlyWindowStore#fetchAll(lon= g, > > > > > > > > > > >=20 > > > > > > > > > > > long) is > > > > > > > > > > > > > only used for IQ > > > > > > > > > > > > >=20 > > > > > > > > > > > > > Since the ReadOnlyWindowStore is only used by IQ,= we can > > > > > >=20 > > > > > > safely say > > > > > > > > > > >=20 > > > > > > > > > > > that > > > > > > > > > > > > > *all* of its methods are external use and can be = deprecated > > > > > >=20 > > > > > > and > > > > > > > > > > >=20 > > > > > > > > > > > replaced. > > > > > > > > > > > > > The first two usages I noted are WindowStore usag= es, not > > > > > > > > > > > > > ReadOnlyWindowStores, and WindowStore is only use= d > > > > > >=20 > > > > > > *internally*, so > > > > > > > > > > >=20 > > > > > > > > > > > it's > > > > > > > > > > > > > free to offer `long` methods if needed for perfor= mance > > > > > >=20 > > > > > > reasons. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > Does this make sense? The same reasoning extends = to the > > > > > >=20 > > > > > > other stores. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > (4) Yes, that was my suggestion. I'm not sure if = anyone is > > > > > >=20 > > > > > > actually > > > > > > > > > > >=20 > > > > > > > > > > > using > > > > > > > > > > > > > this variant, so it seemed like a good time to ju= st > > > > > >=20 > > > > > > deprecate it and > > > > > > > > > > >=20 > > > > > > > > > > > see. > > > > > > > > > > > > >=20 > > > > > > > > > > > > > Thoughts? > > > > > > > > > > > > > -John > > > > > > > > > > > > >=20 > > > > > > > > > > > > >=20 > > > > > > > > > > > > > On Fri, Sep 7, 2018 at 10:21 AM Nikolay Izhikov < > > > > > >=20 > > > > > > nizhikov@apache.org > > > > > > > > > > >=20 > > > > > > > > > > > wrote: > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Hello, Matthias. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Thanks, for feedback. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (1) Some methods declare `throws > > > > > >=20 > > > > > > IllegalArgumentException`, > > > > > > > > > >=20 > > > > > > > > > > others> > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > don't. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `duration.toMillis()` can throw ArithmeticExcep= tion. > > > > > > > > > > > > > > It can happen if overflow occurs during convers= ion. > > > > > > > > > > > > > > Please, see source of jdk method Duration#toMil= lis. > > > > > > > > > > > > > > Task author suggest to wrap it to IllegalArgume= ntException. > > > > > > > > > > > > > > I think we should add `throws IllegalArgumentEx= ception` > > > > > >=20 > > > > > > for all > > > > > > > > > > >=20 > > > > > > > > > > > method > > > > > > > > > > > > > > with Duration parameter. > > > > > > > > > > > > > > (I updated KIP with this throws) > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > What do you think? > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (3) ReadOnlyWindowStore: All three methods ar= e dual use > > > > > >=20 > > > > > > and I > > > > > > > > > > >=20 > > > > > > > > > > > think we > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > should not deprecate them. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > This is my typo, already fixed. > > > > > > > > > > > > > > I propose to add new methods to `ReadOnlyWindow= Store`. > > > > > > > > > > > > > > No methods will become deprecated. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (4) Stores: 3 methods are listed as deprecate= d but only > > > > > >=20 > > > > > > 2 new > > > > > > > > > > >=20 > > > > > > > > > > > methods > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > are added. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > My proposal based on John Roesler mail [1]: > > > > > > > > > > > > > > "10. Stores: I think we can just deprecate with= out > > > > > >=20 > > > > > > replacement the > > > > > > > > > > >=20 > > > > > > > > > > > method > > > > > > > > > > > > > > that takes `segmentInterval`." > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Is it wrong? > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > [1] > > > > > > > > > >=20 > > > > > > > > > > https://www.mail-archive.com/dev@kafka.apache.org/msg91= 348.html > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > =D0=92 =D0=A7=D1=82, 06/09/2018 =D0=B2 21:04 -0= 700, Matthias J. Sax =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > Thanks for updating the KIP! > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > Couple of minor follow ups: > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (1) Some methods declare `throws > > > > > >=20 > > > > > > IllegalArgumentException`, > > > > > > > > > >=20 > > > > > > > > > > others > > > > > > > > > > > > > > > don't. It's runtime exception and thus it's n= ot required > > > > > >=20 > > > > > > to > > > > > > > > > > >=20 > > > > > > > > > > > declare it > > > > > > > > > > > > > > > -- it just looks inconsistent in the KIP and = maybe it's > > > > > > > > > > >=20 > > > > > > > > > > > inconsistent in > > > > > > > > > > > > > > > the code, too. I am not sure if it is possibl= e to > > > > > >=20 > > > > > > provide a > > > > > > > > > > >=20 > > > > > > > > > > > negative > > > > > > > > > > > > > > > Duration? If not, we would not need to check = the > > > > > >=20 > > > > > > provided value > > > > > > > > > > >=20 > > > > > > > > > > > and can > > > > > > > > > > > > > > > remove the declaration. > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (2) About punctuations: I still think, it wou= ld be ok to > > > > > >=20 > > > > > > change > > > > > > > > > >=20 > > > > > > > > > > the > > > > > > > > > > > > > > > callback from `long` to `Instance` -- even if= it is > > > > > >=20 > > > > > > possible to > > > > > > > > > > >=20 > > > > > > > > > > > register > > > > > > > > > > > > > > > a punctuation on a ms-basis, in practice many= people used > > > > > > > > > > >=20 > > > > > > > > > > > schedules in > > > > > > > > > > > > > > > the range of seconds or larger. Thus, I don't= think > > > > > >=20 > > > > > > there will > > > > > > > > > >=20 > > > > > > > > > > be a > > > > > > > > > > > > > > > performance penalty. Of course, we can still = revisit > > > > > >=20 > > > > > > this later, > > > > > > > > > > >=20 > > > > > > > > > > > too. > > > > > > > > > > > > > > > John and Bill, you did not comment on this. W= ould also > > > > > >=20 > > > > > > be good to > > > > > > > > > > >=20 > > > > > > > > > > > get > > > > > > > > > > > > > > > feedback from Guozhang about this. > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (3) ReadOnlyWindowStore: All three methods ar= e dual use > > > > > >=20 > > > > > > and I > > > > > > > > > > >=20 > > > > > > > > > > > think we > > > > > > > > > > > > > > > should not deprecate them. However, we can ad= d the new > > > > > >=20 > > > > > > proposed > > > > > > > > > > >=20 > > > > > > > > > > > methods > > > > > > > > > > > > > > > in parallel -- the names can be the same with= out > > > > > >=20 > > > > > > conflict as the > > > > > > > > > > > > > > > parameter lists are different. (Or did you ju= st forget > > > > > >=20 > > > > > > to remove > > > > > > > > > > >=20 > > > > > > > > > > > the > > > > > > > > > > > > > > > comment line?) > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > (4) Stores: 3 methods are listed as deprecate= d but only > > > > > >=20 > > > > > > 2 new > > > > > > > > > > >=20 > > > > > > > > > > > methods > > > > > > > > > > > > > > > are added. Maybe this was discussed already, = but I can't > > > > > >=20 > > > > > > recall > > > > > > > > > > >=20 > > > > > > > > > > > why? Can > > > > > > > > > > > > > > > you elaborate? Or should this deprecation be = actually be > > > > > >=20 > > > > > > part of > > > > > > > > > > >=20 > > > > > > > > > > > KIP-328 > > > > > > > > > > > > > > > (\cc John)? > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > ps: there are many KIPs in-flight in parallel= , and it > > > > > >=20 > > > > > > takes some > > > > > > > > > > >=20 > > > > > > > > > > > time to > > > > > > > > > > > > > > > get around. Please be patient :) > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > On 9/5/18 12:25 AM, Nikolay Izhikov wrote: > > > > > > > > > > > > > > > > Hello, Guys. > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > I've started a VOTE [1], but seems commiter= s have no > > > > > >=20 > > > > > > chance to > > > > > > > > > > >=20 > > > > > > > > > > > look at > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > KIP for now. > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > Can you tell me, is it OK? > > > > > > > > > > > > > > > > Should I wait for feedback? For how long? > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > Or something in KIP should be improved befo= re voting? > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > [1] > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > >=20 > > > > > > > > > >=20 > > > > > > > > > >=20 > > > > > >=20 > > > > > > https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac7= 90b6 > > > > > > > > > > > a0de7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > =D0=92 =D0=9F=D1=82, 24/08/2018 =D0=B2 10:3= 6 -0700, Matthias J. Sax =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > > > It's tricky... :) > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > Some APIs have "dual use" as I mentioned = in my first > > > > > >=20 > > > > > > reply. I > > > > > > > > > > >=20 > > > > > > > > > > > agree > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > that > > > > > > > > > > > > > > > > > it would be good to avoid abstract class = and use > > > > > >=20 > > > > > > interfaces > > > > > > > > > >=20 > > > > > > > > > > if > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > possible. > > > > > > > > > > > > > > > > > As long as the change is source code comp= atible, it > > > > > >=20 > > > > > > should be > > > > > > > > > > >=20 > > > > > > > > > > > fine > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > IMHO > > > > > > > > > > > > > > > > > -- we need to document binary incompatibi= lity of > > > > > >=20 > > > > > > course. > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > I think it's best, if the KIPs gets updat= e with a > > > > > >=20 > > > > > > proposal on > > > > > > > > > > >=20 > > > > > > > > > > > how to > > > > > > > > > > > > > > > > > handle "dual use" parts. It's easier to d= iscuss if > > > > > >=20 > > > > > > it's > > > > > > > > > > >=20 > > > > > > > > > > > written down > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > IMHO. > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > For `ProcessorContext#schedule()`, you ar= e right > > > > > >=20 > > > > > > John: it's > > > > > > > > > > >=20 > > > > > > > > > > > seems > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > fine > > > > > > > > > > > > > > > > > to use `Duration`, as it won't be called = often > > > > > >=20 > > > > > > (usually only > > > > > > > > > > >=20 > > > > > > > > > > > within > > > > > > > > > > > > > > > > > `Processor#init()`) -- I mixed it up with > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `Punctuator#punctuate(long)`. > > > > > > > > > > > > > > > > > However, thinking about this twice, we mi= ght even > > > > > >=20 > > > > > > want to > > > > > > > > > > >=20 > > > > > > > > > > > update both > > > > > > > > > > > > > > > > > methods. Punctuation callbacks don't happ= en every > > > > > >=20 > > > > > > millisecond > > > > > > > > > > >=20 > > > > > > > > > > > and > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > thus > > > > > > > > > > > > > > > > > the overhead to use `Instance` should not= be a > > > > > >=20 > > > > > > problem. > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > @Nikolay: it seems the KIP does not menti= on > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `Punctuator#punctuate(long)` > > > > > > > > > > > > > > > > > -- should we add it? > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > On 8/24/18 10:11 AM, John Roesler wrote: > > > > > > > > > > > > > > > > > > Quick afterthought: I guess that `Windo= w` is > > > > > >=20 > > > > > > exposed to the > > > > > > > > > > >=20 > > > > > > > > > > > API via > > > > > > > > > > > > > > > > > > `Windowed` keys. I think it would be fi= ne to not > > > > > >=20 > > > > > > deprecate > > > > > > > > > > >=20 > > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `long` start > > > > > > > > > > > > > > > > > > and end, but add `Instant` variants for= people > > > > > >=20 > > > > > > preferring > > > > > > > > > > >=20 > > > > > > > > > > > that > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > interface. > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > On Fri, Aug 24, 2018 at 11:10 AM John R= oesler < > > > > > > > > > > >=20 > > > > > > > > > > > john@confluent.io> > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > Hey Matthias, > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > Thanks for pointing that out. I agree= that we > > > > > >=20 > > > > > > only really > > > > > > > > > > >=20 > > > > > > > > > > > need > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > to change > > > > > > > > > > > > > > > > > > > methods that are API-facing, and we p= robably > > > > > >=20 > > > > > > want to > > > > > > > > > >=20 > > > > > > > > > > avoid > > > > > > > > > > > using > > > > > > > > > > > > > > > > > > > Duration/Instant for Streams-facing m= embers. > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > Like I said in my last email, I think= the whole > > > > > >=20 > > > > > > Windows > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > interface is > > > > > > > > > > > > > > > > > > > Streams-facing, and the builders we p= rovide are > > > > > >=20 > > > > > > otherwise > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > API-facing. > > > > > > > > > > > > > > > > > > > Likewise, `Window` is Streams-facing,= so start > > > > > >=20 > > > > > > and end > > > > > > > > > > >=20 > > > > > > > > > > > should > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > not use > > > > > > > > > > > > > > > > > > > Duration. In SessionWindows, inactivi= tyGap is > > > > > > > > > > >=20 > > > > > > > > > > > Streams-facing. > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > I actually think that > > > > > >=20 > > > > > > ProcessorContext#schedule() is > > > > > > > > > > >=20 > > > > > > > > > > > API-facing, > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > so it > > > > > > > > > > > > > > > > > > > should use Duration. The rationale is= that > > > > > >=20 > > > > > > streams > > > > > > > > > > >=20 > > > > > > > > > > > processing > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > doesn't call > > > > > > > > > > > > > > > > > > > this method, only implementer of Proc= essor do. > > > > > >=20 > > > > > > Does that > > > > > > > > > > >=20 > > > > > > > > > > > seem > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > right? > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > Also, it seems like ReadOnlyWindowSt= ore#fetch() > > > > > >=20 > > > > > > (2x) and > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > #fetchAll() are > > > > > > > > > > > > > > > > > > > API-facing (for IQ). When we call fet= ch() during > > > > > > > > > > >=20 > > > > > > > > > > > processing, > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > it's actually > > > > > > > > > > > > > > > > > > > `WindowStore#fetch()`. Maybe we shoul= d move > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > "WindowStoreIterator fetch(K > > > > > > > > > > > > > > > > > > > key, long timeFrom, long timeTo)" to = the > > > > > >=20 > > > > > > WindowStore > > > > > > > > > > >=20 > > > > > > > > > > > interface > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > and make > > > > > > > > > > > > > > > > > > > all the ReadOnlyWindowStore methods t= ake > > > > > >=20 > > > > > > Durations. And > > > > > > > > > > >=20 > > > > > > > > > > > likewise > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > with the > > > > > > > > > > > > > > > > > > > SessionStore interfaces. > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > What do you think? > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > On Fri, Aug 24, 2018 at 10:51 AM John= Roesler < > > > > > > > > > > >=20 > > > > > > > > > > > john@confluent.io> > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > Hi Nikolay, > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > First: I wanted to let you know tha= t we have > > > > > >=20 > > > > > > dropped > > > > > > > > > >=20 > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `grace(long)` > > > > > > > > > > > > > > > > > > > > method from the Windows interface, = but we do > > > > > >=20 > > > > > > still need > > > > > > > > > > >=20 > > > > > > > > > > > to > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > transition the > > > > > > > > > > > > > > > > > > > > same method on TimeWindows and Join= Windows ( > > > > > > > > > > > > > > > > > > > > https://github.com/apache/kafka/pul= l/5536) > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > I have also been thinking it would = be nice to > > > > > >=20 > > > > > > replace > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `Windows` with an > > > > > > > > > > > > > > > > > > > > interface, but for different reason= s. I think > > > > > >=20 > > > > > > we can > > > > > > > > > > >=20 > > > > > > > > > > > even do > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > it without > > > > > > > > > > > > > > > > > > > > breaking source compatibility (but = it would > > > > > >=20 > > > > > > break > > > > > > > > > >=20 > > > > > > > > > > binary > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > compatibility): > > > > > > > > > > > > > > > > > > > > create a new interface `WindowSpec`= , deprecate > > > > > > > > > >=20 > > > > > > > > > > `Windows` > > > > > > > > > > > and > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > make it > > > > > > > > > > > > > > > > > > > > implement `WindowSpec`, add a new m= ethod: > > > > > > > > > > > > > > > > > > > > `KGroupedStream#windowedBy(WindowSp= ec)`, and > > > > > >=20 > > > > > > deprecate > > > > > > > > > > >=20 > > > > > > > > > > > the old > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > one. > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > However, I don't think this would s= olve your > > > > > >=20 > > > > > > problem, > > > > > > > > > > >=20 > > > > > > > > > > > since > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > the Windows > > > > > > > > > > > > > > > > > > > > interface has two audiences: the DS= L user and > > > > > >=20 > > > > > > the > > > > > > > > > > >=20 > > > > > > > > > > > implementer > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > who wishes to > > > > > > > > > > > > > > > > > > > > provide a new kind of windowing. I = think we > > > > > >=20 > > > > > > want to > > > > > > > > > > >=20 > > > > > > > > > > > provide > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Duration to the > > > > > > > > > > > > > > > > > > > > former, and long or Duration is fin= e for the > > > > > >=20 > > > > > > latter. > > > > > > > > > > >=20 > > > > > > > > > > > However, > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > both of these > > > > > > > > > > > > > > > > > > > > audiences are "external", so having= an > > > > > >=20 > > > > > > "internal" > > > > > > > > > > >=20 > > > > > > > > > > > interface > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > won't fit the > > > > > > > > > > > > > > > > > > > > bill. > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > I think my last PR #5536 actually h= elps the > > > > > >=20 > > > > > > situation > > > > > > > > > > >=20 > > > > > > > > > > > quite a > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > bit. Let's > > > > > > > > > > > > > > > > > > > > forget about the deprecated members= . Now, all > > > > > >=20 > > > > > > the > > > > > > > > > >=20 > > > > > > > > > > public > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > members of Windows > > > > > > > > > > > > > > > > > > > > are abstract methods, so Windows is > > > > > >=20 > > > > > > effectively an > > > > > > > > > > >=20 > > > > > > > > > > > interface > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > now. Here's > > > > > > > > > > > > > > > > > > > > how it looks: > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > public abstract class Windows > > > > >=20 > > > > > > Window> { > > > > > > > > > > > > > > > > > > > > public abstract Map window= sFor(final > > > > > >=20 > > > > > > long > > > > > > > > > > >=20 > > > > > > > > > > > timestamp); > > > > > > > > > > > > > > > > > > > > public abstract long size(); > > > > > > > > > > > > > > > > > > > > public abstract long gracePeriodMs(= ); > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > Notice that there is no part of thi= s involved > > > > > >=20 > > > > > > with the > > > > > > > > > > >=20 > > > > > > > > > > > DSL. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > When you're > > > > > > > > > > > > > > > > > > > > writing a topology, you don't call = any of these > > > > > > > > > >=20 > > > > > > > > > > methods. > > > > > > > > > > > It's > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > strictly an > > > > > > > > > > > > > > > > > > > > interface that tells a Windows impl= ementation > > > > > >=20 > > > > > > what > > > > > > > > > > >=20 > > > > > > > > > > > Streams > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > expects from it. > > > > > > > > > > > > > > > > > > > > A very simple implementation could = have no > > > > > >=20 > > > > > > builder > > > > > > > > > > >=20 > > > > > > > > > > > methods at > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > all and just > > > > > > > > > > > > > > > > > > > > return fixed answers to these metho= d calls > > > > > >=20 > > > > > > (this is > > > > > > > > > > >=20 > > > > > > > > > > > basically > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > what > > > > > > > > > > > > > > > > > > > > UnlimitedWindows does). It seems li= ke, if we > > > > > >=20 > > > > > > want to > > > > > > > > > >=20 > > > > > > > > > > use > > > > > > > > > > > long > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > millis > > > > > > > > > > > > > > > > > > > > internally, then we just need to le= ave Windows > > > > > >=20 > > > > > > alone. > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > What we do want to change is the bu= ilder > > > > > >=20 > > > > > > methods in > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > TimeWindows, > > > > > > > > > > > > > > > > > > > > JoinWindows, and UnlimitedWindows. = For example, > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > `TimeWindows#of(long)` > > > > > > > > > > > > > > > > > > > > would become `TimeWindows#of(Durati= on)`, etc. > > > > > >=20 > > > > > > These are > > > > > > > > > > >=20 > > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > DSL methods. > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > Does that make sense? > > > > > > > > > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > On Thu, Aug 23, 2018 at 8:59 AM Nik= olay > > > > > >=20 > > > > > > Izhikov < > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > nizhikov@apache.org> > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > Hello, Mathias. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > Thanks for your feedback. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > Thus, it might make sense to ke= ep old and > > > > > >=20 > > > > > > just add > > > > > > > > > > >=20 > > > > > > > > > > > new > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > ones? > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > As far as I understand, we will k= eep old > > > > > >=20 > > > > > > methods > > > > > > > > > > >=20 > > > > > > > > > > > anyway to > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > prevent > > > > > > > > > > > > > > > > > > > > > public API backward compatibility= . > > > > > > > > > > > > > > > > > > > > > I agree with you, methods that us= ed > > > > > >=20 > > > > > > internally > > > > > > > > > > >=20 > > > > > > > > > > > shouldn't be > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > deprecated. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > End users can use the "nicer" n= ew ones, > > > > > >=20 > > > > > > while we > > > > > > > > > >=20 > > > > > > > > > > can > > > > > > > > > > > still > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > use the > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > existing ones internally? > > > > > > > > > > > > > > > > > > > > > > Not sure if it would be possibl= e to keep > > > > > >=20 > > > > > > the old > > > > > > > > > >=20 > > > > > > > > > > ones > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > without exposing > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > them as public API? > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > I think, when we decide to remove= methods > > > > > >=20 > > > > > > with `long` > > > > > > > > > > >=20 > > > > > > > > > > > from > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > public API, > > > > > > > > > > > > > > > > > > > > > we can do the following: > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > 1. Create an interface like > > > > > >=20 > > > > > > `WindowsInternal`. > > > > > > > > > > > > > > > > > > > > > 2. Change Windows to an interface= . > > > > > > > > > > > > > > > > > > > > > 3. Create package-private impleme= ntation > > > > > > > > > >=20 > > > > > > > > > > `WindowsImpl`. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > ``` > > > > > > > > > > > > > > > > > > > > > package org.apache.kafka.= streams. > > > > > > > > > > >=20 > > > > > > > > > > > kstream.internals; > > > > > > > > > > > > > > > > > > > > > public interface WindowsI= nternal { > > > > > > > > > > > > > > > > > > > > > public long start= (); > > > > > > > > > > > > > > > > > > > > > public long end()= ; > > > > > > > > > > > > > > > > > > > > > //etc... > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > package > > > > > >=20 > > > > > > org.apache.kafka.streams.kstream; > > > > > > > > > > > > > > > > > > > > > public interface Windows<= W extends > > > > > >=20 > > > > > > Window> { > > > > > > > > > > > > > > > > > > > > > public Instant st= art(); > > > > > > > > > > > > > > > > > > > > > public Instant en= d(); > > > > > > > > > > > > > > > > > > > > > //... > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > class WindowsImpl > > > > > > > > > >=20 > > > > > > > > > > implements > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Windows, > > > > > > > > > > > > > > > > > > > > > WindowsInternal { > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > ``` > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > So, in public API we will expose = only > > > > > >=20 > > > > > > `Windows` > > > > > > > > > > >=20 > > > > > > > > > > > interface > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > and internally > > > > > > > > > > > > > > > > > > > > > we can use `WindowsInternal` > > > > > > > > > > > > > > > > > > > > > But, of course, this will be huge= changes in > > > > > >=20 > > > > > > public > > > > > > > > > > >=20 > > > > > > > > > > > API. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > Let me know what you think abou= t this. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > I think in this KIP we shouldn't = deprecate > > > > > >=20 > > > > > > methods, > > > > > > > > > > >=20 > > > > > > > > > > > that are > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > used > > > > > > > > > > > > > > > > > > > > > internally. > > > > > > > > > > > > > > > > > > > > > I changed it, now my proposal is = just add new > > > > > > > > > >=20 > > > > > > > > > > methods. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > Please, let me know if anything m= ore need to > > > > > >=20 > > > > > > be done. > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > =D0=92 =D0=A1=D1=80, 22/08/2018 = =D0=B2 17:29 -0700, Matthias J. > > > > > >=20 > > > > > > Sax > > > > > > > > > >=20 > > > > > > > > > > =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > > > > > > > > Thanks a lot for the KIP. > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > From my understanding, the idea= of the KIP > > > > > >=20 > > > > > > is to > > > > > > > > > > >=20 > > > > > > > > > > > improve > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > the public API > > > > > > > > > > > > > > > > > > > > > > at DSL level. However, not all = public > > > > > >=20 > > > > > > methods > > > > > > > > > >=20 > > > > > > > > > > listed > > > > > > > > > > > are > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > part of DSL > > > > > > > > > > > > > > > > > > > > > > level API, but part of runtime = API. Those > > > > > >=20 > > > > > > methods > > > > > > > > > >=20 > > > > > > > > > > are > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > called during > > > > > > > > > > > > > > > > > > > > > > processing and are on the hot c= ode path. I > > > > > >=20 > > > > > > am not > > > > > > > > > > >=20 > > > > > > > > > > > sure, if > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > we want to > > > > > > > > > > > > > > > > > > > > > > update those methods. We should= carefully > > > > > >=20 > > > > > > think > > > > > > > > > >=20 > > > > > > > > > > about > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > this, and > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > consider > > > > > > > > > > > > > > > > > > > > > > to keep Long/long type to keep = runtime > > > > > >=20 > > > > > > overhead > > > > > > > > > > >=20 > > > > > > > > > > > small. > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Note, that the > > > > > > > > > > > > > > > > > > > > > > methods I mention are not requi= red to > > > > > >=20 > > > > > > specify a > > > > > > > > > > >=20 > > > > > > > > > > > program > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > using the DSL > > > > > > > > > > > > > > > > > > > > > > and thus is questionable if the= DSL API > > > > > >=20 > > > > > > would be > > > > > > > > > > >=20 > > > > > > > > > > > improved > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > if we change > > > > > > > > > > > > > > > > > > > > > > the methods. > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > It's unfortunate, that some par= t of the > > > > > >=20 > > > > > > public API > > > > > > > > > > >=20 > > > > > > > > > > > stretch > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > the DSL > > > > > > > > > > > > > > > > > > > > > > builder part as well as the run= time part... > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > This affects the following meth= ods (please > > > > > >=20 > > > > > > double > > > > > > > > > > >=20 > > > > > > > > > > > check if > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > I missed > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > any): > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > - Windows#windowsFor() > > > > > > > > > > > > > > > > > > > > > > - Window#start() > > > > > > > > > > > > > > > > > > > > > > - Window#end() > > > > > > > > > > > > > > > > > > > > > > - JoinWindows#windowFor() > > > > > > > > > > > > > > > > > > > > > > - SessionWindows#inactivitiyGa= p() > > > > > > > > > > > > > > > > > > > > > > - TimeWindows#windowFor() > > > > > > > > > > > > > > > > > > > > > > - UnlimitedWindows#windowFor() > > > > > > > > > > > > > > > > > > > > > > - ProcessorContext#schedule() > > > > > > > > > > > > > > > > > > > > > > - ReadOnlyWindowStore#fetch() = (2x) and > > > > > >=20 > > > > > > #fetchAll() > > > > > > > > > > > > > > > > > > > > > > - SessionStore#findSessions() = (2x) > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > maybe > > > > > > > > > > > > > > > > > > > > > > - > > > > > >=20 > > > > > > TimeWindowedDeserializer#getWindowSize() (it's > > > > > > > > > > >=20 > > > > > > > > > > > unused > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > atm, but I > > > > > > > > > > > > > > > > > > > > > > could imagine that it might be = use on the > > > > > >=20 > > > > > > hot code > > > > > > > > > > >=20 > > > > > > > > > > > path in > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > the furture) > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > So methods have "dual" use and = might be > > > > > >=20 > > > > > > called > > > > > > > > > > >=20 > > > > > > > > > > > externally > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > and > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > internally: > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > - Window#start() > > > > > > > > > > > > > > > > > > > > > > - Window#end() > > > > > > > > > > > > > > > > > > > > > > - ReadOnlyWindowStore#fetch() = (2x) and > > > > > >=20 > > > > > > #fetchAll() > > > > > > > > > > > > > > > > > > > > > > - SessionStore#findSessions() = (2x) > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > Thus, it might make sense to ke= ep old and > > > > > >=20 > > > > > > just add > > > > > > > > > > >=20 > > > > > > > > > > > new > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > ones? End users > > > > > > > > > > > > > > > > > > > > > > can use the "nicer" new ones, w= hile we can > > > > > >=20 > > > > > > still > > > > > > > > > >=20 > > > > > > > > > > use > > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > existing ones > > > > > > > > > > > > > > > > > > > > > > internally? Not sure if it woul= d be > > > > > >=20 > > > > > > possible to > > > > > > > > > >=20 > > > > > > > > > > keep > > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > old ones > > > > > > > > > > > > > > > > > > > > > > without exposing them as public= API? > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > Let me know what you think abou= t this. > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > On 8/21/18 11:41 PM, Nikolay Iz= hikov wrote: > > > > > > > > > > > > > > > > > > > > > > > Dear, commiters. > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > Please, pay attention to this= KIP and > > > > > >=20 > > > > > > share your > > > > > > > > > > >=20 > > > > > > > > > > > opinion. > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > =D0=92 =D0=92=D1=82, 21/08/20= 18 =D0=B2 11:14 -0500, John > > > > > >=20 > > > > > > Roesler > > > > > > > > > >=20 > > > > > > > > > > =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > > > > > > > > > > I'll solicit more reviews. = Let's get > > > > > >=20 > > > > > > at least > > > > > > > > > >=20 > > > > > > > > > > one > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > committer to > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > chime in > > > > > > > > > > > > > > > > > > > > > > > > before we start a vote (sin= ce we need > > > > > >=20 > > > > > > their > > > > > > > > > > >=20 > > > > > > > > > > > approval > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > anyway). > > > > > > > > > > > > > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > On Mon, Aug 20, 2018 at 12:= 39 PM > > > > > >=20 > > > > > > Nikolay > > > > > > > > > >=20 > > > > > > > > > > Izhikov > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > nizhikov@apache.org> > > > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > Hello, Ted. > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > Thanks for the comment. > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > I've edit KIP and change = proposal to > > > > > > > > > > >=20 > > > > > > > > > > > `windowSize`. > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > Guys, any other comments? > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > =D0=92 =D0=92=D1=81, 19/0= 8/2018 =D0=B2 14:57 -0700, Ted > > > > > >=20 > > > > > > Yu =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > > > > > > > > > > > > bq. // or just Duration > > > > > >=20 > > > > > > windowSize(); > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > +1 to the above choice. > > > > > > > > > > > > > > > > > > > > > > > > > > The duration is obvious= from the > > > > > >=20 > > > > > > return > > > > > > > > > > >=20 > > > > > > > > > > > type. For > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > getter > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > methods, we > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > don't > > > > > > > > > > > > > > > > > > > > > > > > > > use get as prefix (as l= east for > > > > > >=20 > > > > > > new code). > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > Cheers > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > On Sun, Aug 19, 2018 at= 8:03 AM > > > > > >=20 > > > > > > Nikolay > > > > > > > > > > >=20 > > > > > > > > > > > Izhikov < > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > nizhikov@apache.org> > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Hello, John. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you very much f= or your > > > > > >=20 > > > > > > feedback! > > > > > > > > > > > > > > > > > > > > > > > > > > > I've addressed all yo= ur comments. > > > > > > > > > > > > > > > > > > > > > > > > > > > Please, see my answer= s and let > > > > > >=20 > > > > > > my know is > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > anything in KIP > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > [1] needs to > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > be > > > > > > > > > > > > > > > > > > > > > > > > > > > improved. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > The correct choice = is actually > > > > > > > > > > >=20 > > > > > > > > > > > "Instant", not> > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > "LocalDateTime" > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > I've changed the meth= ods > > > > > >=20 > > > > > > proposed in KIP > > > > > > > > > > >=20 > > > > > > > > > > > [1] to > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > use Instant. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > I noticed some rece= nt APIs > > > > > >=20 > > > > > > are> missing > > > > > > > > > > >=20 > > > > > > > > > > > (see > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > KIP-328) > > > > > > > > > > > > > > > > > > > > > > > > > > > > those APIs were jus= t added and > > > > > >=20 > > > > > > have > > > > > > > > > > >=20 > > > > > > > > > > > never been > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > released... > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > you can > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > just > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > replace them. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > I've added new method= s to KIP > > > > > >=20 > > > > > > [1]. > > > > > > > > > > > > > > > > > > > > > > > > > > > Not released methods = marked for > > > > > >=20 > > > > > > remove. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > any existing method= that's > > > > > >=20 > > > > > > already > > > > > > > > > > >=20 > > > > > > > > > > > deprecated, > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > don't bother > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > transitioning it to D= uration. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Fixed. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > IllegalArgumentExce= ption... we > > > > > >=20 > > > > > > should > > > > > > > > > > >=20 > > > > > > > > > > > plan to > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > mention this > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > in the > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > javadoc for those met= hods. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Got it. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > In Stores, windowSi= ze and > > > > > > > > > >=20 > > > > > > > > > > segmentInterval > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > should also be > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > durations. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Fixed. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > StreamsMetrics, rec= ordLatency > > > > > >=20 > > > > > > ... this > > > > > > > > > > >=20 > > > > > > > > > > > one is > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > better left > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > alone. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > OK. I removed this me= thod from > > > > > >=20 > > > > > > KIP [1]. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Two more questions qu= estion about > > > > > > > > > > >=20 > > > > > > > > > > > implementation: > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > 1. We have serveral m= ethods > > > > > >=20 > > > > > > without > > > > > > > > > > >=20 > > > > > > > > > > > parameters. > > > > > > > > > > > > > > > > > > > > > > > > > > > In java we can't have= two > > > > > >=20 > > > > > > methods with > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > parameters with the > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > same name. > > > > > > > > > > > > > > > > > > > > > > > > > > > It wouldn't compile. > > > > > > > > > > > > > > > > > > > > > > > > > > > So we have to rename = new > > > > > >=20 > > > > > > methods. Please, > > > > > > > > > > >=20 > > > > > > > > > > > see > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > suggested > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > names and share > > > > > > > > > > > > > > > > > > > > > > > > > > > your thoughts: > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Windows { > > > > > > > > > > > > > > > > > > > > > > > > > > > long size() -> Du= ration > > > > > >=20 > > > > > > windowSize(); > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > Window { > > > > > > > > > > > > > > > > > > > > > > > > > > > long start() -> I= nstant > > > > > >=20 > > > > > > startTime(); > > > > > > > > > > > > > > > > > > > > > > > > > > > long end() -> Ins= tant > > > > > >=20 > > > > > > endTime(); > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > SessionWindows { > > > > > > > > > > > > > > > > > > > > > > > > > > > long inactivityGa= p() -> > > > > > >=20 > > > > > > Duration > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > inactivityGapDuration(); > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > TimeWindowedDeseriali= zer { > > > > > > > > > > > > > > > > > > > > > > > > > > > Long getWindowSiz= e() -> > > > > > >=20 > > > > > > Duration > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > getWindowSizeDuration(); // or > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > just > > > > > > > > > > > > > > > > > > > > > > > > > > > Duration windowSize()= ; > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > SessionBytesStoreSupp= lier { > > > > > > > > > > > > > > > > > > > > > > > > > > > long retentionPer= iod() -> > > > > > >=20 > > > > > > Duration > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > retentionPeriodDuration(); > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > WindowBytesStoreSuppl= ier { > > > > > > > > > > > > > > > > > > > > > > > > > > > long windowSize()= -> Duration > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > windowSizeDuration(); > > > > > > > > > > > > > > > > > > > > > > > > > > > long retentionPer= iod() -> > > > > > >=20 > > > > > > Duration > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > retentionPeriodDuration(); > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > 2. Do we want to use = Duration > > > > > >=20 > > > > > > and Instant > > > > > > > > > > >=20 > > > > > > > > > > > inside > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > API > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > implementations? > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > IGNITE-7277: "Duratio= ns > > > > > >=20 > > > > > > potentially > > > > > > > > > >=20 > > > > > > > > > > worsen > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > memory pressure > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > and gc > > > > > > > > > > > > > > > > > > > > > > > > > > > performance, so inter= nally, we > > > > > >=20 > > > > > > will still > > > > > > > > > > >=20 > > > > > > > > > > > use > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > longMs as the > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > representation." > > > > > > > > > > > > > > > > > > > > > > > > > > > IGNITE-7222: Duration= used to > > > > > >=20 > > > > > > store > > > > > > > > > > >=20 > > > > > > > > > > > retention. > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > [1] > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAF= KA/KIP- > > > > > > > > > > >=20 > > > > > > > > > > > 358%3A+Migrate+Streams+API+to+Duration+instead+of+lon= g+ms+times > > > > > > > > > > > > > > > > > > > > > > > > > > > [2] > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > https://github.com/apache/kafka/commit/ > > > > > > > > > > >=20 > > > > > > > > > > > b3771ba22acad7870e38ff7f58820c5b50946787#diff- > > > > > > > > > > > 47289575d3e3e2449f27b3a7b6788e1aR64 > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > =D0=92 =D0=9F=D1=82, = 17/08/2018 =D0=B2 14:46 -0500, > > > > > >=20 > > > > > > John > > > > > > > > > > >=20 > > > > > > > > > > > Roesler > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi Nikolay, > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks for this ver= y nice KIP! > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > To answer your ques= tions: > > > > > > > > > > > > > > > > > > > > > > > > > > > > 1. Correct, we shou= ld not > > > > > >=20 > > > > > > delete > > > > > > > > > >=20 > > > > > > > > > > existing > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > methods that > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > have been > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > released, > > > > > > > > > > > > > > > > > > > > > > > > > > > > but ... > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > 2. Yes, we should d= eprecate > > > > > >=20 > > > > > > the 'long' > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > variants so that we > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > can drop > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > them > > > > > > > > > > > > > > > > > > > > > > > > > > > > later on. Personall= y, I like > > > > > >=20 > > > > > > to mention > > > > > > > > > > >=20 > > > > > > > > > > > which > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > version > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > deprecated the > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > method > > > > > > > > > > > > > > > > > > > > > > > > > > > > so everyone can see= later on > > > > > >=20 > > > > > > how long > > > > > > > > > > >=20 > > > > > > > > > > > it's been > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > deprecated, but this > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > may > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > be > > > > > > > > > > > > > > > > > > > > > > > > > > > > controversial, so l= et's let > > > > > >=20 > > > > > > other weigh > > > > > > > > > > >=20 > > > > > > > > > > > in. > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > 3. I think you're a= sking > > > > > >=20 > > > > > > whether it's > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > appropriate to drop > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > the "Ms" > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > suffix, > > > > > > > > > > > > > > > > > > > > > > > > > > > > and I think yes. So= "long > > > > > > > > > > >=20 > > > > > > > > > > > inactivityGapMs" > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > would become > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > "Duration > > > > > > > > > > > > > > > > > > > > > > > > > > > > inactivityGap". > > > > > > > > > > > > > > > > > > > > > > > > > > > > In the places where= the > > > > > >=20 > > > > > > parameter's > > > > > > > > > >=20 > > > > > > > > > > name > > > > > > > > > > > is > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > just > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > "duration", I think > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > we > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > can > > > > > > > > > > > > > > > > > > > > > > > > > > > > pick something more > > > > > >=20 > > > > > > descriptive (I > > > > > > > > > > >=20 > > > > > > > > > > > realize it > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > was already > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > "durationMs"; > > > > > > > > > > > > > > > > > > > > > > > > > > > > this is just a good= time to > > > > > >=20 > > > > > > improve > > > > > > > > > >=20 > > > > > > > > > > it). > > > > > > > > > > > > > > > > > > > > > > > > > > > > Also, you're correc= t that we > > > > > >=20 > > > > > > shouldn't > > > > > > > > > > >=20 > > > > > > > > > > > use a > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > Duration to > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > represent a > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > moment > > > > > > > > > > > > > > > > > > > > > > > > > > > > in time, like "star= tTime". The > > > > > >=20 > > > > > > correct > > > > > > > > > > >=20 > > > > > > > > > > > choice > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > is actually > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > "Instant", > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > not > > > > > > > > > > > > > > > > > > > > > > > > > > > > "LocalDateTime", th= ough. > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > https://stackoverflow.com/questions/32437550/wh= ats-the- > > > > > > > > > > >=20 > > > > > > > > > > > difference-between-instant-and-localdatetime > > > > > > > > > > > > > > > > > > > > > > > > > > > > explains why. > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > I also had a few no= tes on the > > > > > >=20 > > > > > > KIP > > > > > > > > > >=20 > > > > > > > > > > itself: > > > > > > > > > > > > > > > > > > > > > > > > > > > > 4. You might want t= o pull > > > > > >=20 > > > > > > trunk again. > > > > > > > > > >=20 > > > > > > > > > > I > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > noticed some > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > recent APIs are > > > > > > > > > > > > > > > > > > > > > > > > > > > > missing (see KIP-32= 8). > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > 5. Speaking of KIP-= 328: those > > > > > >=20 > > > > > > APIs were > > > > > > > > > > >=20 > > > > > > > > > > > just > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > added and > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > have never > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > been > > > > > > > > > > > > > > > > > > > > > > > > > > > > released, so there'= s no need to > > > > > > > > > > >=20 > > > > > > > > > > > deprecate the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > methods, you > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > can just > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > replace > > > > > > > > > > > > > > > > > > > > > > > > > > > > them. > > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > > > > > > > > 6. For any existing= method > > > > > >=20 > > > > > > that's > > > > > > > > > >=20 > > > > > > > > > > already > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > deprecated, > > > > > > > > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > > > > > > > > don't bother > > > > > > > > > > > > > > > > > > > > > > > > > > > > transitioning it to= Duration. > > > > > >=20 > > > > > > I think > > > > > > > > > >=20 > > > > > > > > > > the > > > > > > > > > > > > > >=20 > > > > > > > > > > > > > > examples I > > > > > > > > > > > > > > > > > > > > >=20 --=-opPNNRD0mHttIERFeGu2 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEOiTcLcdgyP2exB5ZbiaPbjg91GUFAlueouwACgkQbiaPbjg9 1GUsQQf/e5quIMv/zZbiozMlU7jDHlDwTngAf/BZjp/3uBYl2sdRw8RFKsolYhSY Ij8kYQw9tnBW/F0nOsdECRiqp9/bvSc1/yFu4U0Ac/6MWSbjeQdFhpDg0DSnytY5 bZ1pYPfq6M26DjkiGMKQA1bbo2qAiffSCNf0GCXuJgDB9LstmibgEWTHX+TIUsrR 109RFUzQ52ZcJxsthchQEqXX2xhxq5xmqDzalwhwCsAvUexBY7bLDVnLB2LqU+RY 903tyQiwKZAHIGOg83tOBvzm11yvpVcBksMU7h7XD2Zy0XV+iLDYyz0rpMEWX01M C2ugmPY7mCfbUStAcgBPmUdLaVOr5g== =rZlk -----END PGP SIGNATURE----- --=-opPNNRD0mHttIERFeGu2--