FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Fedora Marketing

 
 
LinkBack Thread Tools
 
Old 02-25-2009, 01:50 PM
Joel Granados
 
Default PATCH: pyblock: Make the dmraid table compare function a global function

Patch looks good. Only one comment: I would leave map_dev as an inside
function to compare_tables. This would stress the point that it is
only used by this function. While we could leave it outside for it to
be uesed, I would prefer to avoid using it as it is not general enough.
I mean, map_dev might imply mapping major,minor to a dev path, or a dev
path to a mount point or something different of what is currently
implemented.

regards.
On Tue, Feb 24, 2009 at 10:42:43PM +0100, Hans de Goede wrote:
> We are comparing tables in other places too, so make the dmraid table
> equal function a global function named compare_tables. This is a preparation
> patch for modifying the python code to match the C-code table handling changes.
> ---
> device.py | 158 ++++++++++++++++++++++++++-----------------------------------
> 1 files changed, 67 insertions(+), 91 deletions(-)
>
> diff --git a/device.py b/device.py
> index 34a361a..aae1204 100644
> --- a/device.py
> +++ b/device.py
> @@ -48,6 +48,69 @@ def removeDeviceMap(map):
> pass
> map.remove()
>
> +def map_dev(path):
> + if path[0] != '/':
> + return path
> +
> + try:
> + statinfo = _os.stat(path)
> + if not _stat.S_ISBLK(statinfo.st_mode):
> + return path
> +
> + return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
> + except:
> + return path
> +
> +# Helper function for get_map
> +# The tables will be considered the same if, everything else being the
> +# same, they contain the same sets of devices.
> +def compare_tables(table1, table2):
> + table1 = str(table1).strip().split(' ')
> + table2 = str(table2).strip().split(' ')
> + table1sets = []
> + table2sets = []
> +
> + # We do this to avoid the index out of range exception
> + if len(table1) != len(table2):
> + return False
> +
> + for i in range(len(table1)):
> + d1 = map_dev(table1[i])
> + d2 = map_dev(table2[i])
> +
> + # when at least one changes its a device.
> + if (table1[i] != d1) or (table2[i] != d2):
> + # The d{1,2} will always have the major:minor string
> + # We also need what comes after the dev, the offset.
> + try:
> + table1sets.append("%s %s" % (d1, table1[i+1]))
> + table2sets.append("%s %s" % (d2, table2[i+1]))
> + i += 1
> + except IndexError, msg:
> + # The device must have an offset, if not its nonesense
> + return False
> + continue
> +
> + # these are not devices
> + if d1 == d2:
> + continue
> +
> + if d1 != d2:
> + return False
> +
> + # For mirror sets the devices can be in disorder.
> + if table1[2] == "mirror":
> + if set(table1sets) != set(table2sets):
> + return False
> +
> + # For none mirror the devs have to be in order.
> + else:
> + for i in range(len(table1sets)):
> + if table1sets[i] != table2sets[i]:
> + return False
> +
> + return True
> +
> class BlockDev:
> def get_major(self):
> return self._BlockDev__device.major
> @@ -370,34 +433,11 @@ class MultiPath:
>
> # we get "/dev/hda" from one and "3:0" from the other, so we have to
> # fix up the device name
> - def map_dev(path):
> + def munge_dev(path):
> if path[0] != '/':
> return path.strip()
>
> - bd = path.strip()
> - try:
> - newpath=path.split('/')[-1]
> - pos = 0
> - dev = None
> - num = None
> - while pos < len(newpath):
> - if newpath[pos].isdigit():
> - dev = newpath[os]
> - num = newpath[pos:]
> - break
> - pos += 1
> - if dev is None:
> - dev = newpath
> - sysnewpath = None
> - if num is None:
> - sysnewpath = '/sys/block/%s/dev' % (dev,)
> - else:
> - sysnewpath = '/sys/block/%s/%s%s/dev' % (dev, dev, num)
> - f = open(sysnewpath, 'r')
> - l = f.readline()
> - bd = l.strip()
> - except:
> - pass
> + bd = map_dev(path)
> # starting with 2.6.17-1.2510.fc6 or so, there's an implicit
> # minimum IOs of 1000, which gets _added_ to the line "dmsetup ls"
> # shows. This sucks.
> @@ -406,7 +446,7 @@ class MultiPath:
> tableParts = [0, self.size, 'multipath']
>
> params = '0 0 1 1 round-robin 0 %s 1 %s' % (len(self.bdevs),
> - _string.join(map(map_dev, self.bdevs)))
> + _string.join(map(munge_dev, self.bdevs)))
> tableParts.append(params)
>
> import dm as _dm
> @@ -658,69 +698,6 @@ class RaidSet:
> pass
> bdev = property(get_bdev, None, None, "block.BlockDev")
>
> - # Helper function for get_map
> - # The tables will be considered the same if, everything else being the
> - # same, they contain the same sets of devices.
> - def equal(self, table1, table2):
> - def map_dev(path):
> - if path[0] != '/':
> - return path
> -
> - try:
> - statinfo = _os.stat(path)
> - if not _stat.S_ISBLK(statinfo.st_mode):
> - return path
> -
> - return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
> - except:
> - return path
> -
> - table1 = table1.strip().split(' ')
> - table2 = table2.strip().split(' ')
> - table1sets = []
> - table2sets = []
> -
> - # We do this to avoid the index out of range exception
> - if len(table1) != len(table2):
> - return False
> -
> - for i in range(len(table1)):
> - d1 = map_dev(table1[i])
> - d2 = map_dev(table2[i])
> -
> - # when at least one changes its a device.
> - if (table1[i] != d1) or (table2[i] != d2):
> - # The d{1,2} will always have the major:minor string
> - # We also need what comes after the dev, the offset.
> - try:
> - table1sets.append("%s %s" % (d1, table1[i+1]))
> - table2sets.append("%s %s" % (d2, table2[i+1]))
> - i += 1
> - except IndexError, msg:
> - # The device must have an offset, if not its nonesense
> - return False
> - continue
> -
> - # these are not devices
> - if d1 == d2:
> - continue
> -
> - if d1 != d2:
> - return False
> -
> - # For mirror sets the devices can be in disorder.
> - if self.rs.type == "mirror":
> - if set(table1sets) != set(table2sets):
> - return False
> -
> - # For none mirror the devs have to be in order.
> - else:
> - for i in range(len(table1sets)):
> - if table1sets[i] != table2sets[i]:
> - return False
> -
> - return True
> -
> def get_map(self):
> if not self._RaidSet__map is None:
> return self._RaidSet__map
> @@ -728,8 +705,7 @@ class RaidSet:
> import dm as _dm
>
> for map in _dm.maps():
> - # XXX wtf? why's it have a space at the end sometimes?
> - if self.equal(str(map.table), str(self.rs.dmTable)):
> + if compare_tables(map.table, self.rs.dmTable):
> self._RaidSet__map = map
> self.active = True
> del _dm
> --
> 1.6.1.3
>
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list@redhat.com
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list

--
Joel Andres Granados
Brno, Czech Republic, Red Hat.

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 
Old 02-25-2009, 05:31 PM
Hans de Goede
 
Default PATCH: pyblock: Make the dmraid table compare function a global function

Joel Granados wrote:

Patch looks good. Only one comment: I would leave map_dev as an inside
function to compare_tables. This would stress the point that it is
only used by this function. While we could leave it outside for it to
be uesed, I would prefer to avoid using it as it is not general enough.
I mean, map_dev might imply mapping major,minor to a dev path, or a dev
path to a mount point or something different of what is currently
implemented.



Actually I made it global because it was duplicated (for a similar but
different use) in class BlockDev, if you look at the patch you'll see it
removes that duplicate copy and directly calls map_dev now. so map_dev cannot
be insided the compare_tables function as it is used outside it.


Regards,

Hans




regards.
On Tue, Feb 24, 2009 at 10:42:43PM +0100, Hans de Goede wrote:

We are comparing tables in other places too, so make the dmraid table
equal function a global function named compare_tables. This is a preparation
patch for modifying the python code to match the C-code table handling changes.
---
device.py | 158 ++++++++++++++++++++++++++-----------------------------------
1 files changed, 67 insertions(+), 91 deletions(-)

diff --git a/device.py b/device.py
index 34a361a..aae1204 100644
--- a/device.py
+++ b/device.py
@@ -48,6 +48,69 @@ def removeDeviceMap(map):
pass
map.remove()

+def map_dev(path):
+ if path[0] != '/':
+ return path
+
+ try:
+ statinfo = _os.stat(path)
+ if not _stat.S_ISBLK(statinfo.st_mode):
+ return path
+
+ return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
+ except:
+ return path
+
+# Helper function for get_map
+# The tables will be considered the same if, everything else being the
+# same, they contain the same sets of devices.
+def compare_tables(table1, table2):
+ table1 = str(table1).strip().split(' ')
+ table2 = str(table2).strip().split(' ')
+ table1sets = []
+ table2sets = []
+
+ # We do this to avoid the index out of range exception
+ if len(table1) != len(table2):
+ return False
+
+ for i in range(len(table1)):
+ d1 = map_dev(table1[i])
+ d2 = map_dev(table2[i])
+
+ # when at least one changes its a device.
+ if (table1[i] != d1) or (table2[i] != d2):
+ # The d{1,2} will always have the major:minor string
+ # We also need what comes after the dev, the offset.
+ try:
+ table1sets.append("%s %s" % (d1, table1[i+1]))
+ table2sets.append("%s %s" % (d2, table2[i+1]))
+ i += 1
+ except IndexError, msg:
+ # The device must have an offset, if not its nonesense
+ return False
+ continue
+
+ # these are not devices
+ if d1 == d2:
+ continue
+
+ if d1 != d2:
+ return False
+
+ # For mirror sets the devices can be in disorder.
+ if table1[2] == "mirror":
+ if set(table1sets) != set(table2sets):
+ return False
+
+ # For none mirror the devs have to be in order.
+ else:
+ for i in range(len(table1sets)):
+ if table1sets[i] != table2sets[i]:
+ return False
+
+ return True
+
class BlockDev:
def get_major(self):
return self._BlockDev__device.major
@@ -370,34 +433,11 @@ class MultiPath:

# we get "/dev/hda" from one and "3:0" from the other, so we have to
# fix up the device name
- def map_dev(path):
+ def munge_dev(path):
if path[0] != '/':
return path.strip()

- bd = path.strip()
- try:
- newpath=path.split('/')[-1]
- pos = 0
- dev = None
- num = None
- while pos < len(newpath):
- if newpath[pos].isdigit():
- dev = newpath[os]
- num = newpath[pos:]
- break
- pos += 1
- if dev is None:
- dev = newpath
- sysnewpath = None
- if num is None:
- sysnewpath = '/sys/block/%s/dev' % (dev,)
- else:
- sysnewpath = '/sys/block/%s/%s%s/dev' % (dev, dev, num)
- f = open(sysnewpath, 'r')
- l = f.readline()
- bd = l.strip()
- except:
- pass
+ bd = map_dev(path)
# starting with 2.6.17-1.2510.fc6 or so, there's an implicit
# minimum IOs of 1000, which gets _added_ to the line "dmsetup ls"
# shows. This sucks.
@@ -406,7 +446,7 @@ class MultiPath:
tableParts = [0, self.size, 'multipath']

params = '0 0 1 1 round-robin 0 %s 1 %s' % (len(self.bdevs),
- _string.join(map(map_dev, self.bdevs)))
+ _string.join(map(munge_dev, self.bdevs)))
tableParts.append(params)

import dm as _dm
@@ -658,69 +698,6 @@ class RaidSet:
pass
bdev = property(get_bdev, None, None, "block.BlockDev")

- # Helper function for get_map
- # The tables will be considered the same if, everything else being the
- # same, they contain the same sets of devices.
- def equal(self, table1, table2):
- def map_dev(path):
- if path[0] != '/':
- return path
-
- try:
- statinfo = _os.stat(path)
- if not _stat.S_ISBLK(statinfo.st_mode):
- return path
-
- return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
- except:
- return path
-
- table1 = table1.strip().split(' ')
- table2 = table2.strip().split(' ')
- table1sets = []
- table2sets = []
-
- # We do this to avoid the index out of range exception
- if len(table1) != len(table2):
- return False
-
- for i in range(len(table1)):
- d1 = map_dev(table1[i])
- d2 = map_dev(table2[i])
-
- # when at least one changes its a device.
- if (table1[i] != d1) or (table2[i] != d2):
- # The d{1,2} will always have the major:minor string
- # We also need what comes after the dev, the offset.
- try:
- table1sets.append("%s %s" % (d1, table1[i+1]))
- table2sets.append("%s %s" % (d2, table2[i+1]))
- i += 1
- except IndexError, msg:
- # The device must have an offset, if not its nonesense
- return False
- continue
-
- # these are not devices
- if d1 == d2:
- continue
-
- if d1 != d2:
- return False
-
- # For mirror sets the devices can be in disorder.
- if self.rs.type == "mirror":
- if set(table1sets) != set(table2sets):
- return False
-
- # For none mirror the devs have to be in order.
- else:
- for i in range(len(table1sets)):
- if table1sets[i] != table2sets[i]:
- return False
-
- return True
-
def get_map(self):
if not self._RaidSet__map is None:
return self._RaidSet__map
@@ -728,8 +705,7 @@ class RaidSet:
import dm as _dm

for map in _dm.maps():
- # XXX wtf? why's it have a space at the end sometimes?
- if self.equal(str(map.table), str(self.rs.dmTable)):
+ if compare_tables(map.table, self.rs.dmTable):
self._RaidSet__map = map
self.active = True
del _dm
--
1.6.1.3

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list




_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 
Old 02-25-2009, 10:29 PM
Joel Granados
 
Default PATCH: pyblock: Make the dmraid table compare function a global function

On Wed, Feb 25, 2009 at 07:31:40PM +0100, Hans de Goede wrote:
>
>
> Joel Granados wrote:
>> Patch looks good. Only one comment: I would leave map_dev as an inside
>> function to compare_tables. This would stress the point that it is
>> only used by this function. While we could leave it outside for it to
>> be uesed, I would prefer to avoid using it as it is not general enough.
>> I mean, map_dev might imply mapping major,minor to a dev path, or a dev
>> path to a mount point or something different of what is currently
>> implemented.
>>
>
> Actually I made it global because it was duplicated (for a similar but
> different use) in class BlockDev, if you look at the patch you'll see it
> removes that duplicate copy and directly calls map_dev now. so map_dev
> cannot be insided the compare_tables function as it is used outside it.

aha. I understand, missed that. Its ok then.
>
> Regards,
>
> Hans
>
>
>
>> regards.
>> On Tue, Feb 24, 2009 at 10:42:43PM +0100, Hans de Goede wrote:
>>> We are comparing tables in other places too, so make the dmraid table
>>> equal function a global function named compare_tables. This is a preparation
>>> patch for modifying the python code to match the C-code table handling changes.
>>> ---
>>> device.py | 158 ++++++++++++++++++++++++++-----------------------------------
>>> 1 files changed, 67 insertions(+), 91 deletions(-)
>>>
>>> diff --git a/device.py b/device.py
>>> index 34a361a..aae1204 100644
>>> --- a/device.py
>>> +++ b/device.py
>>> @@ -48,6 +48,69 @@ def removeDeviceMap(map):
>>> pass
>>> map.remove()
>>>
>>> +def map_dev(path):
>>> + if path[0] != '/':
>>> + return path
>>> +
>>> + try:
>>> + statinfo = _os.stat(path)
>>> + if not _stat.S_ISBLK(statinfo.st_mode):
>>> + return path
>>> +
>>> + return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
>>> + except:
>>> + return path
>>> +
>>> +# Helper function for get_map
>>> +# The tables will be considered the same if, everything else being the
>>> +# same, they contain the same sets of devices.
>>> +def compare_tables(table1, table2):
>>> + table1 = str(table1).strip().split(' ')
>>> + table2 = str(table2).strip().split(' ')
>>> + table1sets = []
>>> + table2sets = []
>>> +
>>> + # We do this to avoid the index out of range exception
>>> + if len(table1) != len(table2):
>>> + return False
>>> +
>>> + for i in range(len(table1)):
>>> + d1 = map_dev(table1[i])
>>> + d2 = map_dev(table2[i])
>>> +
>>> + # when at least one changes its a device.
>>> + if (table1[i] != d1) or (table2[i] != d2):
>>> + # The d{1,2} will always have the major:minor string
>>> + # We also need what comes after the dev, the offset.
>>> + try:
>>> + table1sets.append("%s %s" % (d1, table1[i+1]))
>>> + table2sets.append("%s %s" % (d2, table2[i+1]))
>>> + i += 1
>>> + except IndexError, msg:
>>> + # The device must have an offset, if not its nonesense
>>> + return False
>>> + continue
>>> +
>>> + # these are not devices
>>> + if d1 == d2:
>>> + continue
>>> +
>>> + if d1 != d2:
>>> + return False
>>> +
>>> + # For mirror sets the devices can be in disorder.
>>> + if table1[2] == "mirror":
>>> + if set(table1sets) != set(table2sets):
>>> + return False
>>> +
>>> + # For none mirror the devs have to be in order.
>>> + else:
>>> + for i in range(len(table1sets)):
>>> + if table1sets[i] != table2sets[i]:
>>> + return False
>>> +
>>> + return True
>>> +
>>> class BlockDev:
>>> def get_major(self):
>>> return self._BlockDev__device.major
>>> @@ -370,34 +433,11 @@ class MultiPath:
>>>
>>> # we get "/dev/hda" from one and "3:0" from the other, so we have to
>>> # fix up the device name
>>> - def map_dev(path):
>>> + def munge_dev(path):
>>> if path[0] != '/':
>>> return path.strip()
>>>
>>> - bd = path.strip()
>>> - try:
>>> - newpath=path.split('/')[-1]
>>> - pos = 0
>>> - dev = None
>>> - num = None
>>> - while pos < len(newpath):
>>> - if newpath[pos].isdigit():
>>> - dev = newpath[os]
>>> - num = newpath[pos:]
>>> - break
>>> - pos += 1
>>> - if dev is None:
>>> - dev = newpath
>>> - sysnewpath = None
>>> - if num is None:
>>> - sysnewpath = '/sys/block/%s/dev' % (dev,)
>>> - else:
>>> - sysnewpath = '/sys/block/%s/%s%s/dev' % (dev, dev, num)
>>> - f = open(sysnewpath, 'r')
>>> - l = f.readline()
>>> - bd = l.strip()
>>> - except:
>>> - pass
>>> + bd = map_dev(path)
>>> # starting with 2.6.17-1.2510.fc6 or so, there's an implicit
>>> # minimum IOs of 1000, which gets _added_ to the line "dmsetup ls"
>>> # shows. This sucks.
>>> @@ -406,7 +446,7 @@ class MultiPath:
>>> tableParts = [0, self.size, 'multipath']
>>>
>>> params = '0 0 1 1 round-robin 0 %s 1 %s' % (len(self.bdevs),
>>> - _string.join(map(map_dev, self.bdevs)))
>>> + _string.join(map(munge_dev, self.bdevs)))
>>> tableParts.append(params)
>>>
>>> import dm as _dm
>>> @@ -658,69 +698,6 @@ class RaidSet:
>>> pass
>>> bdev = property(get_bdev, None, None, "block.BlockDev")
>>>
>>> - # Helper function for get_map
>>> - # The tables will be considered the same if, everything else being the
>>> - # same, they contain the same sets of devices.
>>> - def equal(self, table1, table2):
>>> - def map_dev(path):
>>> - if path[0] != '/':
>>> - return path
>>> -
>>> - try:
>>> - statinfo = _os.stat(path)
>>> - if not _stat.S_ISBLK(statinfo.st_mode):
>>> - return path
>>> -
>>> - return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, )
>>> - except:
>>> - return path
>>> -
>>> - table1 = table1.strip().split(' ')
>>> - table2 = table2.strip().split(' ')
>>> - table1sets = []
>>> - table2sets = []
>>> -
>>> - # We do this to avoid the index out of range exception
>>> - if len(table1) != len(table2):
>>> - return False
>>> -
>>> - for i in range(len(table1)):
>>> - d1 = map_dev(table1[i])
>>> - d2 = map_dev(table2[i])
>>> -
>>> - # when at least one changes its a device.
>>> - if (table1[i] != d1) or (table2[i] != d2):
>>> - # The d{1,2} will always have the major:minor string
>>> - # We also need what comes after the dev, the offset.
>>> - try:
>>> - table1sets.append("%s %s" % (d1, table1[i+1]))
>>> - table2sets.append("%s %s" % (d2, table2[i+1]))
>>> - i += 1
>>> - except IndexError, msg:
>>> - # The device must have an offset, if not its nonesense
>>> - return False
>>> - continue
>>> -
>>> - # these are not devices
>>> - if d1 == d2:
>>> - continue
>>> -
>>> - if d1 != d2:
>>> - return False
>>> -
>>> - # For mirror sets the devices can be in disorder.
>>> - if self.rs.type == "mirror":
>>> - if set(table1sets) != set(table2sets):
>>> - return False
>>> -
>>> - # For none mirror the devs have to be in order.
>>> - else:
>>> - for i in range(len(table1sets)):
>>> - if table1sets[i] != table2sets[i]:
>>> - return False
>>> -
>>> - return True
>>> -
>>> def get_map(self):
>>> if not self._RaidSet__map is None:
>>> return self._RaidSet__map
>>> @@ -728,8 +705,7 @@ class RaidSet:
>>> import dm as _dm
>>>
>>> for map in _dm.maps():
>>> - # XXX wtf? why's it have a space at the end sometimes?
>>> - if self.equal(str(map.table), str(self.rs.dmTable)):
>>> + if compare_tables(map.table, self.rs.dmTable):
>>> self._RaidSet__map = map
>>> self.active = True
>>> del _dm
>>> --
>>> 1.6.1.3
>>>
>>> _______________________________________________
>>> Anaconda-devel-list mailing list
>>> Anaconda-devel-list@redhat.com
>>> https://www.redhat.com/mailman/listinfo/anaconda-devel-list
>>

--
Joel Andres Granados
Brno, Czech Republic, Red Hat.

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 05:06 PM.

VBulletin, Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright ©2007 - 2008, www.linux-archive.org