Skip to content

Commit 0a12382

Browse files
committed
Add a flag to return 0 if only one data point has been recorded
Currently, getProcessCpuLoad() and getSystemCpuLoad() return -1 if only one data point has been recorded. A compatibility flag -XX:[+/-]CpuLoadCompatibility is added to match the behaviour of the RI, which is to return 0. Fixes: eclipse-openj9#13389 Related: eclipse-omr/omr#7189 Signed-off-by: Gengchen Tuo <gengchen.tuo@ibm.com>
1 parent 0c87adb commit 0a12382

File tree

9 files changed

+51
-4
lines changed

9 files changed

+51
-4
lines changed

jcl/src/jdk.management/share/classes/com/ibm/lang/management/internal/ExtendedOperatingSystemMXBeanImpl.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ public final String getHardwareModel() throws UnsupportedOperationException {
245245
/* Returns the number of CPU's online at this very moment. */
246246
private native int getOnlineProcessorsImpl();
247247

248+
/**
249+
* Check if the CpuLoadCompatibility flag is set.
250+
* @return if the CpuLoadCompatibility flag is set
251+
*/
252+
private static native boolean hasCpuLoadCompatibilityFlag();
253+
248254
/**
249255
* {@inheritDoc}
250256
*/
@@ -263,16 +269,21 @@ public final synchronized double getProcessCpuLoad() {
263269
}
264270
latestCpuTime = cpuTime;
265271

266-
/* First call to this method should -1, since we don't have any previous
267-
* CPU times (or timestamp) to compute CPU load against.
272+
/* First call to this method returns 0 to match the behaviour of the RI.
273+
* If the CpuLoadCompatibility flag is set, the bahaviour is reverted to
274+
* return -1 for compatibility.
268275
*/
269276
if (-1 == oldTime) {
270277
/* Save current counters; next invocation onwards, we use these to
271278
* compute CPU loads.
272279
*/
273280
oldTime = interimTime = latestTime;
274281
oldCpuTime = interimCpuTime = latestCpuTime;
275-
return CpuLoadCalculationConstants.ERROR_VALUE;
282+
if (hasCpuLoadCompatibilityFlag()) {
283+
return 0;
284+
} else {
285+
return CpuLoadCalculationConstants.ERROR_VALUE;
286+
}
276287
}
277288

278289
/* If a sufficiently long interval has elapsed since last sampling, calculate using

runtime/jcl/common/extendedosmbean.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,20 @@ Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getHardw
518518
return (NULL == str) ? NULL : (*env)->NewStringUTF(env, str);
519519
}
520520

521+
/**
522+
* Check if the CpuLoadCompatibility flag is set.
523+
*
524+
* @param env instance of JNIEnv
525+
* @param unusedClass
526+
*
527+
* @return if the CpuLoadCompatibility flag is set
528+
*/
529+
jboolean JNICALL
530+
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_hasCpuLoadCompatibilityFlag(JNIEnv *env, jclass unusedClass) {
531+
J9JavaVM *vm = ((J9VMThread *)env)->javaVM;
532+
return J9_ARE_ALL_BITS_SET(vm->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_CPU_LOAD_COMPATIBILITY);
533+
}
534+
521535
/**
522536
* Returns the maximum number of file descriptors that can be opened in a process.
523537
*

runtime/jcl/common/mgmtosext.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ jdouble JNICALL
8383
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getSystemCpuLoadImpl(JNIEnv *env, jobject instance) {
8484
PORT_ACCESS_FROM_ENV(env);
8585
OMRPORT_ACCESS_FROM_J9PORT(PORTLIB);
86+
87+
J9JavaVM *vm = ((J9VMThread *)env)->javaVM;
8688
double cpuLoad = 0.0;
8789

8890
intptr_t portLibraryStatus = omrsysinfo_get_CPU_load(&cpuLoad);
@@ -95,6 +97,12 @@ Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getSyste
9597
case OMRPORT_ERROR_SYSINFO_NOT_SUPPORTED:
9698
portLibraryStatus = -3;
9799
break;
100+
case OMRPORT_ERROR_INSUFFICIENT_DATA:
101+
portLibraryStatus =
102+
J9_ARE_ALL_BITS_SET(vm->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_CPU_LOAD_COMPATIBILITY)
103+
? 0
104+
: -1;
105+
break;
98106
default:
99107
portLibraryStatus = OMRPORT_ERROR_OPFAILED;
100108
break;

runtime/jcl/exports.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ omr_add_exports(jclse
228228
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getSystemCpuLoadImpl
229229
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getTotalPhysicalMemoryImpl
230230
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getTotalProcessorUsageImpl
231+
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_hasCpuLoadCompatibilityFlag
231232
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_isDLPAREnabled
232233
Java_com_ibm_lang_management_internal_ExtendedRuntimeMXBeanImpl_getVMIdleStateImpl
233234
Java_com_ibm_lang_management_internal_JvmCpuMonitor_getThreadCategoryImpl

runtime/jcl/uma/se7_exports.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<export name="Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getMemoryUsageImpl" />
6868
<export name="Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getOnlineProcessorsImpl" />
6969
<export name="Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getHardwareModelImpl" />
70+
<export name="Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_hasCpuLoadCompatibilityFlag" />
7071
<export name="Java_com_ibm_lang_management_internal_JvmCpuMonitor_getThreadsCpuUsageImpl" />
7172
<export name="Java_com_ibm_lang_management_internal_JvmCpuMonitor_setThreadCategoryImpl" />
7273
<export name="Java_com_ibm_lang_management_internal_JvmCpuMonitor_getThreadCategoryImpl" />

runtime/oti/j9consts.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ extern "C" {
361361
#define J9_EXTENDED_RUNTIME2_USE_CONTAINER_SUPPORT 0x200000
362362
#define J9_EXTENDED_RUNTIME2_SHOW_CARRIER_FRAMES 0x400000
363363
#define J9_EXTENDED_RUNTIME2_CRIU_SINGLE_THROW_BLOCKING_EXCEPTIONS 0x800000
364-
#define J9_EXTENDED_RUNTIME2_UNUSED_0x1000000 0x1000000
364+
#define J9_EXTENDED_RUNTIME2_CPU_LOAD_COMPATIBILITY 0x1000000
365365

366366
#define J9_OBJECT_HEADER_AGE_DEFAULT 0xA /* OBJECT_HEADER_AGE_DEFAULT */
367367
#define J9_OBJECT_HEADER_SHAPE_MASK 0xE /* OBJECT_HEADER_SHAPE_MASK */

runtime/oti/jclprots.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,8 @@ Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getOnlin
11661166
jstring JNICALL
11671167
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_getHardwareModelImpl(JNIEnv *env, jobject obj);
11681168

1169+
jboolean JNICALL
1170+
Java_com_ibm_lang_management_internal_ExtendedOperatingSystemMXBeanImpl_hasCpuLoadCompatibilityFlag(JNIEnv *env, jclass unusedClass);
11691171
/**
11701172
* Returns the maximum number of file descriptors that can be opened in a process.
11711173
*

runtime/oti/jvminit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,8 @@ enum INIT_STAGE {
417417
#define VMOPT_XXDISABLEENSUREHASHED "-XX:-EnsureHashed:"
418418
#define VMOPT_XXOPENJ9COMMANDLINEENV "-XX:+OpenJ9CommandLineEnv"
419419
#define VMOPT_XXNOOPENJ9COMMANDLINEENV "-XX:-OpenJ9CommandLineEnv"
420+
#define VMOPT_XXCPULOADCOMPATIBILITY "-XX:+CpuLoadCompatibility"
421+
#define VMOPT_XXNOCPULOADCOMPATIBILITY "-XX:-CpuLoadCompatibility"
420422

421423
#if defined(J9VM_ZOS_3164_INTEROPERABILITY)
422424
#define VMOPT_XXENABLE3164INTEROPERABILITY "-XX:+Enable3164Interoperability"

runtime/vm/jvminit.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4123,6 +4123,14 @@ processVMArgsFromFirstToLast(J9JavaVM * vm)
41234123
}
41244124
}
41254125

4126+
{
4127+
IDATA cpuLoadCompatibility = FIND_AND_CONSUME_VMARG(EXACT_MATCH, VMOPT_XXCPULOADCOMPATIBILITY , NULL);
4128+
IDATA noCpuLoadCompatibility = FIND_AND_CONSUME_VMARG(EXACT_MATCH, VMOPT_XXNOCPULOADCOMPATIBILITY , NULL);
4129+
if (cpuLoadCompatibility > noCpuLoadCompatibility) {
4130+
vm->extendedRuntimeFlags2 |= J9_EXTENDED_RUNTIME2_CPU_LOAD_COMPATIBILITY;
4131+
}
4132+
}
4133+
41264134
return JNI_OK;
41274135
}
41284136

0 commit comments

Comments
 (0)