1. 09 2月, 2019 1 次提交
    • N
      rpc: client: stream: fix multi thread abort/finish · d63c82df
      Nikolay Shirokovskiy 提交于
      If 2 threads call abort for example then one of them
      will hang because client will send 2 abort messages and
      server will reply only on first of them, the second will be
      ignored. And on server reply client changes the state only
      one of abort message to complete, the second will hang forever.
      There are other similar issues.
      
      We should complete all messages waiting reply if we got
      error or expected abort/finish reply from server. Also if one
      thread send finish and another abort one of them will win
      the race and server will either abort or finish stream. If
      stream is aborted then thread requested finishing should report
      error. In order to archive this let's keep stream closing reason
      in @closed field. If we receive VIR_NET_OK message for stream
      then stream is finished if oldest (closest to queue end) message
      in stream queue is finish message and stream is aborted if oldest
      message is abort message. Otherwise it is protocol error.
      
      By the way we need to fix case of receiving VIR_NET_CONTINUE
      message. Now we take oldest message in queue and check if
      this is dummy message. If one thread first sends abort and
      second thread then receives data then oldest message is abort
      message and second thread won't be notified when data arrives.
      Let's find oldest dummy message instead.
      Signed-off-by: NNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      d63c82df
  2. 08 2月, 2019 2 次提交
    • N
      rpc: client stream: dispose private data on stream dispose · fbcb7386
      Nikolay Shirokovskiy 提交于
      If we call virStreamFinish and virStreamAbort from 2 distinct
      threads for example we can have access to freed memory.
      Because when virStreamFinish finishes for example virStreamAbort
      yet to be finished and it access virNetClientStreamPtr object
      in stream->privateData.
      
      Also it does not make sense to clear @driver field. After
      stream is finished/aborted it is better to have appropriate
      error message instead of "unsupported error".
      
      This commit reverts [1] or virNetClientStreamPtr and
      virStreamPtr will never be unrefed due to cyclic dependency.
      Before this patch we don't have leaks because all execution
      paths we call virStreamFinish or virStreamAbort.
      
      [1] 8b6ffe40 : virNetClientStreamNew: Track origin stream
      Signed-off-by: NNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
      fbcb7386
    • N
      rpc: client: incapsulate error checks · ad063f61
      Nikolay Shirokovskiy 提交于
      Checking virNetClientStreamRaiseError without client lock
      is racy which is fixed in [1] for example. Thus let's remove such checks
      when we are sending message to server. And in other cases
      (like virNetClientStreamRecvHole for example) let's move the check
      into client stream code.
      
      virNetClientStreamRecvPacket already have stream lock so we could
      introduce another error checking function like virNetClientStreamRaiseErrorLocked
      but as error is set when both client and stream lock are hold we
      can remove locking from virNetClientStreamRaiseError because all
      callers hold either client or stream lock.
      
      Also let's split virNetClientStreamRaiseErrorLocked into checking
      state function and checking message send status function. They are
      same yet.
      
      [1] 1b6a29c21: rpc: fix race on stream abort/finish and server side abort
      Signed-off-by: NNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      ad063f61
  3. 14 12月, 2018 2 次提交
    • D
      Enforce a standard header file guard symbol name · 568a4172
      Daniel P. Berrangé 提交于
      Require that all headers are guarded by a symbol named
      
        LIBVIRT_$FILENAME
      
      where $FILENAME is the uppercased filename, with all characters
      outside a-z changed into '_'.
      
      Note we do not use a leading __ because that is technically a
      namespace reserved for the toolchain.
      Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
      568a4172
    • D
      Remove all Author(s): lines from source file headers · 60046283
      Daniel P. Berrangé 提交于
      In many files there are header comments that contain an Author:
      statement, supposedly reflecting who originally wrote the code.
      In a large collaborative project like libvirt, any non-trivial
      file will have been modified by a large number of different
      contributors. IOW, the Author: comments are quickly out of date,
      omitting people who have made significant contribitions.
      
      In some places Author: lines have been added despite the person
      merely being responsible for creating the file by moving existing
      code out of another file. IOW, the Author: lines give an incorrect
      record of authorship.
      
      With this all in mind, the comments are useless as a means to identify
      who to talk to about code in a particular file. Contributors will always
      be better off using 'git log' and 'git blame' if they need to  find the
      author of a particular bit of code.
      
      This commit thus deletes all Author: comments from the source and adds
      a rule to prevent them reappearing.
      
      The Copyright headers are similarly misleading and inaccurate, however,
      we cannot delete these as they have legal meaning, despite being largely
      inaccurate. In addition only the copyright holder is permitted to change
      their respective copyright statement.
      Reviewed-by: NErik Skultety <eskultet@redhat.com>
      Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
      60046283
  4. 18 5月, 2017 5 次提交
  5. 21 9月, 2012 1 次提交
  6. 07 8月, 2012 1 次提交
  7. 23 7月, 2012 1 次提交
    • O
      Desert the FSF address in copyright · f9ce7dad
      Osier Yang 提交于
      Per the FSF address could be changed from time to time, and GNU
      recommends the following now: (http://www.gnu.org/licenses/gpl-howto.html)
      
        You should have received a copy of the GNU General Public License
        along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
      
      This patch removes the explicit FSF address, and uses above instead
      (of course, with inserting 'Lesser' before 'General').
      
      Except a bunch of files for security driver, all others are changed
      automatically, the copyright for securify files are not complete,
      that's why to do it manually:
      
        src/security/security_selinux.h
        src/security/security_driver.h
        src/security/security_selinux.c
        src/security/security_apparmor.h
        src/security/security_apparmor.c
        src/security/security_driver.c
      f9ce7dad
  8. 12 1月, 2012 1 次提交
    • M
      stream: Check for stream EOF · 833b901c
      Michal Privoznik 提交于
      If client stream does not have any data to sink and neither received
      EOF, a dummy packet is sent to the daemon signalising client is ready to
      sink some data. However, after we added event loop to client a race may
      occur:
      
      Thread 1 calls virNetClientStreamRecvPacket and since no data are cached
      nor stream has EOF, it decides to send dummy packet to server which will
      sent some data in turn. However, during this decision and actual message
      exchange with server -
      
      Thread 2 receives last stream data from server. Therefore an EOF is set
      on stream and if there is a call waiting (which is not yet) it is woken
      up. However, Thread 1 haven't sent anything so far, so there is no call
      to be woken up. So this thread sent dummy packet to daemon, which
      ignores that as no stream is associated with such packet and therefore
      no reply will ever come.
      
      This race causes client to hang indefinitely.
      833b901c
  9. 24 6月, 2011 1 次提交
    • D
      Introduce generic RPC client objects · 434de30d
      Daniel P. Berrange 提交于
      To facilitate creation of new clients using XDR RPC services,
      pull alot of the remote driver code into a set of reusable
      objects.
      
       - virNetClient: Encapsulates a socket connection to a
         remote RPC server. Handles all the network I/O for
         reading/writing RPC messages. Delegates RPC encoding
         and decoding to the registered programs
      
       - virNetClientProgram: Handles processing and dispatch
         of RPC messages for a single RPC (program,version).
         A program can register to receive async events
         from a client
      
       - virNetClientStream: Handles generic I/O stream
         integration to RPC layer
      
      Each new client program now merely needs to define the list of
      RPC procedures & events it wants and their handlers. It does
      not need to deal with any of the network I/O functionality at
      all.
      434de30d