o
    Civ                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlZee	Z
dZdd Zdd ZG dd	 d	ZG d
d deZG dd deZG dd dZG dd dZeddfddZdS )z
Simplistic RPC implementation.
Exposes all functions of a Server object.

Uses pickle for serialization and the socket interface.
    Ni /  c                 C   s4   t |  }|j}t|| || | d S N)osfstatfilenost_sizepickledumpwriteread)fconnstsize r   i/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/site-packages/faiss/contrib/rpc.pyinline_send_handle   s   r   c                 C   s"   t | }t|| ||  d S r   )lenr   r   r	   )sr   r   r   r   r   inline_send_string&   s   r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )FileSockz7 wraps a socket so that it is usable by pickle/cPickle c                 C   s   || _ d| _d S )Nr   )socknr)selfr   r   r   r   __init__/   s   
zFileSock.__init__c                 C   sH   d}d}|t |k r"| j||||  }||7 }|t |k s
d S d S )N   r   )r   r   send)r   bufbsnssentr   r   r   r	   3   s   zFileSock.writer   c                 C   sd   |  j d7  _ g }d}t||k r-| j|| }|sn|| |t|7 }t||k sd|S )N   r       )r   r   r   recvappendjoin)r   r   bnbrbr   r   r   r
   =   s   

zFileSock.readc                 C   s   t  }	 | d}||7 }q)zmay be optimized...Tr    )bytesr
   r   chr)r   r   cr   r   r   readlineK   s
   
zFileSock.readlineN)r   )__name__
__module____qualname____doc__r   r	   r
   r+   r   r   r   r   r   ,   s    

r   c                   @      e Zd ZdS )
ClientExitNr,   r-   r.   r   r   r   r   r1   U       r1   c                   @   r0   )ServerExceptionNr2   r   r   r   r   r4   X   r3   r4   c                   @   sH   e Zd ZdZejdfddZdd Zdd Zd	d
 Z	dd Z
dd ZdS )Serverzr
    server protocol. Methods from classes that subclass Server can be called
    transparently from a client
     c                 C   s    || _ || _|| _t|| _d S r   )logf
log_prefixr   r   fs)r   r   r7   r8   r   r   r   r   b   s   zServer.__init__c                 C   s   | j d| j|f  d S )NzSever log %s: %s
)r7   r	   r8   )r   r   r   r   r   logl   s   z
Server.logc              
   C   s,  z
t | j\}}W n ty   tdw | d|  d}d}zt| |}W n ty<   td| }| d Y nw z|| }W n3 tyv } z'd	t
t d t| }| d t
d	| j | j  W Y d}~nd}~ww td
 zt j||f| jdd W dS  ty   tdw )a  
        Executes a single function with associated I/O.
        Protocol:
        - the arguments and results are serialized with the pickle protocol
        - client sends : (fname,args)
            fname = method name to call
            args = tuple of arguments
        - server sends result: (rid,st,ret)
            rid = request id
            st = None, or exception if there was during execution
            ret = return value or None if st!=None
        z	read argszexecuting method %sNzunknown method zunknown methodr6      zexception in method2   return   protocolzfunction return)r   loadr9   EOFErrorr1   r:   getattrAttributeError	Exceptionr$   	traceback	format_tbsysexc_infostr	print_excr7   flushLOGinfor   )r   fnameargsr   retr   er   r   r   one_functiono   s:    

zServer.one_functionc              
   C   s   |  d z	 |   q ty$ } z|  d|  W Y d}~nMd}~w tjyD } z|  d|  td| j W Y d}~n-d}~w tyX   |  d td| j Y n t	yl   tdt
j t
d Y nw td	 dS )
z3 main execution loop. Loops and handles exit stateszin exec_loopTzClientExit %sNzsocket error %sr<   zEOF during communicationr    z
exit sever)r:   rS   r1   socketerrorrF   rK   r7   rB   BaseExceptionrH   stderrexitrM   rN   )r   rR   r   r   r   	exec_loop   s(   

zServer.exec_loopc                 C   s   d S r   r   )r   r   r   r   exec_loop_cleanup   s   zServer.exec_loop_cleanupc                 C   s8   d}t ddt    d d }|D ]}||7 }q|S )Nr6   zFecho ============ `hostname` uptime:; uptime;echo ============ self:; z*ps -p %d -o pid,vsize,rss,%%cpu,nlwp,psr; zecho ============ run queue:;z?ps ar -o user,pid,%cpu,%mem,ni,nlwp,psr,vsz,rss,cputime,command)r   popengetpid)r   rQ   r   lr   r   r   get_ps_stats   s   

zServer.get_ps_statsN)r,   r-   r.   r/   rH   rW   r   r:   rS   rY   rZ   r^   r   r   r   r   r5   \   s    
/r5   c                   @   s6   e Zd ZdZedfddZdd Zdd Zd	d
 ZdS )Clientza
    Methods of the server object can be called transparently. Exceptions are
    re-raised.
    Fc                 C   sP   |rt jnt j}t  |t j}td||| |||f || _t|| _	d S )Nz$connecting to %s:%d, socket type: %s)
rT   AF_INET6AF_INETSOCK_STREAMrM   rN   connectr   r   r9   )r   HOSTportv6socktyper   r   r   r   r      s   zClient.__init__c                 C   s   t j||f| jdd |  S )Nr>   r?   )r   r   r9   
get_result)r   rO   rP   r   r   r   generic_fun   s   zClient.generic_func                 C   s$   t | j\}}|d krt||S r   )r   rA   r9   r4   )r   r   rQ   r   r   r   rh      s   zClient.get_resultc                    s    fddS )Nc                     s     | S r   )ri   )xnamer   r   r   <lambda>   s    z$Client.__getattr__.<locals>.<lambda>r   )r   rl   r   rk   r   __getattr__   s   zClient.__getattr__N)	r,   r-   r.   r/   PORTr   ri   rh   rn   r   r   r   r   r_      s    	r_   Fc              
   C   s  d}|rt jnt j}t  |t j}|t jt jd td|| |	||f |
d td |d urJtd| t|ddt  |f  	 z| \}}W n t jym }	 z|	d d
krhW Y d }	~	qJ d }	~	ww td| | |}
t|
jd}td| qK)Nr6   r    z
bind %s:%d   zaccepting connectionszstoring host+port in %swz%s:%d TzInterrupted system callzConnected to %sr   zThread ID: %d)rT   r`   ra   rb   
setsockopt
SOL_SOCKETSO_REUSEADDRrM   rN   bindlistenopenr	   gethostnameacceptrU   _threadstart_new_threadrY   debug)new_handlerre   report_to_filerf   rd   rg   r   r   addrrR   ibstidr   r   r   
run_server   s0   

r   )r/   r   r   rH   rz   rF   rT   logging	getLoggerr,   rM   ro   r   r   r   rE   r1   r4   r5   r_   r   r   r   r   r   <module>   s$   
)i