Uploaded image for project: 'Go Driver'
  1. Go Driver
  2. GODRIVER-390

Getting a connection from a pool can be starved indefinitely

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Major - P3 Major - P3
    • 0.0.4
    • Affects Version/s: 0.0.3
    • Component/s: Connections
    • Labels:
      None

      In an application where the maximum number of connections has been dialed and they are all in use, attempting to get a new connection will wait, attempting to acquire a semaphore. If the application has further heavy load and the idle pool is never filled, no connections will be closed, which will indefinitely starve the attempt to get a new connection.

      To fix this problem:

      1. Refactor the code so that dialing a new connection is it's own function that takes a context and a channel.
      2. If we can acquire a permit from the semaphore, dial the connection and return it down the provided channel. If the context has been canceled, we close the connection, because the Get method received a connection from the idle pool or canceled the context for another reason.
      3. In the main Get method, attempt to first retrieve a connection from the idle pool, and if that cannot be done, then call the new connection method in a goroutine and block on either the new connection, an idle pool connection, or for the context's done channel. If either the context done channel or the idle pool connection channel unblock, cancel the new connection context.

            Assignee:
            kris.brandow@mongodb.com Kristofer Brandow (Inactive)
            Reporter:
            kris.brandow@mongodb.com Kristofer Brandow (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: