Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
python3-s3fuse-plugin / usr / lib / python3.6 / site-packages / s3fuse / __pycache__ / s3vaultfuse.cpython-36.pyc
Size: Mime:
3

䓍a#JãK@s®dZddlZddlZddlZddlZddlZddlmZddlZddlZddl	Z	ddl
Z
ddlZddlZddlm
Z
ddlmZddlmZddlmZyddlmZmZWn$ek
rÐddlmZmZYnXddlmZdd	lmZydd
lmZmZmZWn dd
lmZmZmZYnXddlTddlZyddl m!Z!Wn"ek
rfddl"m!Z!YnXdd
l#m$Z%ddl&m'Z'ddl(m)Z)ddl(m*Z*dZ+dZ,dZ-dZ.e!j/ddddde!j/dddddgZ0e!j1dddd e!j1d!dd"d e!j1d#dd$d e!j1d%dd&d'd(e!j1d)e+d*d+d(e!j1d,dd-d.d/e!j1d0d1d2d3e!j/d4dd5d6e!j1d7d8d9d6g	Z2e!j/d:d;d<d6e!j/d=dd>d6e!j/d?dd@d6e!j/dAddBd6e!j3dCdDdEd6gZ4e!j3dFdGdHd6e!j3dIdJdKd6e!j1dLdMdNd6e!j1dOdPdQd6e!j1dRdSdTd6e!j1dUdVdWd6e!j1dXdYdZd6e!j1d[d\d]d6e!j5d^d_d`dadbdcddgded6e!j/dfddgd6e!j/dhddid6e!j1djdkdld6e!j1dmdkdnd6e!j3doddpd6gZ6e!j1dqdrdsd6e!j1dtdudve!j1dwdxdud6e!j1dydzd{d6e!j3d|e-d}d6e!j3d~e.dd6e!j3d€dd‚d6e!j3dƒdâd†d6e!j3d‡ddˆd6e!j1d‰dŠdd‹d(e!j1dŒddŽd6e!j1ddd‘d6e!j1d’dd“d6e!j1d”dd•d6e!j1d–dd—d6e!j1d˜dd™d6e!j1dše'ƒd›d6e!j1dœddžd6e!j1dŸd d¡d6e!j1d¢d£d¤d6e!j1d¥d£d¦d6e!j1d§d¨d©d6e!j1dªd«d¬d6e!j1d­d®d¯d6e!j1d°d±d²d6e!j/d³dd´d6gZ7e!j8Z8e8j9e7ƒe8j:e2ƒe8j:e4ƒe8j:e6ƒe8j:e0ƒye;ej<dµƒZ=e8e=gƒWne8ej>dDd…ƒYnXd¶e8j?ƒkrtdd·l@mAZAnddl(m)ZAe%jBe!j8e8jCjDƒƒe%jEe8jCjDƒƒZFed¸d¹ZGyre8jHjDƒdkrÐeFjIjJe%jKƒnNe8jHjDƒdºkrðeFjIjJe%jLƒn.e8jHjDƒd»kreFjIjJe%jMƒneFjIjJe%jNƒWn&eOk
rFeFjIjJe%j%jNƒYnXddDgd¼dddddddddddddd½œ
d;dddej<jPd¾ƒej<jPd¿ƒej<jPddddd;dddddddddgddd;ddd;dÁdÁdÁdÁdddœ&ZQejRƒZSdÃdĄZTdÅdƄZUdÁZVd¸ZWddlXZXeXjYƒZZej[ej\ƒƒj]Z^dÇZ_ia`dÈZadÉdʄZbdËd̄ZcdÍd΄ZdGdÏdЄdЃZeGdÑd҄dÒefƒZgGdÓdԄdÔegƒZhGdÕdքdÖefƒZiGd×d؄dØeƒZjdãdÚdۄZkdÜd݄ZldÞd߄ZmendàkrªemƒdS)äad Trilio Fuse plugin implimentation

    This module is based on the vaultfuse.py module and will eventually
    become the new vaultfuse.py module once integration and refactoring
    of the existing vaultswift.py is complete.

    Currently this module is temporary for the 2.6 release and will be merged
    into a new vaultfuse.py for the next release.
éN)Údatetime)ÚThread)ÚBoundedSemaphore)Úmkstemp)Úgetpwnam)ÚQueueÚEmpty)ÚLRUCache)ÚFUSEÚFuseOSErrorÚ
Operations)Ú*)Úcfg)Úlog)Úget_ssl_cert_path)Úutils)Úvaults3z%Y-%m-%d %H:%M:%Sz$80bc80ff-0c51-4534-86a2-ec5e719643c2édéÚdebugÚdFzUPrint debugging output (set logging level to DEBUG instead of default WARNING level).)ZshortÚdefaultÚhelpÚverboseÚvzWPrint more verbose output (set logging level to INFO instead of default WARNING level).z
log-configÚPATHzßIf this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.)Úmetavarrzlog-config-appendz(Optional) Log Appendzwatch-log-filez(Optional) Watch logz
log-formatZFORMATzÞA logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated.  Please use logging_context_format_string and logging_default_format_string instead.)rrrzlog-date-formatZDATE_FORMATzCFormat string for %%(asctime)s in log records. Default: %(default)szlog-fileZlogfilezZ(Optional) Name of log file to output to. If no default is set, logging will go to stdout.)rÚdeprecated_namerzlog-dirZlogdirz@(Optional) The base directory used for relative --log-file paths)rrz
use-syslogzUse syslog for logging.)rrzsyslog-log-facilityZLOG_USERz$syslog facility to receive log linesZ
use_stderrTzLog output to standard errorZuse_journalz%Enable Systemd native journal supportZuse_eventlogz Log output to Windows Event Log.Zuse_jsonz4Enables JSON formatting in the logs when set to TrueZrate_limit_burstézBurst limitZlog_rotate_intervaléz0Interval, number of hours, of log rate limiting.Zmax_logfile_counté<zNumber of log files to retain.Zlog_rotate_interval_typeZHourszUnits of log rotation intervalZlog_rotation_typeZintervalztype of log retentionZlogging_context_format_stringzw%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)sz2format string to use for log messages with contextZlogging_default_format_stringzV%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)sz5format string to use for log messages without contextZlogging_debug_format_suffixz$%(funcName)s %(pathname)s:%(lineno)dz0data to append to log format when level is DEBUGZlogging_exception_prefixz?%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)sz5prefix each line of exception output with this formatZdefault_log_levelszamqplib=WARNzsqlalchemy=WARNz	boto=WARNz	suds=INFOz
keystone=INFOzeventlet.wsgi.server=WARNzlist of logger=LEVEL pairsZpublish_errorszpublish error eventsZfatal_deprecationszmake deprecations fatalZinstance_formatz[instance: %(uuid)s] zBIf an instance is passed with the log message, format it like thisZinstance_uuid_formatzGIf an instance UUID is passed with the log message, format it like thisZrate_limit_intervalz2Interval, number of seconds, of log rate limiting.Úvault_storage_typeÚs3z'Storage type: nfs, swift-i, swift-s, s3Úvault_data_directoryz'Location where snapshots will be stored)rÚvault_data_directory_oldz/var/triliovaultÚtmpfs_mount_pathÚtmpfszLLocation with respect to CONF.vault_data_directory_oldwhere tmpfs is mountedÚqueue_depthz-The number of writes to be queued (writeback)Úworker_pool_sizez3Number of worker threads to process the write queueZvault_retry_countéz(The number of times we retry on failuresÚvault_segment_sizeé izvault object segmentation sizeÚvault_cache_sizez6Number of segments of an object that need to be cachedZ
rootwrap_confz/etc/nova/rootwrap.confzrootwrap config fileÚvault_s3_auth_versionÚDEFAULTzS3 Authentication typeÚvault_s3_access_key_idÚz	S3 Key IDÚvault_s3_secret_access_keyzS3 Secret Access KeyÚvault_s3_region_namez	S3 RegionÚvault_s3_bucketz	S3 BucketÚvault_s3_endpoint_urlzS3 Endpoint URLÚvault_s3_ssl_certzUse SSL certificate bundleÚvault_s3_signature_versionrzS3 signature version to useÚvault_s3_read_timeoutZ120z3Time in seconds to wait for a response to API callsZvault_enable_threadpoolÚTruezEnable backend thread poolÚvault_threaded_filesystemz"Allow multiple file system threadsZmax_uploads_pendingZ20zNumber of file uploads.Zvault_cache_usernameZnovazSystem username.Úvault_logging_levelÚerrorz0Logging level filter (debug, info, warn, error).Úvault_s3_max_pool_connectionsÚ500z>The maximum number of connections to keep in a connection poolÚbucket_object_lockz#S3 bucket object locking is enabledZFLAGZs3fuse_sys_admin)Úfsé)ÚvalueÚinfoÚwarnz1.0)
Zproject_nameÚregion_nameZuser_domain_nameZ
endpoint_typeÚobject_storage_urlZproject_domain_idÚuser_idZuser_domain_idZ	tenant_idZservice_typeZ
project_idZ
auth_tokenZproject_domain_nameZ	OS_CACERTZOS_CERTZOS_KEYé
)&Zsync_torÚheaderÚauth_versionÚ
os_optionsZssl_compressionZos_storage_urlZos_usernameZos_passwordZ	os_cacertZos_certZos_keyZos_tenant_nameZos_auth_urlZ
os_auth_tokenZinsecureZsnetZsync_keyZauthÚuserÚkeyZread_aclrBZretriesZ	write_aclÚmetarZuse_sloZchecksumZchangedÚleave_segmentsZskip_identicalZsegment_threadsZobject_dd_threadsZobject_uu_threadsZcontainer_threadsZyes_allÚobject_namecstjˆƒ‡fdd„ƒ}|S)Nc
stˆ||ŽSQRXdS)N)Ú
manifest_lock)ÚargsÚkwargs)Úwrapped©ú!/usr/lib/python3.6/s3vaultfuse.pyÚ_wrapˆszsynchronized.<locals>._wrap)Ú	functoolsÚwraps)rSrVrT)rSrUÚsynchronized‡srYcCsätjjƒdkst‚tjdks t‚dtd<tjtd<tjtd<tjtd<tj	td<tj
td	<tjtd
<tjtd<tj
r‚tj
tdd
<tjr–tjtdd<tjjƒdkr®dtd<n2tjjtjƒrÈtjtd<ntjdtjƒdtd<dS)Nr"r.z1.0rIrKrLZbucketZs3_signatureZs3_read_timeoutr<r>rJrErDZfalseFZs3_ssl_certzcInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connectionr0)ÚCONFr!ÚlowerÚAssertionErrorr-Úoptionsr/r1r3r6r7r<r>r4r2r5ÚosÚpathÚexistsÚLOGrCrTrTrTrUÚ
option_configs,








rbz
%016x.%08xiècstjˆƒ‡fdd„ƒ}|S)Ncs~ytjjtjƒWn$tk
r6tjjtjjƒYnXˆ||Ž}ytjjtjƒWn$tk
rxtjjtjjƒYnX|S)N)ÚloggingÚdisableÚERRORÚ
BaseExceptionZNOTSET)rQrRÚresult)ÚfuncrTrUÚwrapper¹s
z disable_logging.<locals>.wrapper)rWrX)rhrirT)rhrUÚdisable_logging¸srjcCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr0ú/)r0rk)r^r_ÚsplitÚjoin)r_ÚheadÚtailÚprefixrTrTrUÚsplit_head_tailÈs
rqcCstjj|ƒ\}}|S)N)r^r_rl)r_rnrorTrTrUÚget_headÕsrrc@s&eZdZd	dd„Zdd„Zdd„ZdS)
Ú	tmpfsfileFcCs||_||_dS)N)ÚremoveÚpersist_exit)ÚselfrtrurTrTrUÚ__init__Ûsztmpfsfile.__init__cCsLtjjtjtjƒ}t|d\}|_tj|ƒ|j	r>tj	|jƒt
jƒ|jS)N)Údir)r^r_rmrZr$r%rÚ	open_fileÚclosertÚ
tmpfs_semaÚacquire)rvÚtmpfs_mountpathÚfhrTrTrUÚ	__enter__äs
ztmpfsfile.__enter__cGs|jstjƒtj|jƒdS)N)rur{Úreleaser^rtry)rvrQrTrTrUÚ__exit__ïsztmpfsfile.__exit__N)FF)Ú__name__Ú
__module__Ú__qualname__rwrrrTrTrTrUrsÚs
	rsc@s€eZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
ddd„Zddd„Zdd„Z
dd„Zdd„Zdd„ZdS) ÚObjectRepositorycKs
||_dS)N)Úroot)rvr†rRrTrTrUrwöszObjectRepository.__init__cCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrkr)Ú
startswithr^r_rmÚ_SEGMENT_PREFIXÚ
_full_path)rvÚpartialr_rTrTrUÚ_full_segment_pathús
z#ObjectRepository._full_segment_pathcCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrkr)r‡r^r_rmr†)rvrŠr_rTrTrUr‰s
zObjectRepository._full_pathcCsdS)NrT)rvrOÚflagsrTrTrUÚobject_openszObjectRepository.object_opencCsdS)NrT)rvrOÚoffÚbufr~rTrTrUÚ
object_upload
szObjectRepository.object_uploadcCsdS)NrT)rvrOÚoffsetr~rTrTrUÚobject_download
sz ObjectRepository.object_downloadcCsdS)NrT)rvrOrTrTrUÚ
object_deleteszObjectRepository.object_deletecCsdS)NrT)rvrOr~rTrTrUÚobject_closeszObjectRepository.object_closeNcCsdS)NrT)rvrOÚlengthr~rTrTrUÚobject_truncatesz ObjectRepository.object_truncatecCsdS)NrT)rvrOr~rTrTrUÚobject_getattrszObjectRepository.object_getattrcCsdS)NrT)rvr_r~rTrTrUÚobject_readdirszObjectRepository.object_readdircCsdS)NrT)rvr_ÚmoderTrTrUÚ
object_accessszObjectRepository.object_accesscCsdS)NrT)rvr_rTrTrUÚ
object_unlink"szObjectRepository.object_unlinkcCsdS)NrT)rvr_rTrTrUÚ
object_statfs%szObjectRepository.object_statfs)N)N)r‚rƒr„rwr‹r‰rrr’r“r”r–r—r˜ršr›rœrTrTrTrUr…õs

r…cs˜eZdZ‡fdd„ZGdd„deƒZGdd„dƒZdd„Zd	d
„Zdd„Z	d
d„Z
dd„Zifdd„Zdd„Z
dd„Zedd„ƒZdd„Zdd„Zedd„ƒZdd „Zd!d"„Zed#d$„ƒZed%d&„ƒZdYd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„ZdZd2d3„Zd4d5„Zd6d7„Z d8d9„Z!d:d;„Z"d<d=„Z#d>d?„Z$d@dA„Z%d[dCdD„Z&dEdF„Z'd\dGdH„Z(dIdJ„Z)dKdL„Z*dMdN„Z+dOdP„Z,dQdR„Z-dSdT„Z.d]dUdV„Z/dWdX„Z0‡Z1S)^ÚBackendRepositorycsbtt|ƒj|f|Žttƒj|_ttƒj|_i|_	t
jtƒ|_
i|_i|_i|_|jdtƒ|_dS)Nr)ÚsuperrrwrÚ	FUSE_USERÚpw_uidrFÚpw_gidÚgroup_idÚmanifestrÚ	S3Backendr]Ú_BackendRepository__backendÚ!_BackendRepository__manifest_lockÚ_BackendRepository__worker_poolÚ_BackendRepository__pending_iosÚBackendWorkerPoolÚ,_BackendRepository__object_open_backend_pool)rvr†rR)Ú	__class__rTrUrw*s	zBackendRepository.__init__c@s0eZdZdZdd„Zdd„Zdd„Zdd	„Zd
S)zBackendRepository.BackendWorkerzU A thread used to asyncronously perform backend jobs placed in the job_queue
        cCs8tj|ƒtj|ƒ|_||_tjƒ|_d|_	|j
ƒdS)NT)rrwrr¤Ú_BackendWorker__backendÚ_BackendWorker__job_queueÚ	threadingZEventÚ_stop_eventZdaemonÚstart)rvÚ	job_queuer]rTrTrUrwKs

z(BackendRepository.BackendWorker.__init__cCs|jjƒdS)N)r¯Úset)rvrTrTrUÚstopUsz$BackendRepository.BackendWorker.stopcCs
|jjƒS)N)r¯Zis_set)rvrTrTrUÚstoppedXsz'BackendRepository.BackendWorker.stoppedcCs¤tjdtjƒjƒxŠ|jƒsžy<|jjddƒ\}}}z||jf|ž|ŽWd|jj	ƒXWqt
k
rpwYqtk
rš}ztj|ƒWYdd}~XqXqWdS)zO Start up the worker and block until there is an item in the queue
            zStarting worker thread[%x].TrN)
rarBr®Úcurrent_threadÚidentr´r­Úgetr¬Z	task_donerÚ	ExceptionÚ	exception)rvrhrQÚkargsÚerTrTrUÚrun[s
z#BackendRepository.BackendWorker.runN)r‚rƒr„Ú__doc__rwr³r´r¼rTrTrTrUÚ
BackendWorkerGs

r¾c@s8eZdZdZdd„Zdd„Zdd„Zdd	„Zd
d„ZdS)
z#BackendRepository.BackendWorkerPoolzU Pool of backend worker threads that consume selected tasks from a job queue
        cCs>ttjƒ|_g|_x&t|ƒD]}|jjtj|j|ƒƒqWdS)N)	rrZr'r±ÚworkersÚrangeÚappendrr¾)rvZnum_threadsr]Ú_rTrTrUrwts
z,BackendRepository.BackendWorkerPool.__init__cCs4x|jD]}|jƒqWx|jD]}|jƒq WdS)N)r¿r³rm)rvÚtrTrTrUÚ__del__|sz+BackendRepository.BackendWorkerPool.__del__cOs|jj|||fƒdS)z+ Add a job to the worker queue
            N)r±Zput)rvrhrQrºrTrTrUÚadd_jobƒsz+BackendRepository.BackendWorkerPool.add_jobcCsx|D]}|j||ƒqWdS)z4 Add a list of jobs to the worker queue
            N)rÅ)rvrhZ	args_listrQrTrTrUÚmapˆs
z'BackendRepository.BackendWorkerPool.mapcCs|jjƒdS)z> Wait for completion of all the jobs in the queue
            N)r±rm)rvrTrTrUÚwait_completionŽsz3BackendRepository.BackendWorkerPool.wait_completionN)	r‚rƒr„r½rwrÄrÅrÆrÇrTrTrTrUr©psr©cCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr0rk)r0rk)r^r_rlrm)rvr_rnrorprTrTrUrq“s
z!BackendRepository.split_head_tailcCstjj|ƒ\}}|S)N)r^r_rl)rvr_rnrorTrTrUÚ	_get_headŸszBackendRepository._get_headcCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrkr)r‡r^r_rmrˆÚ
_get_cache)rvrŠr_rTrTrUÚ_get_segment_cache£s
z$BackendRepository._get_segment_cachecCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrkr)r‡r^r_rmr†)rvrŠr_rTrTrUrÉ©s
zBackendRepository._get_cachecCs>|j|ƒ\}}i}i}tjƒ}||d<t|ƒ}|jj|ƒ}|S)NrO)rqr]ÚcopyÚbunchifyr¥Zget_object_manifest)rvrOÚ	containerrpÚput_headersÚmrÚ_optsr£rTrTrUÚ_read_object_manifest¯sz'BackendRepository._read_object_manifestcCsl|j|ƒ\}}i}i}d|d<tjƒ}||d<x |jƒD]\}	}
|
|d|	<q8Wt|ƒ}|jj|||ƒdS)NÚtruezx-static-large-objectrOzx-object-meta-)rqr]rËÚitemsrÌr¥Zupload_object_manifest)rvrOÚobject_manifestÚmetadatarÍrprÎrÏrÐrLrArTrTrUÚ_write_object_manifestÃs
z(BackendRepository._write_object_manifestcCsBtjd|ƒtjƒ}t|ƒ}t|jdƒdg}|jj||ƒdS)Nz	mkdir, %srkz	-segments)	rarr]rËrÌrˆÚlstripr¥Úmkdir_object)rvrOrÐrQrTrTrUÚ_create_segments_folderÕs
z)BackendRepository._create_segments_foldercCsÌ|j|ƒ\}}tjƒ}|dkr$g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkrz||d<|j|ƒnd}|jj||ƒ}i}x6|dd	jƒD]"\}	}
d
|	kr¢|
||	jd
ƒd<q¢W|S)Nr0Ú	delimiterFÚhumanÚtotalsÚlongrpÚheadersZMetadatazx-object-meta-r)	rqr]rËrÌrÁr¥Ústat_objectrÓrl)rvrOrÍrprÐrQrÚstrÕrLrArTrTrUÚ_get_object_metadataÞs,z&BackendRepository._get_object_metadatacOCsÔ|j|ƒ\}}|j|ƒ}|jj|tjƒƒ|j|<|tjkpX|tddƒtddƒtddƒfk}|j|†||j	krè|tjksæ|tddƒtddƒtddƒfksæ|tddƒtddƒfksæ|tddƒtddƒtd	dƒfksæ|td
dƒkrLy|j
|ƒ}WnFtk
r:}z(tj
d|ƒtjdƒ|j
|ƒ}WYdd}~XnXd
ii|j	|<xZ|D]R}	|	djdƒdjdƒd}
t|
dƒ}|	jddƒ|	d<d|	d<|	|j	||<qPW|j|ƒ}|j	|j|ƒy"|j|j	|dƒ}
tj|
ƒWntk
røYnXtjjtjj|ƒƒs"tjtjj|ƒƒt|dƒ}|jtj|ƒƒWdQRXnœtjjtjj|ƒƒsttjtjj|ƒƒ|tddƒtddƒtddƒfks¢|tjkrúy|j|ƒWntk
rÆYnXyt|dƒ}WdQRXWntk
røYnXy|j|dƒ}
tj|
ƒWntk
r,YnXtj||ƒ}zJ|j|ƒ|j |j!|<d
ii|j	|<ddi|j	|d
|<|j"||ƒWd|j!j#|dƒ|j	|d
j#|dƒtj$|ƒXyt|dƒ}WdQRXWntk
ræYnXWdQRXyddl%m&}||ƒj'ƒWnYnXtj||ƒ}y:d|i|j	|d
|<|j(t)j*t+ƒ|j!|<t,ƒ|j-|<|Stk
rÎ}zNtj.|ƒ|j!j#|dƒ|j	|d
j#|dƒ|j-j#|dƒtj$|ƒ‚WYdd}~XnXdS)NZ8000éZ8800Zc000Z8401Z8402Z8002Z8802Zc002Z28000z+Manifest for %s not found. Trying in 5 secsrÚopen_handlesÚnamez
-segments/rÚ.rÚ	versionIdr0FÚmodifiedzsegments-dirÚwZ8001Z8801Z0001z	-segmentsÚreadonly)ÚPath)/rqr‰r¦r·r®ÚRLockr^ÚO_RDONLYÚintr£rÑr¸rarBÚtimeÚsleeprlráÚupdateÚmakedirsrfr_r`ÚdirnameÚopenÚwriteÚjsonÚdumpsÚO_RDWRr›r‹rÙrªr§Ú
_object_closeÚpoprzZpathlibrêZtouchr©rZr(r]r²r¨r¹)rvrOrŒrÍrpÚ	full_pathrér£ÚexÚsegZoffstrr‘rÕZsegment_dirÚfr~rêrTrTrUrs¾

 
  


 



zBackendRepository.object_opencCsRy tjƒ}t|ƒ}|j||ƒWn,tk
rL}ztj|ƒWYdd}~XnXdS)zñ Utility method to be dispatched to a worker thread in order to clean up old segments.

        Args:
            backend (class instance): Instance of the backend plugin.
            segment_list (list): List of segments to remove.
        N)r]rËrÌÚdelete_object_listr¸rar¹)rvÚbackendÚsegment_listrÐrûrTrTrUZ__purge_old_segments_task¦sz+BackendRepository.__purge_old_segments_taskcCs°|j|jƒ|j|ŒyT|j|jddt|dƒ}|j|ƒ\}}g}i}d}|j|d|dspd}	d}
d}x8|	|j|krPy|j|j||	d|ƒ}Wn0tj	dƒ|j|j||	d|ƒ}YnX|j||	d	r6t
|ƒ}
t|
jt
jƒ}|j|j||	d|
j|
j||
jd
œƒnd|j||	d}|j|j||	d|j||	jdd
ƒ|j||	d||j||	dd
œƒ|	t
j7}	|d7}|
|7}
q€W|j|||t|ƒt|
ƒdœdd}	x’drn|rn|j|||	ƒ}t|ƒdkrPt|ƒ}|j||	djdƒ}tt|ƒt|gƒƒ}t|ƒdkr`|j|j|j|ƒ|	t
j7}	qÞWdStk
r }ztj|ƒWYdd}~XnXWdQRXdS)zé Handle object_close by updating the manifest.

         Waits for all of the background jobs to complete prior to updating
         manifest using the main thread. Also queues up tasks to clean up
         any old segments.
        zsegments-dirrkz	-segmentsrrãrérärrç)r_ræÚetagÚ
size_bytesÚcontent_typerrær0Úhashrr)zsegments-dirz
segment-countz
total-size)rÕTN) r§rÇr¦r£r·rˆrqr—rîrïrÌÚminÚst_sizerZr*rÁÚ
version_idrrrÖÚstrrÚlenÚsortedÚstripÚlistr²rÅÚ+_BackendRepository__purge_old_segments_taskr¸rar¹)rvrOr~Úsegments_dirrÍrprÔZ
segments_listZsegmentsr‘Z
total_sizeÚsegment_sizeràÚstatZobjectsÚpZ
purge_listrûrTrTrUrø´s”




zBackendRepository._object_closecCsÚ|j||ƒ|jj|ƒ|jj|ƒ|j|dj|ƒytj|ƒWntk
rZYnX|j|Rt	|j|dƒdkr´ytj
|j|ƒƒWntk
r¦YnX|jj|ƒWdQRX||jkrÖ|jj|dƒdS)Nrãr)rør§rùr¨r£r^rzrfr¦r	rtr‰)rvrOr~rTrTrUr”,s"
zBackendRepository.object_closec#Csž|j|ˆy*||j|krJ|j||ddkrJ|j||d}n8|j||ƒ}|j|jddt|dƒ}tjj||ƒ}tj	ƒ}d|j|k|d<|j
|ƒ\}	}
tdd	2}t|d
ƒ}|j
|ƒWdQRXt|ƒ|d<WdQRX|
jdƒ|d<t|ƒ}|	|g}
|j|j|ƒ|j|j|j|
|||||ƒWnTtk
rŽ}z6tj|ƒ||j|kslt‚|j|j|ƒ‚WYdd}~XnXWdQRXdS)
NrçTräzsegments-dirrkz	-segmentsÚ0Ú
path_valid)ruÚwbrrO)r¦r£Ú,_BackendRepository__next_segname_from_offsetr·rˆr^r_rmr]rËrqrsrórôr	ÚrstriprÌr¨Úaddr§rÅÚ&_BackendRepository__object_upload_taskr¸rar¹r\rt)rvrOr‘rr~Úseg_fullnameZsegnamerrÐrÍÚobjÚtempfsrýÚargs1rûrTrTrUrBs:

zBackendRepository.object_uploadc
*Csxtjd||tjƒjfƒ|j|||j|ks8t‚WdQRXz‚yd|_|j	||ƒ}Wnft
k
rÀ}	zJtj|	ƒ|j|(||j|ks”t‚|j|j|ƒWdQRX‚WYdd}	~	XnXWdt
jƒtj|dƒX|j|†||j|kri|j||<||j||d<d|j||d<|jddƒ|j||d	<||j|ksZt‚|j|j|ƒWdQRXdS)
zP Method run by a worker in the thread pool to upload an object segment.
        z6Object [%s] segment [%s] upload running in thread[%x].NTrrärçÚ	VersionIdr0ræ)rarBr®rµr¶r¦r¨r\rZ
upload_objectr¸r¹rtr{r€r^r£r·)
rvrÿrrÐrOr‘rr~ZresprûrTrTrUZ__object_upload_taskks0
z&BackendRepository.__object_upload_taskc
Csbxvtjdƒ|j|X||j|kr(w||j|krVtd|tt|ƒtdƒfƒ‚|j||d}PWdQRXqW|j|j	dƒƒ\}}t
ddÂ}tjƒ}d|d<d|d	<|j	dƒ|d
<|j||j
ddƒ|d
<t|ƒ}||g}	y:|jj|	|ƒt|j	dƒdƒ}
|
jƒ}WdQRXt|ƒStk
rR}ztj|ƒ‚WYdd}~XnXWdQRXdS)Ngš™™™™™¹?zobject %s not foundrrärkT)rtrpZ
out_directoryZout_filerær0rÚrb)rîrïr¦r¨r£r¸ÚSEGMENT_FORMATrírqrrsr]rËr·rÌr¥Zdownload_objectróÚreadÚ	bytearrayrar¹)
rvrOr‘r~rrÍrrrÐrrýrrûrTrTrUr’s8

z!BackendRepository.object_downloadcCs‚|j|ƒ\}}tjƒ}t|ƒ}|g}|dkr>|dkr>|j|ƒy|jj||ƒWn,tk
r|}ztj	|ƒWYdd}~XnXdS)Nr0rk)
rqr]rËrÌrÁr¥Z
delete_objectr¸rar¹)rvrOrÍrrÐrrûrTrTrUr“²s

zBackendRepository.object_deleteNcCs&|rdS|j|tjƒ}|j||ƒdS)N)rr^ÚO_WRONLYr”)rvrOr•r~rTrTrUr–Âsz!BackendRepository.object_truncatecCsptjƒ}d|d<d|d<d|d<d|d<tjj|dt|ƒƒ|d<g}|dkrTg}n|g}t|ƒ}|jj||ƒS)	NrÚFrÛrÜrÝz%016xrpr0)	r]rËr^r_rmrírÌr¥Z
list_segments)rvrÍrr‘rÐrQrTrTrUrÈszBackendRepository.segment_listc	CsÀ|j|ƒ\}}|j|jddƒ}|rT|jdtƒr@|j|ƒ\}}|j|ƒ\}}|}n|d}|j|||ƒ}t|ƒdkrŠtt|ƒtdƒfStt|ƒtt	|ƒdj
|ƒdj
dƒddƒdfS)	Nzsegments-dirrkz	-segmentsrrrårâéÿÿÿÿ)rqr£r·r‡rˆrr	rrír
rl)	rvr_r‘rÍrprÚcrÚfilesrTrTrUZ__next_segname_from_offsetÚs$z,BackendRepository.__next_segname_from_offsetc
Csò|j||j|ƒ\}}|jj|dƒrV||j|krV|j||d}|jdƒdS|j|jddƒ}|r€|j|ƒ\}}|}n|d}|j|||ƒ}	WdQRXt|	ƒdkrÀtt|ƒtdƒfStt|ƒtt	|	ƒd	j|ƒdjdƒddƒfS)
Nräz
-segments/rzsegments-dirz	-segmentsrrårâr#)
r¦rqr£r·rlrr	rrír
)
rvr_r‘rÍrprürr$rr%rTrTrUÚcurr_segname_from_offsetïs z*BackendRepository.curr_segname_from_offsetcs‚tjj|ƒr~y@tj|ƒ‰t‡fdd„dDƒƒ}d|d<t|d	dƒ|d
<|Stk
rx}ztj|ƒWYdd}~XnXdSdS)aÆ Utility to check the tmpfs cache and return stat() from that.

         This method looks to see if the object (directory) exists in the
         local cache and will perform a stat() locally instead of calling
         all the way to the backend.

        Args:
            object_cache_path (str): Cache path to the object we need stat infor on.

        Returns:
            Dictionary of stat() information or None if object does not exist.
        c3s|]}|tˆ|ƒfVqdS)N)Úgetattr)Ú.0rL)ràrTrUú	<genexpr>sz0BackendRepository._stat_cache.<locals>.<genexpr>Úst_atimeÚst_ctimeÚst_gidÚst_modeÚst_mtimeÚst_nlinkrÚst_uidiÚ
st_blksizeÚ	st_blocksN)r*r+r,r-r.r/rr0)	r^r_ÚisdirÚlstatÚdictrír¸rar¹)rvZobject_cache_pathÚ	stat_infor»rT)ràrUÚ_stat_caches(



zBackendRepository._stat_cachec$sä|j|ƒ}|j|ƒ}|dk	r |S|j|ƒ\}}tjƒ}|dkrDg}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkrš||d<|j|ƒnd}y`|jj||ƒ‰|j	|d<|j
|d	<ˆd
jddƒ|d<ˆd
jd
dƒ|d<ˆd
jddƒ|d<tˆdƒ|d<tˆdƒ|d<tˆdƒ|d<d|d<d|d<|dk	r\d|kr\d|d<tˆdƒ|d<|ddkr„|dksÂ|ddkrœ|dksÂ|ddkr´|dksˆddkrþd |d<d!|d<d"|d<|j
|ƒ}	tjj|	ƒsþtj|	d#ƒWnÂtk
rÂ}
z¤ytj|ƒ‰Wnntk
ry@d|d<|jj|ƒ‰|jd$ƒˆkrhtj|d#ƒn
tj|ƒWntk
rŠYnXYnXtj|ƒ‰t‡fd%d&„d*Dƒƒ}WYdd}
~
XnXd'|d(<t|dd'ƒ|d)<|S)+Nr0rÚFrÛrÜrÝrpr,r0rÞZETagrrrZContentTyperZ	timestampr*r+r.rr/iír-Zauthorized_keyi€ÚsizerrZ	directoryTéiiýAiérkc3s|]}|tˆ|ƒfVqdS)N)r')r(rL)ràrTrUr)xsz3BackendRepository.object_getattr.<locals>.<genexpr>ir1r2)r*r+r,r-r.r/rr0)r‰r7rqr]rËrÌrÁr¥rßr¢rFr·rírÉr^r_r`Úmkdirr¸r4rfÚlist_objectsrrarBr5)rvrOr~rúrrÍrprÐrQZcontainer_pathrûrT)ràrUr—1sŽ






z BackendRepository.object_getattrcCsþytj|dƒ}Wn.tk
r>}ztj|ƒ‚WYdd}~XnXd}x|||j|krÀy |jj|j||d|ƒWn2tj	dƒ|jj|j||d|ƒYnX||j||d7}qFWy|jj
||ƒWn$tj	dƒ|jj
||ƒYnXdS)Nz%Y-%m-%dT%H:%M:%Srrärr)rZstrptimer¸rar¹r£r¥Zput_object_segment_retentionrîrïZput_manifest_retention)rvrOÚretainuntilÚdtrûr‘rTrTrUÚ_set_object_retentionŒs(


z'BackendRepository._set_object_retentionc	Cs|j|tjƒ}zîyº|j|¦tj|j|ƒ}d}x8||j|krj|j||d}|j|dƒ||7}q4W|jddƒ|dkr”|j||j	dƒƒn|j	dƒ||<|j
j||ƒ||j||<WdQRXWn.tk
rø}zt
j|ƒ‚WYdd}~XnXWd|j||ƒXdS)Nrrrãr<Úutf8zutf-8)rr^rìr¦rËÚdeepcopyr£rùr>Údecoder¥Úupdate_object_attributesr¸rar¹r”)	rvrOrärAr~Úattrsr‘r8rûrTrTrUÚobject_setxattrªs(
z!BackendRepository.object_setxattrcCs²|j|tjƒ}zy\|j|Htj|j|ƒ}|j|ƒ|jdƒ|jj	||ƒ|j|j|ƒWdQRXWn.t
k
rš}ztj|ƒ‚WYdd}~XnXWd|j
||ƒXdS)Nrã)rr^rìr¦rËr@r£rùr¥rBr¸rar¹r”)rvrOrär~rCrûrTrTrUÚobject_removexattrÂs


z$BackendRepository.object_removexattrcCs’|j|tjƒ}zpy<|j|(tj|j|ƒ}|jdƒ|jƒ}|SQRXWn.t	k
rz}zt
j|ƒ‚WYdd}~XnXWd|j||ƒXdS)Nrã)
rr^rìr¦rËr@r£rùÚkeysr¸rar¹r”)rvrOr~rCrFrûrTrTrUÚobject_listxattrÒs

z"BackendRepository.object_listxattrcCs€|j|tjƒ}z^y*|j|t|j||dƒSQRXWn.tk
rh}ztj|ƒ‚WYdd}~XnXWd|j	||ƒXdS)Nzutf-8)
rr^rìr¦Úbytesr£r¸rar¹r”)rvrOrär~rûrTrTrUÚobject_getxattrás
z!BackendRepository.object_getxattrccsdg}|jdƒd}g}||jj|ƒ7}x |D]}|j|jdƒdƒq,Wxt|ƒD]
}|VqRWdS)Nrkrr#)rr¥r;rÁrlr)rvrOr~ZlistingZdir_pathÚdirentsZlstÚrrTrTrUr˜ìs
z BackendRepository.object_readdircCsdS)NrT)rvrOr™rTrTrUrš÷szBackendRepository.object_accessFcCs|td<tjƒ}t|ƒ}|sØyŽ|j|ƒ}|j|ƒ}g}x|D]}|j|dƒq<W|jj||ƒ|jdƒ}|dk	r¨|g}	|jj	|	|ƒyt
j|j|ƒƒWnYnXWn,t
k
rÖ}
ztj|
ƒWYdd}
~
XnXy|jj|ƒWn.t
k
r}
ztj|
ƒWYdd}
~
XnXdS)NrNräzsegments-dir)r]rËrÌrÑrárÁr¥rþr·Úrmdir_objectr^ÚrmdirrÉr¸rar¹Zdelete_object_manifest)rvrOrNrÐZobj_manifestZobj_metadatarÚmanrrQrûrTrTrUr›ús6






zBackendRepository.object_unlinkc	CsÐtjƒ}t|ƒ}g}y|jj||ƒ}Wn6tk
r\}ztj|ƒtt	j
ƒ‚WYdd}~XnXd|dkrt|dƒ}t|dƒt|dƒ}nd}t|dƒ}i}||d<||d<||d<d	|d
<d	|d<|S)
Nzx-account-meta-quota-bytesrÞzx-account-bytes-usedrr8Úf_blocksÚf_bfreeÚf_bavailrÚf_favailÚf_frsizer#)r]rËrÌr¥rßr¸rar¹rÚerrnoÚENOENTrí)	rvrOrÐrZstvrûrOrQr=rTrTrUrœs*
zBackendRepository.object_statfsc
CsÚtjd|ƒ|j|ƒ\}}tjƒ}t|ƒ}||g}y|jj||ƒWn*tk
rp}ztj	|ƒdSd}~XnX|j
|ƒ}	|dkr˜|j
tjj
||ƒƒ}	ytj|	|ƒWn,tk
rÔ}ztj	|ƒWYdd}~XnXdS)Nz	mkdir, %srF)rarrqr]rËrÌr¥rØr¸r¹rÉr^r_rmrñ)
rvr_r™ZistrÍrrÐrQrûÚ
cache_pathrTrTrUr:8s$

zBackendRepository.mkdirc:CsØ|j|ƒ\}}tjƒ}d|d<t|ƒ}|jdƒd}g}y||jj|dd7}Wn,tk
r|}ztj	|ƒWYdd}~XnXt
|ƒdkr”ttj
ƒ‚y|jj|jdƒg|ƒWn,tk
rÚ}ztj	|ƒWYdd}~XnXtjjt|jdƒƒ}y||jj|dd7}Wn.tk
r6}ztj	|ƒWYdd}~XnXt
|ƒdkry|jj|jdƒg|ƒWn.tk
rŽ}ztj	|ƒWYdd}~XnX|j|ƒ}	tjj|	ƒr²tj|	ƒ|j|ƒ}
tjj|
ƒrÔtj|
ƒSdS)Nrprkr))Z	max_itemsr)rqr]rËrÌrr¥r;r¸rar¹r	rrTZ	ENOTEMPTYrLr^r_rmrˆr×rÊr3rMrÉ)rvrOrÍrrÐr_Z	dir_itemsrûZseg_pathZsegment_cache_pathrVrTrTrUrMXsD





zBackendRepository.rmdircCsVtjd|ƒy.|j|ƒ\}}|jtjj||ƒƒ}tj||ƒStk
rPYnXdS)Nz	chmod, %s)	rarrqrÉr^r_rmÚchmodrf)rvr_r™rÍrprVrTrTrUrW†szBackendRepository.chmodcCsXtjd|ƒy0|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒStk
rRYnXdS)Nz	chown, %s)	rarrqrÉr^r_rmÚchownrf)rvr_ÚuidÚgidrÍrprVrTrTrUrXszBackendRepository.chowncCstdƒ‚dS)NzNot Applicable)r¸)rvräÚtargetrTrTrUÚsymlink˜szBackendRepository.symlinkc
[Cs:|jj|dƒdkst‚|jj|dƒrHtjdƒ|jj|dƒrHtd|ƒ‚tjd||fƒ|d}y|j|ddWn,tk
r }ztj	|ƒWYdd}~XnXyJ|j
|ƒ}|j
|ƒ}|jd|dƒ|jd|dƒkrê|j|ddd	SWn$tk
r}zWYdd}~XnXd
}y¸y|j
|ƒ}Wn$tk
rJ}zWYdd}~Xn‚X|j|ƒ}|jd|dƒ}	g}
x<|D]4}|
j|d|d|d
|jddƒ|ddœƒqpW|j
||
|	|d|ddœdd}Wn0tk
rþ}ztj	|ƒ‚WYdd}~XnXzêyÌ|j|ƒ}|j
|ƒ}|jd|dƒ}	g}x<|D]4}|j|d|d|d
|jddƒ|ddœƒq2W|j
|||	|d|ddœdy|j|ddWn.tk
rÊ}ztj	|ƒWYdd}~XnXWntk
ræ‚YnXWd|r4y|j|d
dWn.tk
r2}ztj	|ƒWYdd}~XnXXd	S)Néz%s in use. Try againzrename, %s -> %sú~T)rNzsegments-dirz	-segmentsrFrärrrær0r)r_rrrærz
segment-countz
total-size)zsegments-dirz
segment-countz
total-size)rÕ)r£r·r\rîrïr¸rarr›r¹rárÑrÁrÖrf)
rvÚoldÚnewZnewbak_namerûZnew_metadataZold_metadataZnewfile_existsZnew_manifestrZnewbak_manifestrNZold_manifestrTrTrUÚrename›s”












 zBackendRepository.renamecCsZtjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS)Nzlink, %s)rarrqrÉr^r_rmÚlink)rvr[rärÍrpZcache_path_targetZcache_path_namerTrTrUrbszBackendRepository.linkcCsNtjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rHdSXdS)Nzutimens, %sr)rarrqrÉr^Úutimerf)rvr_ÚtimesrÍrprVrTrTrUÚutimenss
zBackendRepository.utimenscCsXy>tjjtjtjƒ}tjj|ƒr<tjj|ƒr<tj	|dddWnt
k
rRYnXdS)Nr])Ztimeoutr)r^r_rmrZr$r%r3Úismountr?Úumountrf)rvr_r}rTrTrUÚdestroy"s
zBackendRepository.destroy)N)N)F)F)N)2r‚rƒr„rwrr¾r©rqrÈrÊrÉrÑrÖrÙrárYrr
rør”rrrjr’r“r–rrr&r7r—r>rDrErGrIr˜ršr›rœr:rMrWrXr\rarbrerhÚ
__classcell__rTrT)r«rUr)sX)#	;x)$#
)
[

 .		s
rc@speZdZdd„Zdd„Zddd„Zdd	„Zddd„Zd
d„Zdd„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zd
S)Ú	FuseCachecCsb||_||_t|_ttƒj|_ttƒj|_t	j
j|jƒs†y4tj
|jƒtj|jt|jƒdt|jƒgƒWqÎtk
r‚‚YqÎXnHt	j|jƒ}|j|jksª|j|jkrÎtjtjt|jƒdt|jƒgƒyvt	j
jtjtjƒ}t	j
j|ƒsøtj|ƒt	j
j|ƒsBdttjƒttjƒ}dd|d}tjdd|d|gƒWntk
r\‚YnXdS)Nú:r@zsize=%dM,mode=0777r)ir&z-o)r†Ú
repositoryÚlrucacherrŸr rFr¡r¢r^r_r3r?r:rXrrfrr0r,rZr$rmr%rZensure_treerfrír*r,Zmount)rvr†rlr6r}Z
tmpfs_sizeZtmpfs_buffer_cfgrTrTrUrwDs6(
$

zFuseCache.__init__cCsL|jj||ƒ}|jj|dƒr(|jj|ƒttjdtj	ƒ|t
dœ|j|<|S)N)Úmaxsize)rmÚlrulockrOÚwrites_before_update_manifest)rlrrmr·rùr	rZr,r®ÚLockÚNUMBER_UPLOADS_BEFORE_FLUSH)rvrOrŒr~rTrTrUris
zFuseCache.object_openTcCs®tjd|tjƒjfƒ|j|}|d|ks2t‚|d}|dPy4x.|jƒ\}}|drH|jj	|||d|ƒqHWWnt
k
rŒYnXWdQRX|rª|jj||ƒdS)NzCache object_flush [%s] [%x]rOrmrorçÚdata)rarr®rµr¶rmr\ÚpopitemrlrÚKeyErrorrø)rvrOr~Úupdate_manifestÚitemÚcacherŽrTrTrUÚobject_flushvs"

zFuseCache.object_flushcCsFtjd|tjƒjfƒ|j||dd|jj||ƒ|jj	|ƒdS)NzCache object_close [%s] [%x]F)rv)
rarr®rµr¶ryrlr”rmrù)rvrOr~rTrTrUr”szFuseCache.object_closeNcCs|jj|||ƒdS)N)rlr–)rvrOr•r~rTrTrUr–—szFuseCache.object_truncateccsVxP|dkrP|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS)Nr)rZr*r)rvr‘r•Z
seg_offsetÚbaseÚseg_lenrTrTrUÚ_walk_segmentsšs
zFuseCache._walk_segmentsc!CsŽ|j|d|kst‚tƒ}|j|dTxJ|j||ƒD]8\}}}y|j|d|d}	Wnütk
rby¸|j|d}
t|
ƒtjkr|
jƒ\}}|dr|j	j
|||d|ƒ|j|dd8<|j|ds|j	j||ƒt|j|d<|j	j
|||ƒ}	d|	d	œ|j|d|<Wn,tk
r\}
ztj|
ƒd
Sd}
~
XnXYnX||	|||…7}q>WWdQRXt|ƒS)NrOrormrsrçrprF)rçrsr)rmr\r!r|rfr	rZr,rtrlrrørrr’r¸rar¹rH)rvrOr•r‘r~Z
output_bufÚ	segoffsetrzr{ÚsegdatarxrŽrwrûrTrTrUÚobject_read¥s@


"zFuseCache.object_readcCsÖtjd|tjƒjfƒt|ƒ}|j|d|ks6t‚d}|j|d~xt|j||ƒD]b\}}}	|j|d}
||
kr\t|
ƒt	j
krø|
jƒ\}}|drø|jj
|||d|ƒ|j|dd	8<|j|dsø|jj||ƒt|j|d<y4|jj|||ƒ}
|
dkrtd
ƒ‚d|
dœ|
|<Wn,tk
rXtd	ƒ}
d
|
dœ|
|<YnXn|
|d}
t|
ƒ|kr|
jd||	t|
ƒƒ||||	…|
|||	…<d
|
|d<||	7}q\WWdQRXt|ƒS)NzCache object_write [%s] [%x]rOrrormrçrsrprzObject not foundF)rçrsTó)rarr®rµr¶r	rmr\r|rZr,rtrlrrørrr’r¸rfr!Úextend)rvrOrr‘r~r•Zbufptrr}rzr{rxrŽrwr~rTrTrUÚobject_writeÞsN


zFuseCache.object_writecCstj|jj|ƒ|ƒS)N)r^r:rlr‰)rvr_r™rTrTrUr:2szFuseCache.mkdircCs|jj|ƒ}tj|ƒS)N)rlr‰r^rM)rvr_rúrTrTrUrM5szFuseCache.rmdircCs|jj|ƒ}tj||ƒS)N)rlr‰r^rW)rvr_r™rúrTrTrUrW9szFuseCache.chmodcCs|jj|ƒ}tj|||ƒS)N)rlr‰r^rX)rvr_rYrZrúrTrTrUrX=szFuseCache.chown)T)N)r‚rƒr„rwrryr”r–r|rr‚r:rMrWrXrTrTrTrUrjCs%


9Trjc@súeZdZd:dd„Zdd„Zdd„Zdd	„Zed;d
d„ƒZdd
„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd<d(d)„Zd*d+„Zd=d,d-„Zd.d/„Zd0d1„Zd>d2d3„Zd4d5„Zd6d7„Zd8d9„ZdS)?ÚTrilioVaultNcCs&||_|pt|ƒ|_t||jƒ|_dS)N)r†rrlrjrx)rvr†rlrTrTrUrwBszTrilioVault.__init__cCs|jj||ƒdS)N)rlrš)rvr_r™rTrTrUÚaccessJszTrilioVault.accesscCs|jj||ƒS)N)rlrW)rvr_r™rTrTrUrWMszTrilioVault.chmodcCs|jj|||ƒS)N)rlrX)rvr_rYrZrTrTrUrXPszTrilioVault.chowncCs|jj||ƒS)N)rlr—)rvr_r~rTrTrUr'SszTrilioVault.getattrcCs|jj|||ƒS)N)rlrD)rvr_rärAr8rTrTrUÚsetxattrWszTrilioVault.setxattrcCs,|jdƒs|jdƒrtddƒS|jj||ƒS)NZsecurityÚsystemr0zutf-8)r‡rHrlrI)rvr_rärTrTrUÚgetxattrZs
zTrilioVault.getxattrcCs|jj|ƒS)N)rlrG)rvr_rTrTrUÚ	listxattr_szTrilioVault.listxattrcCs|jj||ƒS)N)rlrE)rvr_rärTrTrUÚremovexattrbszTrilioVault.removexattrccs4ddg}|j|jj||ƒƒx|D]
}|Vq"WdS)Nråz..)rrlr˜)rvr_r~rJrKrTrTrUÚreaddires
zTrilioVault.readdircCs2tj|j|ƒƒ}|jdƒr*tjj||jƒS|SdS)Nrk)r^Úreadlinkr‰r‡r_Úrelpathr†)rvr_ÚpathnamerTrTrUr‹ks
zTrilioVault.readlinkcCstj|jj|ƒ||ƒS)N)r^Úmknodrlr‰)rvr_r™ZdevrTrTrUrŽ}szTrilioVault.mknodcCs|jj|ƒS)N)rlrM)rvr_rTrTrUrM€szTrilioVault.rmdircCs|jj||ƒS)N)rlr:)rvr_r™rTrTrUr:ƒszTrilioVault.mkdircCs|jj|ƒS)N)rlrœ)rvr_rTrTrUÚstatfs†szTrilioVault.statfscCs|jj|ƒS)N)rlr›)rvr_rTrTrUÚunlink‰szTrilioVault.unlinkcCs|jj||ƒS)N)rlr\)rvrär[rTrTrUr\ŒszTrilioVault.symlinkcCs|jj||ƒS)N)rlra)rvr_r`rTrTrUraszTrilioVault.renamecCs|jj||ƒS)N)rlrb)rvr[rärTrTrUrb’szTrilioVault.linkcCs|jj||ƒS)N)rlre)rvr_rdrTrTrUre•szTrilioVault.utimenscCs|jj||ƒS)N)rxr)rvr_r™rTrTrUró›szTrilioVault.opencCs|j|tjƒS)N)rór^ÚO_CREAT)rvr_r™ZfirTrTrUÚcreatežszTrilioVault.createcCs|jj||||ƒ}|S)N)rxr)rvr_r•r‘r~rrTrTrUr ¡szTrilioVault.readcCs|jj||||ƒS)N)rxr‚)rvr_rr‘r~rTrTrUrô¥szTrilioVault.writecCs|jj|||ddS)N)r~)rxr–)rvr_r•r~rTrTrUÚtruncate¨szTrilioVault.truncatecCs|jj||ƒdS)N)rxry)rvr_r~rTrTrUÚflush«szTrilioVault.flushcCs|jj||ƒdS)N)rxr”)rvr_r~rTrTrUr€®szTrilioVault.releasecCstjd|ƒ|jj|ƒS)Nzdestroy, %s)rarrlrh)rvr_rTrTrUrhµszTrilioVault.destroy)N)N)N)N)N) r‚rƒr„rwr„rWrXrjr'r…r‡rˆr‰rŠr‹rŽrMr:rrr\rarbrerór’r rôr“r”r€rhrTrTrTrUrƒAs:



rƒú/etc/fuse.confcCsÐd}tjj|ƒrJt|dƒ*}x"|D]}d|kr"d|kr"d}Pq"WWdQRX|dkrÌd}tjj|ƒrˆt|dƒ}|jƒdd}WdQRXtd	d
ƒ}|j|ƒWdQRXtjd	|ƒtjd	ƒtj	ddgƒdS)
NrrKZuser_allow_otherú#rzuser_allow_other 
ZrtÚ
z/tmp/fuse.conf.tmpZwtz/etc/fuse.confz	root:root)
r^r_r`rór rôr?rËrtrX)Z	conf_fileÚfoundrýÚlineÚsZoutfrTrTrUÚ	fuse_confºs"

r›cCsRyÌytj|dgƒWntk
r(YnXtjj|ƒr‚tj|ƒ}ttƒj	}tt
ƒj}|j|kof|j
|ksÊtj|dtdt
gƒnHtj|dgƒtj|dgƒtj|tdt
gƒtj|tdt
gƒWn,tk
rø}ztj|ƒWYdd}~XnXdd„tjtjƒDƒt|t|ƒd}d}tjjƒd	kr8d
}t|||ddddddS)Nz-lz-Rrkz-pcSs&g|]}tjtjjtj|ƒdd‘qS)T)Ú
ignore_errors)ÚshutilZrmtreer^r_rmrZr$)r(ÚxrTrTrUú
<listcomp>æszmain.<locals>.<listcomp>)rlTrÒF)Z	nothreadsZ
foregroundZnonemptyZ
big_writesZallow_other)r?rgrfr^r_r3rrrŸr Ú
FUSE_GROUPr¡r0r,rXr:r¸rar¹ÚlistdirrZr$rƒrr9r[r
)Z
mountpointZ	cacherootZmountpoint_statrFr¢rûZtvaultpluginZdisable_fuse_threadsrTrTrUÚmainÍs@


r¢cCsBtƒtjtjkst‚tƒtjtƒ}|j	tƒt
tjtjƒdS)z$Main routine that drives fuse mount.N)
rbrZr'r(r\r›rr¤r]Zvalidate_s3_clientr¢r#r$)Z	s3backendrTrTrUr¼þs

r¼Ú__main__i€i)r•)or½r^ZgrpÚsysrTrîrrËrõrrWÚ
subprocessr®rrZtempfilerÚpwdrrrÚImportErrorZqueueZ
cachetoolsr	Zfuser
rrZfusepyZs3fuse.bunch_p3ZastZoslo_configrZoslo.configZoslo_logrrcZs3fuse.utilsrZs3fuserrZ_DEFAULT_LOG_DATE_FORMATrˆZQUEUE_DEPTHZWORKER_POOL_SIZEZBoolOptZcommon_cli_optsZStrOptZlogging_cli_optsZIntOptZgeneric_log_optsZListOptZlog_optsZ
vault_optsrZZ
register_optsZregister_cli_optsrÚenvironÚflagÚargvZlist_all_sectionsZs3fuse.privsepr?Zsetupr!r[Z	getLoggerrar{r:ZloggerZsetLevelÚDEBUGÚINFOZWARNrerfr·r]rqrPrYrbZCACHE_LOW_WATERMARKZCACHE_HIGH_WATERMARKZgetpassZgetuserrŸZgetgrgidÚgetgidZgr_namer rrmrrrjrqrrrsÚobjectr…rrjrƒr›r¢r¼r‚rTrTrTrUÚ<module>s„




















4$y
1