[ 
https://issues.apache.org/jira/browse/HADOOP-18429?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

xinqiu.hu updated HADOOP-18429:
-------------------------------
    Description: 
The current implementation converts the value from int to float, causing the 
compareAndSet method to get stuck.
{code:java}
private final boolean compareAndSet(float expect, float update) {
  return value.compareAndSet(Float.floatToIntBits(expect),
      Float.floatToIntBits(update));
}

private void incr(float delta) {
  while (true) {
    float current = value.get();
    float next = current + delta;
    if (compareAndSet(current, next)) {
      setChanged();
      return;
    }
  }
} {code}
 

Perhaps it could be:
{code:java}
private void incr(float delta) {
  while (true) {
    float current = Float.intBitsToFloat(value.get());
    float next = current + delta;
    if (compareAndSet(current, next)) {
      setChanged();
      return;
    }
  }
} {code}
 

The unit test looks like this
{code:java}
MutableGaugeFloat mgf = new MutableGaugeFloat(Context,3.2f);
assertEquals(3.2f, mgf.value(), 0.0);
mgf.incr();
assertEquals(4.2f, mgf.value(), 0.0); {code}
 

  was:
The current implementation converts the value from int to float, causing the 
compareAndSet method to get stuck.

 
{code:java}
private final boolean compareAndSet(float expect, float update) {
  return value.compareAndSet(Float.floatToIntBits(expect),
      Float.floatToIntBits(update));
}

private void incr(float delta) {
  while (true) {
    float current = value.get();
    float next = current + delta;
    if (compareAndSet(current, next)) {
      setChanged();
      return;
    }
  }
} {code}
Perhaps it could be:

 

 
{code:java}
private void incr(float delta) {
  while (true) {
    float current = Float.intBitsToFloat(value.get());
    float next = current + delta;
    if (compareAndSet(current, next)) {
      setChanged();
      return;
    }
  }
} {code}
The unit test looks like this
{code:java}
MutableGaugeFloat mgf = new MutableGaugeFloat(Context,3.2f);
assertEquals(3.2f, mgf.value(), 0.0);
mgf.incr();
assertEquals(4.2f, mgf.value(), 0.0); {code}
 


> MutableGaugeFloat#incr(float) get stuck in an infinite loop
> -----------------------------------------------------------
>
>                 Key: HADOOP-18429
>                 URL: https://issues.apache.org/jira/browse/HADOOP-18429
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: metrics
>            Reporter: xinqiu.hu
>            Priority: Major
>
> The current implementation converts the value from int to float, causing the 
> compareAndSet method to get stuck.
> {code:java}
> private final boolean compareAndSet(float expect, float update) {
>   return value.compareAndSet(Float.floatToIntBits(expect),
>       Float.floatToIntBits(update));
> }
> private void incr(float delta) {
>   while (true) {
>     float current = value.get();
>     float next = current + delta;
>     if (compareAndSet(current, next)) {
>       setChanged();
>       return;
>     }
>   }
> } {code}
>  
> Perhaps it could be:
> {code:java}
> private void incr(float delta) {
>   while (true) {
>     float current = Float.intBitsToFloat(value.get());
>     float next = current + delta;
>     if (compareAndSet(current, next)) {
>       setChanged();
>       return;
>     }
>   }
> } {code}
>  
> The unit test looks like this
> {code:java}
> MutableGaugeFloat mgf = new MutableGaugeFloat(Context,3.2f);
> assertEquals(3.2f, mgf.value(), 0.0);
> mgf.incr();
> assertEquals(4.2f, mgf.value(), 0.0); {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to