Oh and to prove the second scenario, just add a sleep for a few seconds
after the SIGTERM kill command and observe how the system will crash:

if (line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) {
  exec { commandLine 'kill', '-TERM', line.tokenize().first() }
  Thread.sleep(5000)
}

Again, this shows you how poor the quality of this code is. It introduces a
subtle bug, it repeats an if condition unnecessarily, and the comments are
wrong "Only kill if needed"

On Sun, Jun 25, 2017 at 4:22 PM, Taher Alkhateeb <slidingfilame...@gmail.com
> wrote:

> I'm completing my answer for the record to show exactly where your code is
> faulty and wrong just like in the other previous cases.
>
> 1- you have a copy-paste pattern in your code
> 2- you are calling the kill command twice immediately one after another
> without checking whether SIGTERM killed the process properly. The whole
> purpose of doing SIGTERM is to allow cleaning resources before enforcing
> SIGKILL. You're not giving the JVM an opportunity to call the shutdown hook
> because you're looking up the same output from the same "ps ax" command for
> both kill commands.
>
> So your code is working almost exactly as if typing:
> if (line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) {
>   exec { commandLine 'kill', '-TERM', line.tokenize().first() }
>   exec { commandLine 'kill', '-KILL', line.tokenize().first() }
> }
>
> Now what's happening is that SIGKILL is executing before SIGTERM
> completes, so the build is successful but OFBiz is killed with SIGKILL not
> SIGTERM. If SIGTERM finishes very quickly (does not happen with me) then
> the build system would crash because the exit value of SIGKILL would be 1,
> not 0 (process not found). So either way it is a problem (either killing
> with SIGKILL or crashing the build system)
>
> Convinced? I hope you can revert now.
>
> On Sun, Jun 25, 2017 at 2:20 PM, Jacques Le Roux <
> jacques.le.r...@les7arts.com> wrote:
>
>> But what's wrong? It's not clear to me, do you see it Michael?
>>
>> Not clearly answering this question just adds more work on my side, I
>> still don't see why I should revert.
>>
>> Jacques
>>
>>
>>
>> Le 25/06/2017 à 13:11, Michael Brohl a écrit :
>>
>>> I's like to propose the following process to get this worked out without
>>> endless ping-pong here on the mailing lists:
>>>
>>> 1. revert the change as requested
>>>
>>> 2. provide a Jira with patch and review/discuss it there (what's the
>>> problem, how should it be solved etc.)
>>>
>>> 3. come to a conclusion and a thumbsup by other committers
>>>
>>> 4. commit the solution.
>>>
>>> Thanks,
>>>
>>> Michael
>>>
>>>
>>> Am 25.06.17 um 12:36 schrieb Taher Alkhateeb:
>>>
>>>> OK, I take this question as your refusal to revert and cooperate. I'm
>>>> done
>>>> spending time here and I leave it up to the community to see if they
>>>> want
>>>> incorrect code in the code base.
>>>>
>>>> On Sun, Jun 25, 2017 at 1:34 PM, Jacques Le Roux <
>>>> jacques.le.r...@les7arts.com> wrote:
>>>>
>>>> Mmm but anyway, I remember now how I thought that.
>>>>>
>>>>> In the 2nd "if", if the process was terminated, kill will just say
>>>>> that it
>>>>> can't find the process and exec will return. Else the process will be
>>>>> killed.
>>>>>
>>>>> What's wrong then?
>>>>>
>>>>> Jacques
>>>>>
>>>>>
>>>>>
>>>>> Le 25/06/2017 à 12:28, Jacques Le Roux a écrit :
>>>>>
>>>>> Ah wait, I see line still contains "start" so will be executed twice
>>>>>> anyway. OK I'll improve that.
>>>>>>
>>>>>> Jacques
>>>>>>
>>>>>>
>>>>>> Le 25/06/2017 à 12:18, Jacques Le Roux a écrit :
>>>>>>
>>>>>> I don't revert without explanations on why I should revert. Sorry,
>>>>>>> but I
>>>>>>> don't find your explanations clear.
>>>>>>>
>>>>>>> My explanation, tell my what's wrong:
>>>>>>>
>>>>>>> The 2 "if" blocks are executed sequentially for each line containing
>>>>>>> "a
>>>>>>> start"and ignore other lines. I did not change the previous logic,
>>>>>>> just
>>>>>>> added a new if.
>>>>>>>
>>>>>>> Gradle exec spawns a new process and waits till it ends (this point
>>>>>>> is
>>>>>>> important).
>>>>>>>
>>>>>>> If the line contains "a start" the 1st "if" try to terminate it.
>>>>>>>
>>>>>>> If it worked the 2nd "if" does not execute. This is better than
>>>>>>> before
>>>>>>> because it allows the "'start" process "a chance to clean up after
>>>>>>> itself"
>>>>>>> (cf unix.stackexchange.com below)
>>>>>>>
>>>>>>> If the "start" process is not terminated then it's killed by the 2nd
>>>>>>> "if", like it was done before.
>>>>>>>
>>>>>>> As I said it cleanly worked with 2 OFBiz instances running in the
>>>>>>> background.
>>>>>>>
>>>>>>> Now tell me what's wrong?
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> Jacques
>>>>>>>
>>>>>>>
>>>>>>> Le 25/06/2017 à 11:22, Taher Alkhateeb a écrit :
>>>>>>>
>>>>>>> As usual, you refuse to revert because you don't understand the code
>>>>>>>> and I
>>>>>>>> pay the price of spending my time explaining. I hope you will
>>>>>>>> reconsider
>>>>>>>> this time consuming and non-cooperative behavior.
>>>>>>>>
>>>>>>>> The quick version:
>>>>>>>> - copy and paste antipattern
>>>>>>>> - incorrect conditional checking leading to both blocks getting
>>>>>>>> executed or
>>>>>>>> both blocks not executing
>>>>>>>>
>>>>>>>> Your belief that Gradle fails because java does not expect to be
>>>>>>>> killed
>>>>>>>> is
>>>>>>>> amazing! It means you do not understand what this code is doing and
>>>>>>>> what is
>>>>>>>> causing the failure.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Jun 25, 2017 10:42 AM, "Jacques Le Roux" <
>>>>>>>> jacques.le.r...@les7arts.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>> What makes you think it's wrong? I tested it locally using 2
>>>>>>>> background
>>>>>>>> instances and it cleaned worked.
>>>>>>>>
>>>>>>>> I also tried with one standard instance (not in background). It
>>>>>>>> works,
>>>>>>>> and
>>>>>>>> you get this message
>>>>>>>>
>>>>>>>> :ofbiz FAILED
>>>>>>>> FAILURE: Build failed with an exception.
>>>>>>>> * What went wrong:
>>>>>>>> Execution failed for task ':ofbiz'.
>>>>>>>>
>>>>>>>> Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished
>>>>>>>>> with
>>>>>>>>>
>>>>>>>>> non-zero exit value 137
>>>>>>>>
>>>>>>>> Which I believe is OK because Java does not expect to be killed!
>>>>>>>>
>>>>>>>> Jacques
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Le 24/06/2017 à 20:04, Taher Alkhateeb a écrit :
>>>>>>>>
>>>>>>>> This commit is wrong and bad on multiple levels. Please revert
>>>>>>>>
>>>>>>>>> On Sat, Jun 24, 2017 at 10:56 AM, <jler...@apache.org> wrote:
>>>>>>>>>
>>>>>>>>> Author: jleroux
>>>>>>>>>
>>>>>>>>> Date: Sat Jun 24 07:56:45 2017
>>>>>>>>>> New Revision: 1799736
>>>>>>>>>>
>>>>>>>>>> URL: http://svn.apache.org/viewvc?rev=1799736&view=rev
>>>>>>>>>> Log:
>>>>>>>>>> No functional change
>>>>>>>>>>
>>>>>>>>>> Improves terminateOfbiz byt using TERM before KILL
>>>>>>>>>> https://fr.wikipedia.org/wiki/Kill_(Unix)
>>>>>>>>>> https://unix.stackexchange.com/questions/8916/when-
>>>>>>>>>> should-i-not-kill-9-a-process
>>>>>>>>>>
>>>>>>>>>> Modified:
>>>>>>>>>>        ofbiz/ofbiz-framework/trunk/build.gradle
>>>>>>>>>>
>>>>>>>>>> Modified: ofbiz/ofbiz-framework/trunk/build.gradle
>>>>>>>>>> URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/
>>>>>>>>>> build.gradle?rev=1799736&r1=1799735&r2=1799736&view=diff
>>>>>>>>>> ============================================================
>>>>>>>>>> ==================
>>>>>>>>>> --- ofbiz/ofbiz-framework/trunk/build.gradle (original)
>>>>>>>>>> +++ ofbiz/ofbiz-framework/trunk/build.gradle Sat Jun 24 07:56:45
>>>>>>>>>> 2017
>>>>>>>>>> @@ -332,8 +332,13 @@ task terminateOfbiz(group: ofbizServer,
>>>>>>>>>>                     standardOutput = processOutput
>>>>>>>>>>                 }
>>>>>>>>>> processOutput.toString().split(System.lineSeparator()).each
>>>>>>>>>> { line ->
>>>>>>>>>> +                // Try to terminate cleanly
>>>>>>>>>>                     if (line ==~ /.*org\.apache\.ofbiz\.base\.s
>>>>>>>>>> tart\.Start.*/)
>>>>>>>>>> {
>>>>>>>>>> -                    exec { commandLine 'kill', '-9',
>>>>>>>>>> line.tokenize().first() }
>>>>>>>>>> +                    exec { commandLine 'kill', '-TERM',
>>>>>>>>>> line.tokenize().first() }
>>>>>>>>>> +                }
>>>>>>>>>> +                // Only kill if needed
>>>>>>>>>> +                if (line ==~ /.*org\.apache\.ofbiz\.base\.s
>>>>>>>>>> tart\.Start.*/)
>>>>>>>>>> {
>>>>>>>>>> +                    exec { commandLine 'kill', '-KILL',
>>>>>>>>>> line.tokenize().first() }
>>>>>>>>>>                     }
>>>>>>>>>>                 }
>>>>>>>>>>             }
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>
>>>>>>
>>>
>>>
>>
>

Reply via email to