
\c           @   s   d  d l  Z  d d l m Z d d l Td  d l Z d  d l j Z d  d l m	 Z	 d  d l
 Z
 d  d l Z e j j   Z d e j f d     YZ d S(   iNi   (   t   hotplug(   t   *(   t   commandst
   DiskPluginc           B   s'  e  Z d  Z d   Z d   Z d   Z e d    Z d   Z d   Z	 d   Z
 d   Z d	   Z e d
    Z e d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d d  Z d   Z e d d e d    Z e d  e d   Z  e d d e d    Z! e d  e d   Z" e d  d e d!    Z# e d   e d"   Z$ d#   Z% d$   Z& e d% d e d&    Z' e d%  e d'   Z( e) d( d e d)    Z* d*   Z+ e d+ d e d,    Z, e d+  e d-   Z- RS(.   s'   
	Plugin for tuning options of disks.
	c         O   s   t  t |   j | |   d d d d d d d d d	 d
 d d g |  _ d d d d d d d d d d d	 d g |  _ t |  j  |  _ d |  _ d |  _ t	   |  _
 d  S(   Ni   i   i   i   i   i}   ii   iU   iF   i7   i   i   i    i   i   i   i   i   i   i   in   iZ   i<   i   g{Gz?(   t   superR   t   __init__t   _power_levelst   _spindown_levelst   lent   _levelst   _level_stepst   _load_smallestR   t   _cmd(   t   selft   argst   kwargs(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR      s    --		c         C   sz   t  t |   j   t |  _ t   |  _ x? |  j j d  D]+ } |  j	 |  r; |  j j
 | j  q; q; Wt   |  _ d  S(   Nt   block(   R   R   t   _init_devicest   Truet   _devices_supportedt   sett   _free_devicest   _hardware_inventoryt   get_devicest   _device_is_supportedt   addt   sys_namet   _assigned_devices(   R   t   device(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR      s    	c         C   s&   g  | D] } |  j  j d |  ^ q S(   NR   (   R   t
   get_device(   R   t   devicest   x(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_device_objects%   s    c         C   sI   | j  d k oH | j j d d   d k oH | j d  k pH | j j d k S(   Nt   diskt	   removablet   0t   scsit   virtiot   xen(   R$   R%   R&   (   t   device_typet
   attributest   gett   Nonet   parentt	   subsystem(   t   clsR   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR   (   s    c         C   s   |  j  j |  d |  j  d  S(   NR   (   R   t	   subscribet   _hardware_events_callback(   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _hardware_events_init/   s    c         C   s   |  j  j |   d  S(   N(   R   t   unsubscribe(   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _hardware_events_cleanup2   s    c         C   s;   |  j  |  s | d k r7 t t |   j | |  n  d  S(   Nt   remove(   R   R   R   R/   (   R   t   eventR   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR/   5   s    c         C   s?   | j  d  k	 r" | j  j |  n  t t |   j | |  d  S(   N(   t   _load_monitorR*   t
   add_deviceR   R   t   _added_device_apply_tuning(   R   t   instancet   device_name(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR7   9   s    c         C   s?   | j  d  k	 r" | j  j |  n  t t |   j | |  d  S(   N(   R5   R*   t   remove_deviceR   R   t   _removed_device_unapply_tuning(   R   R8   R9   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR;   >   s    c         C   s5   i t  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6S(   Nt   dynamict   elevatort   apmt   spindownt	   readaheadt   readahead_multiplyt   scheduler_quantum(   R   R*   (   R-   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_config_optionsC   s    c         C   s
   d d g S(   NR>   R?   (    (   R-   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt#   _get_config_options_used_by_dynamicO   s    c         C   s   t  | _ d |  _ d |  _ |  j | j d  r| t  | _ |  j j d | j	  | _
 i  | _ i  | _ i  | _ i  | _ n t | _ d  | _
 d  S(   Ni    R<   R!   (   R   t   _has_static_tuningt   _apm_errcntt   _spindown_errcntt   _option_boolt   optionst   _has_dynamic_tuningt   _monitors_repositoryt   createt   assigned_devicesR5   t   _device_idlet   _statst   _idlet   _spindown_change_delayedt   FalseR*   (   R   R8   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _instance_initV   s    									c         C   s2   | j  d  k	 r. |  j j | j   d  | _  n  d  S(   N(   R5   R*   RK   t   delete(   R   R8   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _instance_cleanupi   s    c         C   s   | r d } |  j  } n d } |  j } | t j k r: d  S| d k rO d } ne | t j k r t j d |  _  |  _ t j d  d  S| d 7} | t j k r t j d |  n  | r | |  _  n	 | |  _ d  S(   NR?   R>   i    i   sI   hdparm command not found, ignoring future set_apm / set_spindown commandss5   disabling set_%s command: too many consecutive errors(	   RG   RF   t   constst   ERROR_THRESHOLDt   errnot   ENOENTt   logt   warnt   info(   R   t   rcR?   t   st   cnt(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _update_errcntn   s&    		
c         C   sg   t  j d |  |  j j d d | d | g d t j g \ } } |  j | t  t | j	 | <d  S(   Ns   changing spindown to %dt   hdparms   -S%ds   /dev/%st	   no_errors(
   RZ   t   debugR   t   executeRX   RY   R`   R   RR   RQ   (   R   R8   R   t   new_spindown_levelR]   t   out(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _change_spindown   s    5c         C   sG   |  j  j d d d | g d t j g \ } } d | k oF d | k S(   NRa   s   -Cs   /dev/%sRb   t   standbyt   sleeping(   R   Rd   RX   RY   (   R   R   R]   Rf   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _drive_spinning   s    1c         C   s  | j  j |  } | d  k r" d  S| | j k rD |  j | |  n  |  j | | |  |  j | |  | j | } | j | } | d d |  j k  r | d |  j	 k r | d |  j	 k r d } n? | d d k r | d d k s | d d k r d } n d } | d k r,| d c | 7<|  j
 | d } |  j | d } t j d | d  |  j t j k  r|  j |  r| d k rt j d |  t | j | <q|  j | | |  n  |  j t j k  rot j d	 |  |  j j d
 d | d | g d t j g \ }	 }
 |  j |	 t  qonC | j | ro|  j |  ro|  j | d } |  j | | |  n  t j d | | d | d f  t j d | | d | d | d f  d  S(   Nt   leveli   t   readt   writei    is   tuning level changed to %ds;   delaying spindown change to %d, drive has already spun downs   changing APM_level to %dRa   s   -B%ds   /dev/%sRb   s    %s load: read %0.2f, write %0.2fs$   %s idle: read %d, write %d, level %d(   R5   t   get_device_loadR*   RO   t   _init_stats_and_idlet   _update_statst   _update_idleRP   R	   R
   R   R   RZ   Rc   RG   RV   RW   Rj   R   RQ   Rg   RF   R   Rd   RX   RY   R`   RR   (   R   R8   R   t   loadt   statst   idlet   level_changet   new_power_levelRe   R]   Rf   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _instance_update_dynamic   sB    =	0	5"c         C   sj   i d d g d 6d d g d 6d d g d 6| j  | <i d d 6d d 6d d	 6| j | <t | j | <d  S(
   Ni   i    t   newt   oldi   t   maxRk   Rl   Rm   (   RO   RP   RR   RQ   (   R   R8   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRo      s    7"c   
      C   s  | j  | d | j  | d <} | | j  | d <g  t | |  D] } | d | d ^ qA } | | j  | d <| j  | d } g  t | |  D] } t |  ^ q }	 |	 | j  | d <t | d  t |	 d  | j  | d <t | d  t |	 d  | j  | d	 <d  S(
   NRx   Ry   i    i   t   diffRz   Rl   i   Rm   (   RO   t   zipRz   t   float(
   R   R8   R   t   new_loadt   old_loadt   new_oldR{   t   old_max_loadt   pairt   max_load(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRp      s     .()c         C   s`   xY d d g D]K } | j  | | |  j k  rG | j | | c d 7<q d | j | | <q Wd  S(   NRl   Rm   i   i    (   RO   R   RP   (   R   R8   R   t	   operation(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRq      s    c         C   s   d  S(   N(    (   R   R8   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _instance_unapply_dynamic   s    s   /sys/block/c         C   s_   d | k rI t  j j | | j d d  |  } t  j j |  rI | Sn  t  j j | | |  S(   Nt   /t   !(   t   ost   patht   joint   replacet   exists(   R   R   t   suffixt   prefixt   dev(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _sysfs_path   s
    $c         C   s   |  j  | d  S(   Ns   queue/scheduler(   R   (   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _elevator_file   s    R=   t
   per_devicec         C   s/   |  j  |  } | s+ |  j j | |  n  | S(   N(   R   R   t   write_to_file(   R   t   valueR   t   simt   sys_file(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _set_elevator   s    c         C   s1   |  j  |  } |  j j |  j j | d |  S(   Nt   no_error(   R   R   t   get_active_optiont	   read_file(   R   R   t   ignore_missingR   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_elevator   s    R>   c         C   sw   |  j  t j k  ro | se |  j j d d t |  d | g d t j g \ } } |  j | t	  n  t |  Sd  Sd  S(   NRa   s   -Bs   /dev/Rb   (   RF   RV   RW   R   Rd   t   strRX   RY   R`   RR   R*   (   R   R   R   R   R]   Rf   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _set_apm   s    :
c         C   s   d  } t } |  j j d d d | g d t j g \ } } | t j k rQ d  S| d k rf t } nT t j d | t j	  } | r y t
 | j d   } Wq t k
 r t } q Xn  | r t j d |  n  | S(	   NRa   s   -Bs   /dev/Rb   i    s   .*=\s*(\d+).*i   s2   could not get current APM settings for device '%s'(   R*   RR   R   Rd   RX   RY   R   t   ret   matcht   St   intt   groupt
   ValueErrorRZ   t   error(   R   R   R   R   t   errR]   Rf   t   m(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_apm  s     1	R?   c         C   sw   |  j  t j k  ro | se |  j j d d t |  d | g d t j g \ } } |  j | t	  n  t |  Sd  Sd  S(   NRa   s   -Ss   /dev/Rb   (   RG   RV   RW   R   Rd   R   RX   RY   R`   R   R*   (   R   R   R   R   R]   Rf   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _set_spindown  s    :
c         C   s   d S(   Ni   (    (   R   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_spindown!  s    c         C   s   |  j  | d  S(   Ns   queue/read_ahead_kb(   R   (   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _readahead_file&  s    c         C   s_   t  |  j d  d  } t | d  } t |  d k r[ | d d d k r[ | d :} n  | S(   Ni   i    R^   i   (   R   t   splitR*   R   R   (   R   R   t   valt   v(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt	   _parse_ra)  s
    &R@   c         C   sB   |  j  |  } |  j |  } | s> |  j j | d |  n  | S(   Ns   %d(   R   R   R   R   (   R   R   R   R   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _set_readahead1  s
    c         C   sM   |  j  |  } |  j j | d | j   } t |  d k rC d  St |  S(   NR   i    (   R   R   R   t   stripR   R*   R   (   R   R   R   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_readahead9  s
    RA   c   	      C   s   | r
 d  S|  j d d d |  } | r |  j |  } | d  k rG d  St t |  |  } |  j j | |  |  j | | t  nE |  j j	 |  } | d  k r d  S|  j | | t  |  j j
 |  d  S(   Nt   command_nameRA   R9   (   R*   t   _storage_keyR   R   R}   t   _storageR   R   RR   R)   t   unset(	   R   t   enablingt
   multiplierR   t   verifyR   t   storage_keyt   old_readaheadt   new_readahead(    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _multiply_readaheadA  s"    		c         C   s   |  j  | d  S(   Ns   queue/iosched/quantum(   R   (   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _scheduler_quantum_fileV  s    RB   c         C   s9   |  j  |  } | s5 |  j j | d t |   n  | S(   Ns   %d(   R   R   R   R   (   R   R   R   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _set_scheduler_quantumY  s     c         C   sc   |  j  |  } |  j j | d | j   } t |  d k rY | sU t j d  n  d  St |  S(   NR   i    s9   disk_scheduler_quantum option is not supported by this HW(	   R   R   R   R   R   RZ   R\   R*   R   (   R   R   R   R   R   (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   _get_scheduler_quantum`  s    (.   t   __name__t
   __module__t   __doc__R   R   R    t   classmethodR   R0   R2   R/   R7   R;   RC   RD   RS   RU   R`   Rg   Rj   Rw   Ro   Rp   Rq   R   R   R   t   command_setR   R   t   command_getRR   R   R   R   R   R   R   R   R   R   t   command_customR   R   R   R   (    (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR      sV   	
	
												0						
	
						(   RX   t    R    t
   decoratorst
   tuned.logst   tunedt   tuned.constsRV   t   tuned.utils.commandsR   R   R   t   logsR)   RZ   t   PluginR   (    (    (    s=   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt   <module>   s   
