@@ -148,7 +148,7 @@ def __equal(self, other, ignoreAttr=[]):
148148 return True
149149
150150 def __eq__ (self , other ):
151- return self .__equal (other )
151+ return self .__equal (other , [ 'mode' ] )
152152
153153
154154 def __hash__ (self ):
@@ -429,6 +429,9 @@ def __str__(self):
429429 return "(Primary: %s, Mirror: %s)" % (str (self .primaryDB ),
430430 str (self .mirrorDB ))
431431
432+ def __eq__ (self , other ):
433+ return self .primaryDB == other .primaryDB and self .mirrorDB == other .mirrorDB
434+
432435 # --------------------------------------------------------------------
433436 def addPrimary (self ,segDB ):
434437 self .primaryDB = segDB
@@ -799,6 +802,7 @@ def __init__(self, segments, segmentsAsLoadedFromDb=None):
799802 self .standbyCoordinator = None
800803 self .segmentPairs = []
801804 self .expansionSegmentPairs = []
805+ self .shrinkSegmentPairs = []
802806 self .numPrimarySegments = 0
803807
804808 self .recoveredSegmentDbids = []
@@ -1045,7 +1049,7 @@ def dumpToFile(self, filename):
10451049 fp .close ()
10461050
10471051 # --------------------------------------------------------------------
1048- def getDbList (self , includeExpansionSegs = False ):
1052+ def getDbList (self , includeExpansionSegs = False , removeShrinkSegs = False ):
10491053 """
10501054 Return a list of all Segment objects that make up the array
10511055 """
@@ -1054,8 +1058,8 @@ def getDbList(self, includeExpansionSegs=False):
10541058 dbs .append (self .coordinator )
10551059 if self .standbyCoordinator :
10561060 dbs .append (self .standbyCoordinator )
1057- if includeExpansionSegs :
1058- dbs .extend (self .getSegDbList (True ))
1061+ if includeExpansionSegs or removeShrinkSegs :
1062+ dbs .extend (self .getSegDbList (includeExpansionSegs , removeShrinkSegs ))
10591063 else :
10601064 dbs .extend (self .getSegDbList ())
10611065 return dbs
@@ -1105,23 +1109,29 @@ def getDbIdToPeerMap(self):
11051109
11061110
11071111 # --------------------------------------------------------------------
1108- def getSegDbList (self , includeExpansionSegs = False ):
1112+ def getSegDbList (self , includeExpansionSegs = False , removeShrinkSegs = False ):
11091113 """Return a list of all Segment objects for all segments in the array"""
11101114 dbs = []
11111115 for segPair in self .segmentPairs :
11121116 dbs .extend (segPair .get_dbs ())
11131117 if includeExpansionSegs :
11141118 for segPair in self .expansionSegmentPairs :
11151119 dbs .extend (segPair .get_dbs ())
1120+ if removeShrinkSegs :
1121+ for segPair in self .shrinkSegmentPairs :
1122+ dbs = list (filter (lambda x : segPair .primaryDB != x and segPair .mirrorDB != x , dbs ))
11161123 return dbs
11171124
11181125 # --------------------------------------------------------------------
1119- def getSegmentList (self , includeExpansionSegs = False ):
1126+ def getSegmentList (self , includeExpansionSegs = False , removeShrinkSegs = False ):
11201127 """Return a list of SegmentPair objects for all segments in the array"""
11211128 dbs = []
11221129 dbs .extend (self .segmentPairs )
11231130 if includeExpansionSegs :
11241131 dbs .extend (self .expansionSegmentPairs )
1132+ if removeShrinkSegs :
1133+ for segPair in self .shrinkSegmentPairs :
1134+ dbs .remove (segPair )
11251135 return dbs
11261136
11271137 # --------------------------------------------------------------------
@@ -1148,6 +1158,21 @@ def getExpansionSegPairList(self):
11481158 """Returns a list of all SegmentPair objects that make up the new segments
11491159 of an expansion"""
11501160 return self .expansionSegmentPairs
1161+
1162+ # --------------------------------------------------------------------
1163+ def getShrinkSegDbList (self ):
1164+ """Returns a list of all Segment objects that make up the new segments
1165+ of an expansion"""
1166+ dbs = []
1167+ for segPair in self .shrinkSegmentPairs :
1168+ dbs .extend (segPair .get_dbs ())
1169+ return dbs
1170+
1171+ # --------------------------------------------------------------------
1172+ def getShrinkSegPairList (self ):
1173+ """Returns a list of all SegmentPair objects that make up the new segments
1174+ of an expansion"""
1175+ return self .shrinkSegmentPairs
11511176
11521177 # --------------------------------------------------------------------
11531178 def getSegmentContainingDb (self , db ):
@@ -1164,6 +1189,15 @@ def getExpansionSegmentContainingDb(self, db):
11641189 if db .getSegmentDbId () == segDb .getSegmentDbId ():
11651190 return segPair
11661191 return None
1192+
1193+ # --------------------------------------------------------------------
1194+ def getShrinkSegmentContainingDb (self , db ):
1195+ for segPair in self .shrinkSegmentPairs :
1196+ for segDb in segPair .get_dbs ():
1197+ if db .getSegmentDbId () == segDb .getSegmentDbId ():
1198+ return segPair
1199+ return None
1200+
11671201 # --------------------------------------------------------------------
11681202 def get_invalid_segdbs (self ):
11691203 dbs = []
@@ -1488,6 +1522,37 @@ def addExpansionSeg(self, content, preferred_role, dbid, role,
14881522 else :
14891523 seg .addMirror (segdb )
14901524
1525+ # --------------------------------------------------------------------
1526+ def addShrinkSeg (self , content , preferred_role , dbid , role ,
1527+ hostname , address , port , datadir ):
1528+ """
1529+ Add a segment to the gparray as an shrink segment.
1530+
1531+ Note: may work better to construct the new Segment in gpshrink and
1532+ simply pass it in.
1533+ """
1534+
1535+ segdb = Segment (content = content ,
1536+ preferred_role = preferred_role ,
1537+ dbid = dbid ,
1538+ role = role ,
1539+ mode = MODE_SYNCHRONIZED ,
1540+ status = STATUS_UP ,
1541+ hostname = hostname ,
1542+ address = address ,
1543+ port = port ,
1544+ datadir = datadir )
1545+
1546+ if preferred_role == ROLE_PRIMARY :
1547+ self .shrinkSegmentPairs .append (SegmentPair ())
1548+ seg = self .shrinkSegmentPairs [- 1 ]
1549+ if seg .primaryDB :
1550+ raise Exception ('Duplicate content id for primary segment' )
1551+ seg .addPrimary (segdb )
1552+ else :
1553+ seg = self .shrinkSegmentPairs [- 1 ]
1554+ seg .addMirror (segdb )
1555+
14911556 # --------------------------------------------------------------------
14921557 def reOrderExpansionSegs (self ):
14931558 """
@@ -1595,6 +1660,52 @@ def validateExpansionSegs(self):
15951660 else :
15961661 used_ports [hostname ] = []
15971662 used_ports [hostname ].append (db .port )
1663+
1664+ # --------------------------------------------------------------------
1665+ def validateShrinkSegs (self ):
1666+ """ Checks the segments added for various inconsistencies and errors.
1667+ """
1668+
1669+ # make sure we have added at least one segment
1670+ if len (self .shrinkSegmentPairs ) == 0 :
1671+ raise Exception ('No shrink segments defined' )
1672+
1673+ totalsize = len (self .segmentPairs )
1674+ removesize = len (self .shrinkSegmentPairs )
1675+
1676+ if removesize >= totalsize :
1677+ self .logger .error ('removed segment num %d more than or equal to total segment num %d' , removesize , totalsize )
1678+ exit (1 )
1679+ elif removesize < 1 :
1680+ self .logger .error ('removed segment num %d less than 1' , removesize )
1681+ exit (1 )
1682+
1683+ for segPair in self .shrinkSegmentPairs :
1684+ if self .hasMirrors :
1685+ if segPair .mirrorDB is None :
1686+ raise Exception ('primaryDB and mirrorDB should be removed simultaneously' )
1687+
1688+ if segPair .primaryDB .content != segPair .mirrorDB .content :
1689+ raise Exception ('primaryDB content is not equal mirrorDB content' )
1690+
1691+ # If shrinkSegmentPairs not in the segmentPairs raise exception
1692+ flag = False
1693+ for segPair_ in self .segmentPairs :
1694+ if segPair_ == segPair :
1695+ flag = True
1696+
1697+ if flag == False :
1698+ raise Exception ('Shrink segments not in the gp_segment_configuration table' )
1699+
1700+ # If shrinkSegmentPairs is not the last n segment.
1701+ self .shrinkSegmentPairs .sort (key = lambda segPair : segPair .primaryDB .content )
1702+
1703+ if self .shrinkSegmentPairs [- 1 ].primaryDB .content != self .get_max_contentid ():
1704+ raise Exception ('please remove segment from max contentid' )
1705+
1706+ if self .shrinkSegmentPairs [0 ].primaryDB .content != self .get_max_contentid ()- len (self .shrinkSegmentPairs )+ 1 :
1707+ raise Exception ('please remove segment in continuous contentid' )
1708+
15981709
15991710 # --------------------------------------------------------------------
16001711 def addExpansionHosts (self , hosts , mirror_type ):
0 commit comments