Repository: incubator-hawq
Updated Branches:
  refs/heads/master cb3328d47 -> c80e4e35a


HAWQ-1174. double type core counter of container set has precision issue


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/c80e4e35
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/c80e4e35
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/c80e4e35

Branch: refs/heads/master
Commit: c80e4e35a9a2c8fc834b3390a0b3bceaeb0e7675
Parents: cb3328d
Author: Yi <[email protected]>
Authored: Tue Nov 29 18:44:39 2016 +1100
Committer: Yi <[email protected]>
Committed: Tue Nov 29 18:44:39 2016 +1100

----------------------------------------------------------------------
 src/backend/resourcemanager/include/resourcepool.h | 1 +
 src/backend/resourcemanager/resourcepool.c         | 9 ++++-----
 src/backend/resourcemanager/resqueuemanager.c      | 4 ++++
 3 files changed, 9 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c80e4e35/src/backend/resourcemanager/include/resourcepool.h
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/include/resourcepool.h 
b/src/backend/resourcemanager/include/resourcepool.h
index f23e77b..718e5fc 100644
--- a/src/backend/resourcemanager/include/resourcepool.h
+++ b/src/backend/resourcemanager/include/resourcepool.h
@@ -715,6 +715,7 @@ SimpStringPtr build_segment_status_description(SegStat 
segstat);
 #define EPSILON 1e-7
 #define IS_DOUBLE_ZERO(d)       (fabs(d) < EPSILON)
 #define IS_DOUBLE_EQ(x, y)      ((fabs((x) - (y))) <= (EPSILON))
+#define IS_DOUBLE_GE(x, y)      (((x) + EPSILON) >= (y))
 
 void validateResourcePoolStatus(bool refquemgr);
 

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c80e4e35/src/backend/resourcemanager/resourcepool.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/resourcepool.c 
b/src/backend/resourcemanager/resourcepool.c
index 22bc0eb..ed91d8e 100644
--- a/src/backend/resourcemanager/resourcepool.c
+++ b/src/backend/resourcemanager/resourcepool.c
@@ -3650,11 +3650,10 @@ void timeoutIdleGRMResourceToRBByRatio(int              
 ratioindex,
                GRMContainer retcont = 
getGRMContainerSetContainerFirst(containerset);
 
                if ( containerset->Available.MemoryMB >= retcont->MemoryMB &&
-                        containerset->Available.Core     >= retcont->Core )
+                    IS_DOUBLE_GE(containerset->Available.Core, retcont->Core ) 
)
                {
-
                        Assert(resource->Available.MemoryMB >= 
retcont->MemoryMB);
-                       Assert(resource->Available.Core     >= retcont->Core);
+                       Assert(IS_DOUBLE_GE(resource->Available.Core, 
retcont->Core));
 
                        retcont = popGRMContainerSetContainerList(containerset);
 
@@ -3669,12 +3668,12 @@ void timeoutIdleGRMResourceToRBByRatio(int              
 ratioindex,
                        Assert( resource->Allocated.MemoryMB >= 0 );
                        Assert( resource->Allocated.Core >= 0  );
                        Assert( resource->Available.MemoryMB >= 0 );
-                       Assert( resource->Available.Core >= 0  );
+                       Assert( IS_DOUBLE_GE(resource->Available.Core, 0) );
 
                        Assert( containerset->Allocated.MemoryMB >= 0 );
                        Assert( containerset->Allocated.Core >= 0   );
                        Assert( containerset->Available.MemoryMB >= 0 );
-                       Assert( containerset->Available.Core >= 0   );
+                       Assert( IS_DOUBLE_GE(containerset->Available.Core, 0) );
 
                        reorderSegResourceAllocIndex(resource, ratio);
                        reorderSegResourceAvailIndex(resource, ratio);

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c80e4e35/src/backend/resourcemanager/resqueuemanager.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/resqueuemanager.c 
b/src/backend/resourcemanager/resqueuemanager.c
index ca58507..d98c11c 100644
--- a/src/backend/resourcemanager/resqueuemanager.c
+++ b/src/backend/resourcemanager/resqueuemanager.c
@@ -3267,6 +3267,10 @@ void minusResourceBundleData(ResourceBundle detail, 
int32_t mem, double core)
 {
        detail->MemoryMB -= mem;
        detail->Core -= core;
+       if (IS_DOUBLE_EQ(detail->Core, 0)) {
+               // this setting is to avoid accumulating double precision 
problem
+               detail->Core = 0.0;
+       }
 }
 
 void resetResourceBundleDataByBundle(ResourceBundle detail, ResourceBundle 
source)

Reply via email to