1. 19 Jan, 2013 1 commit
  2. 02 Dec, 2012 2 commits
    • antirez's avatar
      Blocking POP: use a dictionary to store keys clinet side. · 2f87cf8b
      antirez authored
      To store the keys we block for during a blocking pop operation, in the
      case the client is blocked for more data to arrive, we used a simple
      linear array of redis objects, in the blockingState structure:
      
          robj **keys;
          int count;
      
      However in order to fix issue #801 we also use a dictionary in order to
      avoid to end in the blocked clients queue for the same key multiple
      times with the same client.
      
      The dictionary was only temporary, just to avoid duplicates, but since
      we create / destroy it there is no point in doing this duplicated work,
      so this commit simply use a dictionary as the main structure to store
      the keys we are blocked for. So instead of the previous fields we now
      just have:
      
          dict *keys;
      
      This simplifies the code and reduces the work done by the server during
      a blocking POP operation.
      2f87cf8b
    • antirez's avatar
      Client should not block multiple times on the same key. · 4e6dd7bc
      antirez authored
      Sending a command like:
      
      BLPOP foo foo foo foo 0
      
      Resulted into a crash before this commit since the client ended being
      inserted in the waiting list for this key multiple times.
      This resulted into the function handleClientsBlockedOnLists() to fail
      because we have code like that:
      
          if (de) {
              list *clients = dictGetVal(de);
              int numclients = listLength(clients);
      
              while(numclients--) {
                  listNode *clientnode = listFirst(clients);
      
                  /* server clients here... */
              }
          }
      
      The code to serve clients used to remove the served client from the
      waiting list, so if a client is blocking multiple times, eventually the
      call to listFirst() will return NULL or worse will access random memory
      since the list may no longer exist as it is removed by the function
      unblockClientWaitingData() if there are no more clients waiting for this
      list.
      
      To avoid making the rest of the implementation more complex, this commit
      modifies blockForKeys() so that a client will be put just a single time
      into the waiting list for a given key.
      
      Since it is Saturday, I hope this fixes issue #801.
      4e6dd7bc
  3. 08 Nov, 2012 1 commit
  4. 17 Sep, 2012 1 commit
    • antirez's avatar
      A reimplementation of blocking operation internals. · 7eb850ef
      antirez authored
      Redis provides support for blocking operations such as BLPOP or BRPOP.
      This operations are identical to normal LPOP and RPOP operations as long
      as there are elements in the target list, but if the list is empty they
      block waiting for new data to arrive to the list.
      
      All the clients blocked waiting for th same list are served in a FIFO
      way, so the first that blocked is the first to be served when there is
      more data pushed by another client into the list.
      
      The previous implementation of blocking operations was conceived to
      serve clients in the context of push operations. For for instance:
      
      1) There is a client "A" blocked on list "foo".
      2) The client "B" performs `LPUSH foo somevalue`.
      3) The client "A" is served in the context of the "B" LPUSH,
      synchronously.
      
      Processing things in a synchronous way was useful as if "A" pushes a
      value that is served by "B", from the point of view of the database is a
      NOP (no operation) thing, that is, nothing is replicated...
      7eb850ef
  5. 18 Apr, 2012 1 commit
  6. 27 Mar, 2012 1 commit
  7. 29 Feb, 2012 2 commits
  8. 28 Feb, 2012 2 commits
  9. 31 Jan, 2012 1 commit
  10. 19 Dec, 2011 1 commit
    • BigCat's avatar
      Fix issue #247 : Accepting non-integer parameters when shouldn't · 706b32e0
      BigCat authored
      Using `getLongFromObjectOrReply` instead of `atoi` if possible.
      The following functions are modified.
      
      * lrangeCommand
      * ltrimCommand
      * lremCommand
      * lindexCommand
      * lsetCommand
      * zunionInterGenericCommand
      * genericZrangebyscoreCommand
      * sortCommand
      706b32e0
  11. 08 Nov, 2011 1 commit
  12. 04 Oct, 2011 1 commit
  13. 14 Sep, 2011 1 commit
  14. 12 Sep, 2011 1 commit
  15. 07 Sep, 2011 1 commit
  16. 08 Jul, 2011 1 commit
    • antirez's avatar
      Take a pointer to the relevant entry of the command table in the client... · 09e2d9ee
      antirez authored
      Take a pointer to the relevant entry of the command table in the client structure. This is generally a more sounding design, simplifies a few functions prototype, and as a side effect fixes a bug related to the conversion of EXPIRE -1 to DEL: before of this fix Redis tried to convert it into an EXPIREAT in the AOF code, regardless of our rewrite of the command.
      09e2d9ee
  17. 20 Jun, 2011 1 commit
  18. 11 May, 2011 1 commit
  19. 15 Apr, 2011 1 commit
  20. 03 Feb, 2011 2 commits
  21. 17 Jan, 2011 1 commit
  22. 29 Dec, 2010 1 commit
  23. 07 Dec, 2010 1 commit
  24. 06 Dec, 2010 6 commits
  25. 30 Nov, 2010 7 commits