\c@sddlZddlmZddlTddlZddljZddlm Z ddl Z ddl Z ej j ZdejfdYZdS(iNi(thotplug(t*(tcommandst DiskPlugincBs'eZdZdZdZdZedZdZdZ dZ dZ d Z ed Z ed Zd Zd ZdZdZdZdZdZdZdZdZddZdZeddedZededZ eddedZ!ededZ"ed ded!Z#ed ed"Z$d#Z%d$Z&ed%ded&Z'ed%ed'Z(e)d(ded)Z*d*Z+ed+ded,Z,ed+ed-Z-RS(.s' Plugin for tuning options of disks. c Ostt|j||ddddddddd d d d g |_d dddddddddd dg |_t|j|_d|_d|_t |_ dS(Niiiiii}iiiUiFi7iiiiiiiiiiiniZi<ig{Gz?( tsuperRt__init__t _power_levelst_spindown_levelstlent_levelst _level_stepst_load_smallestRt_cmd(tselftargstkwargs((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs--  cCsztt|jt|_t|_x?|jjdD]+}|j |r;|jj |j q;q;Wt|_ dS(Ntblock( RRt _init_devicestTruet_devices_supportedtsett _free_devicest_hardware_inventoryt get_devicest_device_is_supportedtaddtsys_namet_assigned_devices(R tdevice((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs  cCs&g|D]}|jjd|^qS(NR(Rt get_device(R tdevicestx((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_device_objects%scCsI|jdkoH|jjdddkoH|jdkpH|jjdkS(Ntdiskt removablet0tscsitvirtiotxen(R$R%R&(t device_typet attributestgettNonetparentt subsystem(tclsR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR(scCs|jj|d|jdS(NR(Rt subscribet_hardware_events_callback(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_init/scCs|jj|dS(N(Rt unsubscribe(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_cleanup2scCs;|j|s|dkr7tt|j||ndS(Ntremove(RRRR/(R teventR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR/5scCs?|jdk r"|jj|ntt|j||dS(N(t _load_monitorR*t add_deviceRRt_added_device_apply_tuning(R tinstancet device_name((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR79scCs?|jdk r"|jj|ntt|j||dS(N(R5R*t remove_deviceRRt_removed_device_unapply_tuning(R R8R9((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR;>scCs5itd6dd6dd6dd6dd6dd6dd6S(Ntdynamictelevatortapmtspindownt readaheadtreadahead_multiplytscheduler_quantum(RR*(R-((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_config_optionsCscCs ddgS(NR>R?((R-((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt#_get_config_options_used_by_dynamicOscCst|_d|_d|_|j|jdr|t|_|jjd|j |_ i|_ i|_ i|_ i|_nt|_d|_ dS(NiR<R!(Rt_has_static_tuningt _apm_errcntt_spindown_errcntt _option_booltoptionst_has_dynamic_tuningt_monitors_repositorytcreatetassigned_devicesR5t _device_idlet_statst_idlet_spindown_change_delayedtFalseR*(R R8((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_initVs          cCs2|jdk r.|jj|jd|_ndS(N(R5R*RKtdelete(R R8((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_cleanupiscCs|rd}|j}nd}|j}|tjkr:dS|dkrOd}ne|tj krtjd|_|_tjddS|d7}|tjkrtjd|n|r||_n ||_dS(NR?R>iisIhdparm command not found, ignoring future set_apm / set_spindown commandss5disabling set_%s command: too many consecutive errors( RGRFtconststERROR_THRESHOLDterrnotENOENTtlogtwarntinfo(R trcR?tstcnt((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_update_errcntns&       cCsgtjd||jjdd|d|gdtjg\}}|j|tt|j |cCsw|jtjkro|se|jjddt|d|gdtjg\}}|j|t nt|SdSdS(NRas-Bs/dev/Rb( RFRVRWR RdtstrRXRYR`RRR*(R RRRR]Rf((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_apms : cCsd}t}|jjddd|gdtjg\}}|tj krQdS|dkrft}nTtjd|tj }|ryt |j d}Wqt k rt}qXn|rt jd|n|S( NRas-Bs/dev/Rbis .*=\s*(\d+).*is2could not get current APM settings for device '%s'(R*RRR RdRXRYRtretmatchtStinttgroupt ValueErrorRZterror(R RRRterrR]Rftm((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_apms 1    R?cCsw|jtjkro|se|jjddt|d|gdtjg\}}|j|t nt|SdSdS(NRas-Ss/dev/Rb( RGRVRWR RdRRXRYR`RR*(R RRRR]Rf((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt _set_spindowns : cCsdS(Ni((R RR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt _get_spindown!scCs|j|dS(Nsqueue/read_ahead_kb(R(R R((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_readahead_file&scCs_t|jdd}t|d}t|dkr[|dddkr[|d:}n|S(NiiR^i(RtsplitR*RR(R Rtvaltv((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt _parse_ra)s & R@cCsB|j|}|j|}|s>|jj|d|n|S(Ns%d(RRR R(R RRRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_readahead1s cCsM|j|}|jj|d|j}t|dkrCdSt|S(NRi(RR RtstripRR*R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_readahead9s RAc Cs|r dS|jddd|}|r|j|}|dkrGdStt||}|jj|||j||tnE|jj |}|dkrdS|j||t|jj |dS(Nt command_nameRAR9( R*t _storage_keyRRR}t_storageRRRRR)tunset( R tenablingt multiplierRtverifyRt storage_keyt old_readaheadt new_readahead((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_multiply_readaheadAs"    cCs|j|dS(Nsqueue/iosched/quantum(R(R R((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_scheduler_quantum_fileVsRBcCs9|j|}|s5|jj|dt|n|S(Ns%d(RR RR(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_scheduler_quantumYs cCsc|j|}|jj|d|j}t|dkrY|sUtjdndSt|S(NRis9disk_scheduler_quantum option is not supported by this HW( RR RRRRZR\R*R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_scheduler_quantum`s(.t__name__t __module__t__doc__RRR t classmethodRR0R2R/R7R;RCRDRSRUR`RgRjRwRoRpRqRRRt command_setRRt command_getRRRRRRRRRRRtcommand_customRRRR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR sV             0              (RXtRt decoratorst tuned.logsttunedt tuned.constsRVttuned.utils.commandsRRRtlogsR)RZtPluginR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyts