func (db *serviceClient) NewBBSLockRunner(logger lager.Logger, bbsPresence *models.BBSPresence, retryInterval, lockTTL time.Duration) (ifrit.Runner, error) { bbsPresenceJSON, err := models.ToJSON(bbsPresence) if err != nil { return nil, err } return locket.NewLock(logger, db.consulClient, locket.LockSchemaPath("bbs_lock"), bbsPresenceJSON, db.clock, retryInterval, lockTTL), nil }
func (t *ConsulHelper) RegisterCell(cell *models.CellPresence) { var err error jsonBytes, err := json.Marshal(cell) Expect(err).NotTo(HaveOccurred()) // Use NewLock instead of NewPresence in order to block on the cell being registered runner := locket.NewLock(t.logger, t.consulClient, bbs.CellSchemaPath(cell.CellId), jsonBytes, clock.NewClock(), locket.RetryInterval, locket.LockTTL) ifrit.Invoke(runner) Expect(err).NotTo(HaveOccurred()) }
"github.com/tedsuo/ifrit" "github.com/tedsuo/ifrit/ginkgomon" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Ping API", func() { Describe("Protobuf Ping", func() { It("returns true when the bbs is running", func() { By("having the bbs down", func() { Expect(client.Ping(logger)).To(BeFalse()) }) By("starting the bbs without a lock", func() { competingBBSLock := locket.NewLock(logger, consulClient, locket.LockSchemaPath("bbs_lock"), []byte{}, clock.NewClock(), locket.RetryInterval, locket.DefaultSessionTTL) competingBBSLockProcess := ifrit.Invoke(competingBBSLock) defer ginkgomon.Kill(competingBBSLockProcess) bbsRunner = testrunner.New(bbsBinPath, bbsArgs) bbsRunner.StartCheck = "bbs.lock.acquiring-lock" bbsProcess = ginkgomon.Invoke(bbsRunner) Expect(client.Ping(logger)).To(BeFalse()) }) By("finally acquiring the lock", func() { Eventually(func() bool { return client.Ping(logger) }).Should(BeTrue()) })
lockKeyMetric := strings.Replace(lockKey, "/", "-", -1) lockHeldMetricName = "LockHeld." + lockKeyMetric lockUptimeMetricName = "LockHeldDuration." + lockKeyMetric lockValue = []byte("some-value") retryInterval = 500 * time.Millisecond lockTTL = 5 * time.Second logger = lagertest.NewTestLogger("locket") sender = fake.NewFakeMetricSender() metrics.Initialize(sender, nil) }) JustBeforeEach(func() { clock = fakeclock.NewFakeClock(time.Now()) lockRunner = locket.NewLock(logger, consulClient, lockKey, lockValue, clock, retryInterval, lockTTL) }) AfterEach(func() { ginkgomon.Kill(lockProcess) }) var shouldEventuallyHaveNumSessions = func(numSessions int) { Eventually(func() int { sessions, _, err := consulClient.Session().List(nil) Expect(err).NotTo(HaveOccurred()) return len(sessions) }).Should(Equal(numSessions)) } Context("When consul is running", func() {