I would have to go looking, but the key concept is that this is a bigger problem.
interval such as the time between retries.... wait as in how long to wait for a response... retry as how many times to retry after a failure attempts as in how many times to do a thing before giving up Set of objects as in the setRetryAttempts code which , will try a number of servers before giving up. where n is the number, -1 equals all, and 0 means (1 server, no retries). On Thu, Aug 31, 2017 at 11:17 AM, Jacob Barrett <jbarr...@pivotal.io> wrote: > Mark, > > Can you give concrete examples in the API? > > On Thu, Aug 31, 2017 at 11:11 AM Mark Hanson <mhan...@pivotal.io> wrote: > > > This basic problem exists with the following cases. > > Interval: to do something at an interval > > Wait: to wait a certain length of time > > Retry: to retry a certain number of times > > Attempts: to make a certain number of attempts (similar to retry) > > Sets of objects: to iterate through an unscoped set of objects. > > > > On Thu, Aug 31, 2017 at 11:04 AM, Jacob Barrett <jbarr...@pivotal.io> > > wrote: > > > > > I should have scoped it to the native API. > > > > > > > On Aug 31, 2017, at 10:30 AM, Bruce Schuchardt < > bschucha...@pivotal.io > > > > > > wrote: > > > > > > > > The DistributedLockService uses -1/0/n > > > > > > > > > > > >> On 8/31/17 10:21 AM, Jacob Barrett wrote: > > > >> In relation to this particular example you provided the discussion > of > > > removing it is valid as an alternative to fixing it. > > > >> > > > >> Are there other examples of this -1/0/n parameter style we should > > > discuss? > > > >> > > > >> -Jake > > > >> > > > >> > > > >> Sent from my iPhone > > > >> > > > >>> On Aug 31, 2017, at 10:15 AM, Mark Hanson <mhan...@pivotal.io> > > wrote: > > > >>> > > > >>> As I understand it here, the question is when the first server is > no > > > longer > > > >>> available, do we retry on another server. I would say the answer is > > > clearly > > > >>> yes and we in the name of controlling load want to have an API that > > > >>> controls the timing of how that is done. The customer can say no > > > retries > > > >>> and they can right their own........ > > > >>> > > > >>> This is a little bit off the topic of the much larger topic though. > > The > > > >>> reason I was told to send this email was to broach the larger > > > discussion of > > > >>> iteration and the overloading to use -1 to mean infinite. At least > > > that is > > > >>> my understanding... > > > >>> > > > >>> > > > >>> On Thu, Aug 31, 2017 at 9:32 AM, Udo Kohlmeyer < > > ukohlme...@pivotal.io> > > > >>> wrote: > > > >>> > > > >>>> +1 to removing retry, > > > >>>> > > > >>>> Imo, the retry should made the responsibility of the submitting > > > >>>> application. When an operation fails, the user should have to > decide > > > if > > > >>>> they should retry or not. It should not be default behavior of a > > > connection > > > >>>> pool. > > > >>>> > > > >>>> --Udo > > > >>>> > > > >>>> > > > >>>> > > > >>>>> On 8/31/17 09:26, Dan Smith wrote: > > > >>>>> > > > >>>>> The java client does still have a retry-attempts setting - it's > > > pretty > > > >>>>> much > > > >>>>> the same as the C++ API. > > > >>>>> > > > >>>>> I agree with Bruce though, I think the current retry behavior is > > not > > > >>>>> ideal. > > > >>>>> I think it only really makes sense for the client to retry an > > > operation > > > >>>>> that it actually sent to the server if the server stops > responding > > to > > > >>>>> pings. The believe the current retry behavior just waits the > > > read-timeout > > > >>>>> and then retries the operation on a new server. > > > >>>>> > > > >>>>> -Dan > > > >>>>> > > > >>>>> On Thu, Aug 31, 2017 at 8:08 AM, Bruce Schuchardt < > > > bschucha...@pivotal.io > > > >>>>> wrote: > > > >>>>> > > > >>>>> Does anyone have a good argument for clients retrying operations? > > I > > > can > > > >>>>>> see doing that if the server has died but otherwise it just > > > overloads the > > > >>>>>> servers. > > > >>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>>> On 8/30/17 8:36 PM, Dan Smith wrote: > > > >>>>>> > > > >>>>>> In general, I think we need making the configuration of geode > less > > > >>>>>>> complex, > > > >>>>>>> not more. > > > >>>>>>> > > > >>>>>>> As far as retry-attempts goes, maybe the best thing to do is to > > > get rid > > > >>>>>>> of > > > >>>>>>> it. The P2P layer has no such concept. I don't think users > should > > > really > > > >>>>>>> have to care about how many servers an operation is attempted > > > against. A > > > >>>>>>> user may want to specify how long an operation is allowed to > > take, > > > but > > > >>>>>>> that > > > >>>>>>> could be better specified with an operation timeout rather than > > the > > > >>>>>>> current > > > >>>>>>> read-timeout + retry-attempts. > > > >>>>>>> > > > >>>>>>> -Dan > > > >>>>>>> > > > >>>>>>> > > > >>>>>>> > > > >>>>>>> On Wed, Aug 30, 2017 at 2:08 PM, Patrick Rhomberg < > > > prhomb...@pivotal.io > > > >>>>>>> wrote: > > > >>>>>>> > > > >>>>>>> Personally, I don't much like sentinel values, even if they > have > > > their > > > >>>>>>> > > > >>>>>>>> occasional use. > > > >>>>>>>> > > > >>>>>>>> Do we need to provide an authentic infinite value? 64-bit > > MAXINT > > > is > > > >>>>>>>> nearly > > > >>>>>>>> 10 quintillion. At 10GHz, that still takes almost three > years. > > > If > > > >>>>>>>> each > > > >>>>>>>> retry takes as much as 10ms, we're still looking at "retry for > > as > > > long > > > >>>>>>>> as > > > >>>>>>>> the earth has existed." 32-bit's is much more attainable, of > > > course, > > > >>>>>>>> but I > > > >>>>>>>> think the point stands -- if you need to retry that much, > > > something > > > >>>>>>>> else > > > >>>>>>>> is > > > >>>>>>>> very wrong. > > > >>>>>>>> > > > >>>>>>>> In the more general sense, I struggle to think of a context > > where > > > an > > > >>>>>>>> authentic infinity is meaningfully distinct in application > from > > a > > > >>>>>>>> massive > > > >>>>>>>> finite like MAXINT. But I could be wrong and would love to > hear > > > what > > > >>>>>>>> other > > > >>>>>>>> people think. > > > >>>>>>>> > > > >>>>>>>> On Wed, Aug 30, 2017 at 1:26 PM, Mark Hanson < > > mhan...@pivotal.io> > > > >>>>>>>> wrote: > > > >>>>>>>> > > > >>>>>>>> Hi All, > > > >>>>>>>> > > > >>>>>>>>> *Question: how should we deal in a very forward and clean > > > fashion with > > > >>>>>>>>> > > > >>>>>>>>> the > > > >>>>>>>> implicit ambiguity of -1 or all, or infinite, or forever?* > > > >>>>>>>>> > > > >>>>>>>>> *Background:* > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> We are looking to get some feedback on the subject of > > > >>>>>>>>> > > > >>>>>>>>> infinite/all/forever > > > >>>>>>>> in the geode/geode-native code. > > > >>>>>>>>> > > > >>>>>>>>> In looking at the code, we see an example function, > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> setRetryAttempts > > > >>>>>>>>> <https://github.com/apache/geode-native/blob/ > > > >>>>>>>>> 006df0e70eeb481ef5e9e821dba0050dee9c6893/cppcache/include/ > > > >>>>>>>>> geode/PoolFactory.hpp#L327>() > > > >>>>>>>>> [1] currently -1 means try all servers before failing. 0 > means > > > try 1 > > > >>>>>>>>> > > > >>>>>>>>> server > > > >>>>>>>> before failing, and a number greater than 0 means try number > of > > > servers > > > >>>>>>>>> +1 > > > >>>>>>>> before failing. In the case of setRetryAttempts, we don’t know > > > how many > > > >>>>>>>>> servers there are. This means that -1 for "All" servers has > no > > > >>>>>>>>> relation > > > >>>>>>>>> > > > >>>>>>>>> to > > > >>>>>>>> the actual number of servers that we have. Perhaps > > > setRetryAttempts > > > >>>>>>>>> could > > > >>>>>>>>> be renamed to setNumberOfAttempts to clarify as well, but the > > > problem > > > >>>>>>>>> > > > >>>>>>>>> still > > > >>>>>>>> stands... > > > >>>>>>>>> > > > >>>>>>>>> *Discussion:* > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> In an attempt to provide the best code possible to the geode > > > >>>>>>>>> community, > > > >>>>>>>>> there has been some discussion of the use of > > > infinite/all/forever as > > > >>>>>>>>> an > > > >>>>>>>>> overload of a count. Often -1 indicates infinite, while 0 > > > indicates > > > >>>>>>>>> > > > >>>>>>>>> never, > > > >>>>>>>> and 1 to MAXINT, inclusive, indicates a count. > > > >>>>>>>>> > > > >>>>>>>>> There are three obvious approaches to solve the problem of > the > > > >>>>>>>>> > > > >>>>>>>>> overloading > > > >>>>>>>> of -1. The first approach is do nothing… Status quo. > > > >>>>>>>>> > > > >>>>>>>>> The second approach to clarify things would be to create an > > > >>>>>>>>> enumeration > > > >>>>>>>>> that would be passed in as well as the number or an object.. > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> struct Retries > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> typedef enum { eINFINITE, eCOUNT, eNONE} eCount; > > > >>>>>>>>> > > > >>>>>>>>> eCount approach; > > > >>>>>>>>> > > > >>>>>>>>> unsigned int count; > > > >>>>>>>>> > > > >>>>>>>>> }; > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> The third approach would be to pass a continue object of some > > > sort > > > >>>>>>>>> such > > > >>>>>>>>> that it tells you if it is ok to continue through the use of > an > > > >>>>>>>>> > > > >>>>>>>>> algorithm. > > > >>>>>>>> An example would be > > > >>>>>>>>> > > > >>>>>>>>> class Continue > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> virtual bool Continue() = 0; > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> class InfiniteContinue : public Continue > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> bool Continue() > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> return true; > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> Continue co = InfiniteContinue; > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> while( co.Continue() ) > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> //do a thing > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> Another example would be a Continue limited to 5 let’s say, > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> class CountContinue : public Continue > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> private: > > > >>>>>>>>> > > > >>>>>>>>> int count; > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> public: > > > >>>>>>>>> > > > >>>>>>>>> CountContinue(int count) > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> this.count = count; > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> bool Continue() > > > >>>>>>>>> > > > >>>>>>>>> { > > > >>>>>>>>> > > > >>>>>>>>> return count— > 0; > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> } > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> In both of these cases what is happening is that the > algorithm > > is > > > >>>>>>>>> being > > > >>>>>>>>> outsourced. > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> *Conclusion:* > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> We are putting this out, to start a discussion on the best > way > > > to move > > > >>>>>>>>> > > > >>>>>>>>> this > > > >>>>>>>> forward… *What do people think? What direction would be the > best > > > going > > > >>>>>>>>> forward?* > > > >>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>>> [1] > > > >>>>>>>>> https://github.com/apache/geode-native/blob/ > > > >>>>>>>>> > > > >>>>>>>>> 006df0e70eeb481ef5e9e821dba005 > > > >>>>>>>> 0dee9c6893/cppcache/include/geode/PoolFactory.hpp#L327 > > > >>>>>>>>> > > > >>>>>>>>> > > > > > > > > > >