You're right, that should be fine. On Jun 30, 2015 4:24 PM, "Abdel Hakim Deneche" <[email protected]> wrote:
> What would be the impact of making buffer() throw an > OutOfMemoryRuntimeException ? we'll need to change a few places where it > really needs to be handled (like in allocateNewSafe()) but other than that, > just letting the unchecked exception propagate should be fine, and Drill > will still display the proper error message. > > Of course if this happens in the RPC layer, we still need to handle it > properly (DRILL-3317 <https://issues.apache.org/jira/browse/DRILL-3317>) > > On Tue, Jun 30, 2015 at 4:12 PM, Hanifi Gunes <[email protected]> wrote: > > > -I like giving the developer the choice of behavior (thus the two > options). > > It sounds like others are saying to remove this choice (because code is > not > > managing it correctly). > > I might be misunderstanding the context above but my understanding is > that > > the discussion is not particularly concerned about VVs nor adding, > removing > > methods to/from them. It is the behavior of Allocator#buffer when we run > > OOM. Current behavior is to return null to communicate this. Given > #buffer > > is used in very few classes, I think we can easily change this for good > > avoiding possible problems to come. > > > > > > - What I'm want to avoid is adding throws OutOfMemoryException in 1000 > > places. > > Agreed. > > > > > > > > On Tue, Jun 30, 2015 at 3:54 PM, Abdel Hakim Deneche < > > [email protected]> > > wrote: > > > > > buffer(int) is mostly called from value vectors, but there are an > > > additional 10+ places where it's being used and most of them don't > bother > > > checking if the returned buffer is null. > > > > > > On Tue, Jun 30, 2015 at 3:39 PM, Jacques Nadeau <[email protected]> > > > wrote: > > > > > > > What is your sense of the use of this interface? I would hope new > uses > > > > would be scarce. Do you think this will be a frequent occurrence that > > > most > > > > devs will experience? > > > > On Jun 30, 2015 3:35 PM, "Abdel Hakim Deneche" < > [email protected]> > > > > wrote: > > > > > > > > > I started this discussion while fixing DRILL-3312 > > > > > <https://issues.apache.org/jira/browse/DRILL-3312>, it took me > quite > > > > some > > > > > time to debug and find the root of an error I was seeing. I first > > > thought > > > > > about fixing those few places that call buffer() without checking > if > > > the > > > > > buffer is null or not, but this won't prevent new code from > repeating > > > the > > > > > same mistakes. > > > > > > > > > > > > > > > On Tue, Jun 30, 2015 at 3:19 PM, Jacques Nadeau < > [email protected]> > > > > > wrote: > > > > > > > > > > > Lots of different comments on this thread. Here are few of my > > > > thoughts: > > > > > > > > > > > > I think you need to differentiate the different tiers of > > interfaces a > > > > > > little bit more. > > > > > > > > > > > > BufferAllocator.buffer() was meant to be a low level advanced > > > > interface. > > > > > > It should be used rarely and when done so, only with extreme > care. > > > > Most > > > > > > devs shouldn't use it. Having an advanced interface seems fine > > here. > > > > > This > > > > > > was how the interface was envisioned. It looks like there are > > > > currently > > > > > > 16 classes that reference this code not including vectors. > (There > > > > > probably > > > > > > should be less, it looks like some code duplication contributes > to > > > > this.) > > > > > > > > > > > > All the vector classes also access this code. Vectors have two > > > > methods: > > > > > > allocateNew and allocateNewSafe. allocateNew has an exception > > > behavior > > > > > and > > > > > > allocateNewSafe has a return value behavior. These are main APIs > > > that > > > > > are > > > > > > used extensively throughout the code and the ones we should be > most > > > > > focused > > > > > > on. I like giving the developer the choice of behavior (thus the > > two > > > > > > options). It sounds like others are saying to remove this choice > > > > > (because > > > > > > code is not managing it correctly). > > > > > > > > > > > > If there are bugs in the 16 classes on how they use the advanced > > > > > interface, > > > > > > this doesn't seem like a big challenge to correct rather than > bulk > > > > > > modifying the API. If people are using the wrong method on the > > > vector > > > > > > classes (or the vector classes aren't correctly behaving), that > > > doesn't > > > > > > seem like something we should address at the allocator API level. > > > > > > > > > > > > Hakim, can you be more specific about your concern? It doesn't > > seem > > > > like > > > > > > we're talking about thousands of places here. > > > > > > > > > > > > Regarding checked versus unchecked... I'm strongly in support of > > > using > > > > > > checked exceptions for most things. However, I'm against it for > an > > > out > > > > > of > > > > > > memory condition. (Note how the JVM also treats this as an > > unchecked > > > > > > exception.) It causes early catching when, in most cases, we > really > > > > want > > > > > to > > > > > > bubble way up the stack and fail the query. I know of very few > > > places > > > > > > where we can actually locally manage an out of memory condition > so > > > why > > > > > > write huge amounts of code the bubble the exception all the way > to > > > > where > > > > > we > > > > > > can actually handle it. > > > > > > > > > > > > A quick sidebar to Jason's "Hash agg out of memory" comment > > > > > > Two thoughts here. I'm not sure this is a meaningful message. > > Where > > > > we > > > > > > run out of memory may have nothing to do with where we are using > > most > > > > > > memory. And if we did to decide this was useful, this can be > done > > > just > > > > > as > > > > > > easily with unchecked exceptions as checked exception. What I'm > > want > > > > to > > > > > > avoid is adding throws OutOfMemoryException in 1000 places. The > > > > reality > > > > > is > > > > > > everybody should assume that an OutOfMemory can occur pretty much > > > > > anytime. > > > > > > > > > > > > TL;DR > > > > > > > > > > > > In general, I think this discussion is too abstract and thus has > > the > > > > > danger > > > > > > of trending towards a religious discussion (I already see a bit > of > > > that > > > > > > fervor in some of the responses.). The number of places we are > > > talking > > > > > > about are not that large and are easy to find. Let's solve this > by > > > > > looking > > > > > > at specifics. For example, if people think checked would be > > better, > > > > > > someone should go through and make an example changeset for > > everyone > > > to > > > > > > review. My guess is, the only that it works will be if very > > quickly, > > > > the > > > > > > handling code converts the checked exception into an unchecked > > > > > > UserException. But I'm more than happy to be proven wrong. > > > > > > > > > > > > On Tue, Jun 30, 2015 at 2:16 PM, Daniel Barclay < > > > [email protected] > > > > > > > > > > > wrote: > > > > > > > > > > > > > Hanifi GUNES wrote: > > > > > > > > > > > > > >> - We would end up having to add it to almost everything > > everywhere > > > > > > >> Why would one propagate the checked exception for no reason? > And > > > why > > > > > > would > > > > > > >> one not propagate the exception for a good reason like > > > robustness? I > > > > > > agree > > > > > > >> that one has to avoid propagating the checked exception for no > > > > reason > > > > > > >> however I support propagating it for a good reason. > > > > > > >> > > > > > > >> The added benefit of raising a checked exception is reminding > as > > > > well > > > > > as > > > > > > >> enforcing devs to handle it and be more cautious about this > > > > particular > > > > > > >> event. I find this compile-time safety check invaluable for > > > > > robustness. > > > > > > >> > > > > > > > > > > > > > > +(1 times <some large number>) > > > > > > > > > > > > > > Daniel > > > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > >> - Or constantly wrapping it with RuntimeException to get > around > > > that > > > > > > >> If it has to be done, I would recommend relying on a helper to > > do > > > > so. > > > > > > >> There > > > > > > >> is not much of man-work involved here. > > > > > > >> > > > > > > >> > > > > > > >> 2015-06-30 13:53 GMT-07:00 Abdel Hakim Deneche < > > > > [email protected] > > > > > >: > > > > > > >> > > > > > > >> +1 to Hanifi's > > > > > > >>> > > > > > > >>> On Tue, Jun 30, 2015 at 1:38 PM, Jason Altekruse < > > > > > > >>> [email protected] > > > > > > >>> > > > > > > >>>> > > > > > > >>>> wrote: > > > > > > >>> > > > > > > >>> +1 to Hanifi's comments, I think it makes much more sense to > > > have > > > > a > > > > > > >>>> > > > > > > >>> number > > > > > > >>> > > > > > > >>>> of sites where the operators are explicitly catching a > checked > > > OOM > > > > > > >>>> exception and either decide to handle it or produce a > message > > > like > > > > > > "Hash > > > > > > >>>> Aggregate does not support our of memory conditions". This > > would > > > > be > > > > > > >>>> particularly useful for debugging queries, as the user > > exception > > > > can > > > > > > >>>> provide context information about the current operation. > This > > > way > > > > > > users > > > > > > >>>> > > > > > > >>> can > > > > > > >>> > > > > > > >>>> have some idea about the part of their query that might be > > > causing > > > > > an > > > > > > >>>> excessive strain on system resources. I understand that > there > > > are > > > > > also > > > > > > >>>> cases where operators competing for memory can make it a > toss > > up > > > > to > > > > > > >>>> which > > > > > > >>>> will actually fail, but this would at least be a step to > give > > > more > > > > > > >>>> > > > > > > >>> detailed > > > > > > >>> > > > > > > >>>> information to users. > > > > > > >>>> > > > > > > >>>> On Tue, Jun 30, 2015 at 1:28 PM, Hanifi GUNES < > [email protected]> > > > > > wrote: > > > > > > >>>> > > > > > > >>>> I would propose throwing a checked exception encouraging > > > explicit > > > > > and > > > > > > >>>>> consistent handling of this event. Each sub-system has > > liberty > > > to > > > > > > >>>>> > > > > > > >>>> decide > > > > > > >>> > > > > > > >>>> if > > > > > > >>>> > > > > > > >>>>> an OOM failure is fatal or non-fatal depending on its > > > > capabilities. > > > > > > >>>>> > > > > > > >>>> Also > > > > > > >>> > > > > > > >>>> if > > > > > > >>>> > > > > > > >>>>> at some point a sub-system needs to communicate with its > > > callers > > > > > via > > > > > > a > > > > > > >>>>> different mechanism such like using flags (boolean, enum > etc) > > > or > > > > > > >>>>> > > > > > > >>>> raising > > > > > > >>> > > > > > > >>>> an > > > > > > >>>> > > > > > > >>>>> unchecked exception that's still fine, just handle the > > > exception. > > > > > If > > > > > > >>>>> > > > > > > >>>> there > > > > > > >>>> > > > > > > >>>>> is a need to suppress the checked exception that's fine > too, > > > just > > > > > > use a > > > > > > >>>>> helper method. > > > > > > >>>>> > > > > > > >>>>> Either way, returning *null* sounds problematic in many > ways > > i) > > > > it > > > > > is > > > > > > >>>>> implicit ii) unsafe iii) its handling logic is repetitive > iv) > > > it > > > > is > > > > > > >>>>> semantically unclean to make null mean something - even > worse > > > > > > something > > > > > > >>>>> context specific. > > > > > > >>>>> > > > > > > >>>>> > > > > > > >>>>> -Hanifi > > > > > > >>>>> > > > > > > >>>>> 2015-06-30 12:23 GMT-07:00 Abdel Hakim Deneche < > > > > > > [email protected] > > > > > > >>>>> > > > > > > >>>> : > > > > > > >>>> > > > > > > >>>>> > > > > > > >>>>> I guess that would fix the issue too. But we may still run > > > into > > > > > > >>>>>> > > > > > > >>>>> situations > > > > > > >>>>> > > > > > > >>>>>> where the caller will pass a flag to "mute" the exception > > and > > > > not > > > > > > >>>>>> > > > > > > >>>>> handle > > > > > > >>>> > > > > > > >>>>> the case anyway. > > > > > > >>>>>> > > > > > > >>>>>> If .buffer() unconditionally throws an exception, can't > the > > > > > caller, > > > > > > >>>>>> > > > > > > >>>>> who > > > > > > >>> > > > > > > >>>> wants to, just catch that and handle it properly ? > > > > > > >>>>>> > > > > > > >>>>>> On Tue, Jun 30, 2015 at 12:13 PM, Chris Westin < > > > > > > >>>>>> > > > > > > >>>>> [email protected]> > > > > > > >>>> > > > > > > >>>>> wrote: > > > > > > >>>>>> > > > > > > >>>>>> No, but we should do something close to that. > > > > > > >>>>>>> > > > > > > >>>>>>> There are cases where the caller can handle the inability > > to > > > > get > > > > > > >>>>>>> > > > > > > >>>>>> more > > > > > > >>> > > > > > > >>>> memory, and may be able to go to disk. However, you are > > correct > > > > > > >>>>>>> > > > > > > >>>>>> that > > > > > > >>> > > > > > > >>>> there > > > > > > >>>>>> > > > > > > >>>>>>> are many that can't handle an OOM, and that fail to > check. > > > > > > >>>>>>> > > > > > > >>>>>>> Instead of unconditionally throwing > > > > OutOfMemoryRuntimeException, > > > > > I > > > > > > >>>>>>> > > > > > > >>>>>> would > > > > > > >>>>> > > > > > > >>>>>> suggest that the buffer() call take a flag that indicates > > > > whether > > > > > > >>>>>>> > > > > > > >>>>>> or > > > > > > >>> > > > > > > >>>> not > > > > > > >>>>> > > > > > > >>>>>> it > > > > > > >>>>>> > > > > > > >>>>>>> should throw if it is unable to fulfill the request. This > > > way, > > > > > the > > > > > > >>>>>>> > > > > > > >>>>>> call > > > > > > >>>> > > > > > > >>>>> sites that can handle an OOM can pass in the flag to return > > > null, > > > > > > >>>>>>> > > > > > > >>>>>> and > > > > > > >>> > > > > > > >>>> the > > > > > > >>>>> > > > > > > >>>>>> rest can pass in the flag value to throw, and not have to > > have > > > > any > > > > > > >>>>>>> > > > > > > >>>>>> checking > > > > > > >>>>>> > > > > > > >>>>>>> code. > > > > > > >>>>>>> > > > > > > >>>>>>> > > > > > > >>>>>>> On Tue, Jun 30, 2015 at 12:06 PM, Abdel Hakim Deneche < > > > > > > >>>>>>> [email protected] > > > > > > >>>>>>> > > > > > > >>>>>>>> wrote: > > > > > > >>>>>>>> > > > > > > >>>>>>> > > > > > > >>>>>>> our current implementations of > BufferAllocator.buffer(int, > > > > int) > > > > > > >>>>>>>> > > > > > > >>>>>>> returns > > > > > > >>>>> > > > > > > >>>>>> null when it cannot allocate the buffer. > > > > > > >>>>>>>> > > > > > > >>>>>>>> But looking through the code, there are many places that > > > don't > > > > > > >>>>>>>> > > > > > > >>>>>>> check > > > > > > >>>> > > > > > > >>>>> if > > > > > > >>>>> > > > > > > >>>>>> the > > > > > > >>>>>>> > > > > > > >>>>>>>> allocated buffer is null before trying to access it > which > > > will > > > > > > >>>>>>>> > > > > > > >>>>>>> throw > > > > > > >>>> > > > > > > >>>>> a > > > > > > >>>>> > > > > > > >>>>>> NullPointerException. > > > > > > >>>>>>>> > > > > > > >>>>>>>> ValueVectors' allocateNewSafe() seem to be the only > place > > > that > > > > > > >>>>>>>> > > > > > > >>>>>>> handle > > > > > > >>>> > > > > > > >>>>> the > > > > > > >>>>>> > > > > > > >>>>>>> null in a specific manner. > > > > > > >>>>>>>> > > > > > > >>>>>>>> Should we update the allocators' implementation to throw > > an > > > > > > >>>>>>>> OutOfMemoryRuntimeException instead of returning null ? > > this > > > > has > > > > > > >>>>>>>> > > > > > > >>>>>>> the > > > > > > >>>> > > > > > > >>>>> added > > > > > > >>>>>>> > > > > > > >>>>>>>> benefit of displaying a proper out of memory error > message > > > to > > > > > the > > > > > > >>>>>>>> > > > > > > >>>>>>> user. > > > > > > >>>>> > > > > > > >>>>>> > > > > > > >>>>>>>> Thanks! > > > > > > >>>>>>>> > > > > > > >>>>>>>> -- > > > > > > >>>>>>>> > > > > > > >>>>>>>> Abdelhakim Deneche > > > > > > >>>>>>>> > > > > > > >>>>>>>> Software Engineer > > > > > > >>>>>>>> > > > > > > >>>>>>>> <http://www.mapr.com/> > > > > > > >>>>>>>> > > > > > > >>>>>>>> > > > > > > >>>>>>>> Now Available - Free Hadoop On-Demand Training > > > > > > >>>>>>>> < > > > > > > >>>>>>>> > > > > > > >>>>>>>> > > > > > > >>>>>>> > > > > > > >>>>>> > > > > > > >>>>> > > > > > > >>>> > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > > > > > >>> > > > > > > >>>> > > > > > > >>>>>>>>> > > > > > > >>>>>>>> > > > > > > >>>>>>> > > > > > > >>>>>> > > > > > > >>>>>> > > > > > > >>>>>> -- > > > > > > >>>>>> > > > > > > >>>>>> Abdelhakim Deneche > > > > > > >>>>>> > > > > > > >>>>>> Software Engineer > > > > > > >>>>>> > > > > > > >>>>>> <http://www.mapr.com/> > > > > > > >>>>>> > > > > > > >>>>>> > > > > > > >>>>>> Now Available - Free Hadoop On-Demand Training > > > > > > >>>>>> < > > > > > > >>>>>> > > > > > > >>>>>> > > > > > > >>>>> > > > > > > >>>> > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > > > > > >>> > > > > > > >>>> > > > > > > >>>>>>> > > > > > > >>>>>> > > > > > > >>>>> > > > > > > >>>> > > > > > > >>> > > > > > > >>> > > > > > > >>> -- > > > > > > >>> > > > > > > >>> Abdelhakim Deneche > > > > > > >>> > > > > > > >>> Software Engineer > > > > > > >>> > > > > > > >>> <http://www.mapr.com/> > > > > > > >>> > > > > > > >>> > > > > > > >>> Now Available - Free Hadoop On-Demand Training > > > > > > >>> < > > > > > > >>> > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > > > > > >>> > > > > > > >>>> > > > > > > >>>> > > > > > > >>> > > > > > > >> > > > > > > > > > > > > > > -- > > > > > > > Daniel Barclay > > > > > > > MapR Technologies > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > Abdelhakim Deneche > > > > > > > > > > Software Engineer > > > > > > > > > > <http://www.mapr.com/> > > > > > > > > > > > > > > > Now Available - Free Hadoop On-Demand Training > > > > > < > > > > > > > > > > > > > > > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Abdelhakim Deneche > > > > > > Software Engineer > > > > > > <http://www.mapr.com/> > > > > > > > > > Now Available - Free Hadoop On-Demand Training > > > < > > > > > > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > > > > > > > > > > > > -- > > Abdelhakim Deneche > > Software Engineer > > <http://www.mapr.com/> > > > Now Available - Free Hadoop On-Demand Training > < > http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available > > >
