func (*diskStoreSuite) TestConcurrentAccess(c *gc.C) { var tw loggo.TestWriter c.Assert(loggo.RegisterWriter("test-log", &tw, loggo.DEBUG), gc.IsNil) dir := c.MkDir() store, err := configstore.NewDisk(dir) c.Assert(err, jc.ErrorIsNil) envDir := storePath(dir, "") lock, err := configstore.AcquireEnvironmentLock(envDir, "blocking-op") c.Assert(err, jc.ErrorIsNil) defer lock.Unlock() _, err = store.ReadInfo("someenv") c.Assert(errors.Cause(err), gc.Equals, fslock.ErrTimeout) // Using . between environments and env.lock so we don't have to care // about forward vs. backwards slash separator. messages := []jc.SimpleMessage{ {loggo.WARNING, `configstore lock held, lock dir: .*environments.env\.lock`}, {loggo.WARNING, `lock holder message: pid: \d+, operation: blocking-op`}, } c.Check(tw.Log(), jc.LogMatches, messages) }
func (*diskStoreSuite) TestConcurrentAccessBreaksIfTimeExceeded(c *gc.C) { var tw loggo.TestWriter c.Assert(loggo.RegisterWriter("test-log", &tw, loggo.DEBUG), gc.IsNil) dir := c.MkDir() store, err := configstore.NewDisk(dir) c.Assert(err, jc.ErrorIsNil) envDir := storePath(dir, "") _, err = configstore.AcquireEnvironmentLock(envDir, "blocking-op") c.Assert(err, jc.ErrorIsNil) _, err = store.ReadInfo("somemodel") c.Check(err, jc.Satisfies, errors.IsNotFound) // Using . between environments and env.lock so we don't have to care // about forward vs. backwards slash separator. messages := []jc.SimpleMessage{ {loggo.WARNING, `breaking configstore lock, lock dir: .*models.env\.lock`}, {loggo.WARNING, `lock holder message: pid: \d+, operation: blocking-op`}, } c.Check(tw.Log(), jc.LogMatches, messages) }