2Yc@sddlZddlZddlTddlZddljZddlmZddl Z ddl Z ej j Z dejfdYZdS(iN(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 Ost|j|j||ddddddddd d d d g |_d dddddddddd dg |_t|j|_d|_d|_t |_ dS(Niiiiii}iiiUiFi7iiiiiiiiiiiniZi<ig{Gz?( tsupert __class__t__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--  cCsgt|_t|_x?|jjdD]+}|j|r(|jj|jq(q(Wt|_ dS(Ntblock( tTruet_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.pyt _init_devicess   cstfd|S(Ncsjjd|S(NR(Rt get_device(tx(R (s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt%s(tmap(R tdevices((R 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_cleanup1scCs2|j|r.t|j|j||ndS(N(RRRR1(R teventR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR14scCsB|jdk r"|jj|nt|j|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.pyR88scCsB|jdk r"|jj|nt|j|j||dS(N(R6R,t remove_deviceRRt_removed_device_unapply_tuning(R R9R:((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_optionsBscCs ddgS(NR?R@((R/((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt#_get_config_options_used_by_dynamicNscCst|_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_repositorytcreateR!R6t _device_idlet_statst_idlet_spindown_change_delayedtFalseR,(R R9((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_initUs         cCs2|jdk r.|jj|jd|_ndS(N(R6R,RLtdelete(R R9((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_cleanupfscCs|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( RHRGtconststERROR_THRESHOLDterrnotENOENTtlogtwarntinfo(R trcR@tstcnt((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_update_errcntks&       cCsgtjd||jjdd|d|gdtjg\}}|j|tt|j |t per_devicecCs/|j|}|s+|jj||n|S(N(RR t write_to_file(R tvalueRtsimtsys_file((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt _set_elevatorscCs1|j|}|jj|jj|d|S(Ntno_error(RR tget_active_optiont read_file(R Rtignore_missingR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt _get_elevatorsR?cCsw|jtjkro|se|jjddt|d|gdtjg\}}|j|t nt|SdSdS(NRas-Bs/dev/Rb( RGRVRWR 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( RHRVRWR 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_spindownscCs|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 & RAcCsB|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_readahead.s 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_readahead6s RBc Cs|r dS|jd|}|r|j|}|dkrAdStt||}|jj|||j||tnE|jj |}|dkrdS|j||t|jj |dS(NRB( R,t _storage_keyRRRt_storageRRRRR+tunset( R tenablingt multiplierRtverifyRt storage_keyt old_readaheadt new_readahead((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_multiply_readahead>s  cCs|j|dS(Nsqueue/iosched/quantum(R(R R((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_scheduler_quantum_fileQsRCcCs9|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_quantumTs 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 classmethodRR2R4R1R8R<RDRERSRUR`RgRjRwRoRpRqRRRt command_setRRt command_getRRRRRRRRRRRtcommand_customRRRR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR sV             0              (RXthotplugt decoratorst tuned.logsttunedt tuned.constsRVttuned.utils.commandsRRRtlogsR+RZtPluginR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyts