Patch title: Release 94 bulk changes
Abstract:
File: /pliant/linux/storage/raid.pli
Key:
    Removed line
    Added line
   
abstract
  [The 'raid_convert' function will allow you to change the 
  highlight "THIS IS VERY ALPHA CODE: IT MAY DESTROY ALL YOU
 


abstract
  [The 'raid_convert' function will allow you to change the 
  highlight "THIS IS VERY ALPHA CODE: IT MAY DESTROY ALL YOU
 


# release 5
# release 6


constant conservative true
constant speed_report true


constant conservative true
constant speed_report true
constant mdadm (file_query "file:/bin/mdadm" standard)=success



method raid start -> status
  arg Raid raid ; arg Status status



method raid start -> status
  arg Raid raid ; arg Status status
  status := raid command "raidstart" "" ""
  if mdadm
    var Str cmd := "mdadm --assemble "+(file_os_name raid:device_name)
    for (var Int i) 0 raid:devices:size-1
      cmd += " "+(file_os_name raid:devices:i:name)
    status := shunt (execute cmd)=0 status failure
  else
    status := raid command "raidstart" "" ""

method raid stop -> status
  arg Raid raid ; arg Status status

method raid stop -> status
  arg Raid raid ; arg Status status
  status := raid command "raidstop" "" ""
  if mdadm
    status := shunt (execute "mdadm --stop "+(file_os_name raid:device_name))=0 status failure
  else
    status := raid command "raidstop" "" ""

method raid initialize -> status
  arg Raid raid ; arg Status status
  raid command "raidstop" "" ""

method raid initialize -> status
  arg Raid raid ; arg Status status
  raid command "raidstop" "" ""
  var FileInfo mtab := file_query "file:/etc/mtab" standard
  if mtab=undefined # get around the bug in raidtools
    (var Stream s) open "file:/etc/mtab" out+mkdir+safe
    s close
  status := raid command "mkraid" "--really-force" ""
  if mtab=undefined
    file_delete "file:/etc/mtab"
    file_delete "file:/etc/"
  if mdadm
    var Str cmd := "mdadm --create "+(file_os_name raid:device_name)
    cmd += " --level="+(string raid:level)+" --raid-devices="+(string raid:devices:size)+" --spare-devices="+(string raid:sparse)+" --chunk="+(string raid:chunk_size\1024)
    cmd += " --run"
    for (var Int i) 0 raid:devices:size-1
      cmd += " "+(file_os_name raid:devices:i:name)
    status := shunt (execute cmd)=0 status failure
  else
    var FileInfo mtab := file_query "file:/etc/mtab" standard
    if mtab=undefined # get around the bug in raidtools
      (var Stream s) open "file:/etc/mtab" out+mkdir+safe
      s close
    status := raid command "mkraid" "--really-force" ""
    if mtab=undefined
      file_delete "file:/etc/mtab"
      file_delete "file:/etc/"

method raid hotadd device -> status
  arg Raid raid ; arg Str device ; arg Status status

method raid hotadd device -> status
  arg Raid raid ; arg Str device ; arg Status status
  status := raid command "raidhotadd" "" "/dev/"+device
  if mdadm
    status := shunt (execute "mdadm "+(file_os_name raid:device_name)+" -add /dev/"+device)=0 status failure
  else
    status := raid command "raidhotadd" "" "/dev/"+device






# Sample recovery :
#
# module "/pliant/linux/storage/raid.pli"
# (gvar Raid r) define "md0" "sda1 sdb1" "" 
# r hotadd "sda1"


#-----------------------------------------------------------
  

if false
  
  doc
    para
      [All the rest of the script is just for building a sam
    ['raid_configure' will write the /etc/raidtab file with 
    [Since this function will destroy existing configuration
  
  function raid_configure raid_device devices_names level ch
    arg Str raid_device devices_names ; arg Int level chunks
    var Str dev := shunt (raid_device search ":" -1)=(-1) "d
    var Array:Str devices
    var Str names := devices_names
    while names<>""
      if (names parse any:(var Str name1) _ any:(var Str nam
        devices += shunt (name1 search ":" -1)=(-1) "device:
        names := name2
      else
        devices += shunt (names search ":" -1)=(-1) "device:
        names := ""
    (var Stream rt) open filename out
    rt writeline "raiddev "+file_os_name:dev
    rt writeline "  raid-level "+string:level
    rt writeline "  nr-raid-disks "+(string devices:size)
    rt writeline "  nr-spare-disks 0"
    rt writeline "  persistent-superblock 1"
    rt writeline "  chunk-size "+(string chunksize\1024)
    for (var Int i) 0 devices:size-1
      rt writeline "  device "+(file_os_name devices:i)
      rt writeline "  raid-disk "+string:i
  
  function raid_configure raid_device devices_names level ch
    arg Str raid_device devices_names ; arg Int level chunks
    if (file_query "file:/etc/raidtab" standard)=defined and
      file_copy "file:/etc/raidtab" "file:/etc/raidtab.backu
      console "Your /etc/raidtab file has been saved to /etc
    raid_configure raid_device devices_names level chunksize
  
  doc
    [Wait's for the resync to finish in the kernel.]
  
  function raid_wait
    while true
      var CBool more := false
      (var Stream s) open "file:/proc/mdstat" in
      while not s:atend
        if (s:readline search "resync" -1)<>-1
          more := true
      if not more
        return
      s close
      console "waiting for raid resync[cr]"
      sleep 60
      console "                       [cr]"
  
  
  doc
    [These two functions are simply generating a sample file
  
  function generate_file name size
    arg Str name ; arg Int size
    console "generating a " size\2^20 " MB test file" eol
    (var Stream s) open name out
    for (var Int i) 1 size\Int:size
      s raw_write addressof:i Int:size
    s close
      
  function check_file name size
    arg Str name ; arg Int size
    console "checking the " size\2^20 " MB test file" eol
    (var Stream s) open name in
    for (var Int i) 1 size\Int:size
      s raw_read addressof:(var Int j) Int:size
      if j<>i
        error error_id_corrupted "The test file is corrupted
      
  
  doc
    [This is my test process. It will build a RAID array, th
    [If you want to use it, you have to update the constants
    [If you get 'sample test passed.' message at the end, th
  
  function run_sample_raid_test
    constant raid_device "md0"
    constant initial_devices "hda5 hda6 hda7"
    constant initial_raid_level 5
    constant initial_chunksize 16*2^10
    constant final_devices "hda5 hda6 hda7 hda8"
    constant final_raid_level 5
    constant final_chunksize 64*2^10
    constant test_file_size 64*2^20
    constant doit false
    # do not allow to run this test if the constants have no
    # order to match site test configuration
    if not doit
      console "You must update the constants at the top of f
      return
    var Str dev := shunt (raid_device search ":" -1)=(-1) "d
    warn "You are attempting to run raid test reconfigure ut
    # initial cleanup
    filesystem_dismount "file:/mnt/raid"
    execute "raidstop "+file_os_name:dev quiet
    # create a sample raid
    raid_configure raid_device initial_devices initial_raid_
    execute "mkraid --really-force "+file_os_name:dev quiet
    raid_wait
    format_partition dev "name [dq]test[dq]"
    filesystem_mount dev "file:/mnt/raid/" ""
    file_copy "/" "file:/mnt/raid/pliant/" extended+recursiv
    execute "tar -zc -f /mnt/raid/pliant.tgz /pliant/"
    generate_file "file:/mnt/raid/test" test_file_size
    filesystem_dismount dev
    # now convert it
    var Array:Str deads := raid_convert raid_device initial_
    raid_configure raid_device final_devices final_raid_leve
    execute "mkraid --really-force --dangerous-no-resync "+f
    for (var Int i) 0 deads:size-1
      execute "raidhotremove "+file_os_name:dev+" "+deads:i 
    # and finally test it
    filesystem_mount dev "file:/mnt/raid/" ""
    if (execute "tar -ztv -f /mnt/raid/pliant.tgz" quiet)<>0
      error "The tar file is corrupted" ?
    check_file "file:/mnt/raid/test" test_file_size ?
    # final cleanup
    filesystem_dismount dev
    execute "raidstop "+file_os_name:dev quiet
    console "sample test passed." eol
  
  export run_sample_raid_test
#-----------------------------------------------------------
  

if false
  
  doc
    para
      [All the rest of the script is just for building a sam
    ['raid_configure' will write the /etc/raidtab file with 
    [Since this function will destroy existing configuration
  
  function raid_configure raid_device devices_names level ch
    arg Str raid_device devices_names ; arg Int level chunks
    var Str dev := shunt (raid_device search ":" -1)=(-1) "d
    var Array:Str devices
    var Str names := devices_names
    while names<>""
      if (names parse any:(var Str name1) _ any:(var Str nam
        devices += shunt (name1 search ":" -1)=(-1) "device:
        names := name2
      else
        devices += shunt (names search ":" -1)=(-1) "device:
        names := ""
    (var Stream rt) open filename out
    rt writeline "raiddev "+file_os_name:dev
    rt writeline "  raid-level "+string:level
    rt writeline "  nr-raid-disks "+(string devices:size)
    rt writeline "  nr-spare-disks 0"
    rt writeline "  persistent-superblock 1"
    rt writeline "  chunk-size "+(string chunksize\1024)
    for (var Int i) 0 devices:size-1
      rt writeline "  device "+(file_os_name devices:i)
      rt writeline "  raid-disk "+string:i
  
  function raid_configure raid_device devices_names level ch
    arg Str raid_device devices_names ; arg Int level chunks
    if (file_query "file:/etc/raidtab" standard)=defined and
      file_copy "file:/etc/raidtab" "file:/etc/raidtab.backu
      console "Your /etc/raidtab file has been saved to /etc
    raid_configure raid_device devices_names level chunksize
  
  doc
    [Wait's for the resync to finish in the kernel.]
  
  function raid_wait
    while true
      var CBool more := false
      (var Stream s) open "file:/proc/mdstat" in
      while not s:atend
        if (s:readline search "resync" -1)<>-1
          more := true
      if not more
        return
      s close
      console "waiting for raid resync[cr]"
      sleep 60
      console "                       [cr]"
  
  
  doc
    [These two functions are simply generating a sample file
  
  function generate_file name size
    arg Str name ; arg Int size
    console "generating a " size\2^20 " MB test file" eol
    (var Stream s) open name out
    for (var Int i) 1 size\Int:size
      s raw_write addressof:i Int:size
    s close
      
  function check_file name size
    arg Str name ; arg Int size
    console "checking the " size\2^20 " MB test file" eol
    (var Stream s) open name in
    for (var Int i) 1 size\Int:size
      s raw_read addressof:(var Int j) Int:size
      if j<>i
        error error_id_corrupted "The test file is corrupted
      
  
  doc
    [This is my test process. It will build a RAID array, th
    [If you want to use it, you have to update the constants
    [If you get 'sample test passed.' message at the end, th
  
  function run_sample_raid_test
    constant raid_device "md0"
    constant initial_devices "hda5 hda6 hda7"
    constant initial_raid_level 5
    constant initial_chunksize 16*2^10
    constant final_devices "hda5 hda6 hda7 hda8"
    constant final_raid_level 5
    constant final_chunksize 64*2^10
    constant test_file_size 64*2^20
    constant doit false
    # do not allow to run this test if the constants have no
    # order to match site test configuration
    if not doit
      console "You must update the constants at the top of f
      return
    var Str dev := shunt (raid_device search ":" -1)=(-1) "d
    warn "You are attempting to run raid test reconfigure ut
    # initial cleanup
    filesystem_dismount "file:/mnt/raid"
    execute "raidstop "+file_os_name:dev quiet
    # create a sample raid
    raid_configure raid_device initial_devices initial_raid_
    execute "mkraid --really-force "+file_os_name:dev quiet
    raid_wait
    format_partition dev "name [dq]test[dq]"
    filesystem_mount dev "file:/mnt/raid/" ""
    file_copy "/" "file:/mnt/raid/pliant/" extended+recursiv
    execute "tar -zc -f /mnt/raid/pliant.tgz /pliant/"
    generate_file "file:/mnt/raid/test" test_file_size
    filesystem_dismount dev
    # now convert it
    var Array:Str deads := raid_convert raid_device initial_
    raid_configure raid_device final_devices final_raid_leve
    execute "mkraid --really-force --dangerous-no-resync "+f
    for (var Int i) 0 deads:size-1
      execute "raidhotremove "+file_os_name:dev+" "+deads:i 
    # and finally test it
    filesystem_mount dev "file:/mnt/raid/" ""
    if (execute "tar -ztv -f /mnt/raid/pliant.tgz" quiet)<>0
      error "The tar file is corrupted" ?
    check_file "file:/mnt/raid/test" test_file_size ?
    # final cleanup
    filesystem_dismount dev
    execute "raidstop "+file_os_name:dev quiet
    console "sample test passed." eol
  
  export run_sample_raid_test