Skip to content

Commit

Permalink
Mutex in the API
Browse files Browse the repository at this point in the history
  • Loading branch information
heynemann committed Nov 18, 2016
1 parent ca2f94b commit b04e00b
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 24 deletions.
16 changes: 13 additions & 3 deletions api/donation.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ func CreateDonationHandler(app *App) func(c echo.Context) error {
zap.String("operation", "CreateDonation"),
)
c.Set("route", "CreateDonation")
gameID := c.Param("gameID")
donationRequestID := c.Param("donationRequestID")

log.D(l, "Creating donation...")
Expand All @@ -128,14 +129,23 @@ func CreateDonationHandler(app *App) func(c echo.Context) error {

var donationRequest *models.DonationRequest
err = WithSegment("model", c, func() error {
mutexID := fmt.Sprintf("Donate-%s-%s", gameID, donationRequestID)
mutex := app.GetMutex(mutexID, 32, 8) // Number of retries to get lock and Lock expiration
err := mutex.Lock()
if err != nil {
log.E(l, "Could not acquire lock after many retries.", func(cm log.CM) {
cm.Write(zap.Error(err))
})
return err
}
defer mutex.Unlock()

donationRequest, err = models.GetDonationRequestByID(donationRequestID, app.MongoDb, app.Logger)
if err != nil {
return err
}

mutex := app.GetMutex("Donate", 32, 8) // Number of retries to get lock and Lock expiration
err := donationRequest.Donate(payload.Player, payload.Amount, app.MongoDb, mutex, app.Logger)
fmt.Println(err)
err = donationRequest.Donate(payload.Player, payload.Amount, app.MongoDb, app.Logger)
if err != nil {
return err
}
Expand Down
13 changes: 1 addition & 12 deletions models/donation.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"github.com/uber-go/zap"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
redsync "gopkg.in/redsync.v1"
)

//Donation represents a specific donation a player made to a request
Expand Down Expand Up @@ -106,7 +105,7 @@ func (d *DonationRequest) Create(db *mgo.Database, logger zap.Logger) error {
}

//Donate an item in a given Donation Request
func (d *DonationRequest) Donate(player string, amount int, db *mgo.Database, mutex *redsync.Mutex, logger zap.Logger) error {
func (d *DonationRequest) Donate(player string, amount int, db *mgo.Database, logger zap.Logger) error {
l := logger.With(
zap.String("source", "DonationRequestModel"),
zap.String("operation", "Donate"),
Expand Down Expand Up @@ -146,16 +145,6 @@ func (d *DonationRequest) Donate(player string, amount int, db *mgo.Database, mu
return err
}

err = mutex.Lock()
defer mutex.Unlock()
if err != nil {
log.E(l, "Could not acquire lock for donation after many retries.", func(cm log.CM) {
cm.Write(zap.Error(err))
})

return err
}

err = d.ValidateDonationRequestLimit(game, logger)
if err != nil {
log.E(l, err.Error(), func(cm log.CM) {
Expand Down
15 changes: 6 additions & 9 deletions models/donation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ var _ = Describe("Donation Model", func() {
Expect(err).NotTo(HaveOccurred())

donerID := uuid.NewV4().String()
err = donationRequest.Donate(donerID, 1, db, GetTestMutex("donate", rs), logger)
err = donationRequest.Donate(donerID, 1, db, logger)
Expect(err).NotTo(HaveOccurred())

dbDonationRequest, err := models.GetDonationRequestByID(donationRequest.ID, db, logger)
Expand All @@ -171,7 +171,7 @@ var _ = Describe("Donation Model", func() {

dr, err := GetTestDonationRequest(game, db, logger)

err = dr.Donate(uuid.NewV4().String(), 2, db, GetTestMutex("donate", rs), logger)
err = dr.Donate(uuid.NewV4().String(), 2, db, logger)
Expect(err).NotTo(HaveOccurred())

dbDonationRequest, err := models.GetDonationRequestByID(dr.ID, db, logger)
Expand All @@ -187,10 +187,10 @@ var _ = Describe("Donation Model", func() {

dr, err := GetTestDonationRequest(game, db, logger)

err = dr.Donate(uuid.NewV4().String(), 2, db, GetTestMutex("donate", rs), logger)
err = dr.Donate(uuid.NewV4().String(), 2, db, logger)
Expect(err).NotTo(HaveOccurred())

err = dr.Donate(uuid.NewV4().String(), 1, db, GetTestMutex("donate", rs), logger)
err = dr.Donate(uuid.NewV4().String(), 1, db, logger)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("This donation request is already finished."))
})
Expand All @@ -203,7 +203,7 @@ var _ = Describe("Donation Model", func() {

dr, err := GetTestDonationRequest(game, db, logger)

err = dr.Donate("", 2, db, GetTestMutex("donate", rs), logger)
err = dr.Donate("", 2, db, logger)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("Player is required to create a new Donation."))
})
Expand All @@ -216,7 +216,7 @@ var _ = Describe("Donation Model", func() {

dr, err := GetTestDonationRequest(game, db, logger)

err = dr.Donate(uuid.NewV4().String(), 0, db, GetTestMutex("donate", rs), logger)
err = dr.Donate(uuid.NewV4().String(), 0, db, logger)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("Amount is required to create a new Donation."))
})
Expand All @@ -225,7 +225,6 @@ var _ = Describe("Donation Model", func() {
Describe("Measure", func() {
var game *models.Game
var donationRequest *models.DonationRequest
var mutex *redsync.Mutex
var err error

BeforeOnce(func() {
Expand All @@ -245,7 +244,6 @@ var _ = Describe("Donation Model", func() {
)
err = donationRequest.Create(db, logger)
Expect(err).NotTo(HaveOccurred())
mutex = GetTestMutex("donate", rs)
})

Measure("it should donate items fast", func(b Benchmarker) {
Expand All @@ -255,7 +253,6 @@ var _ = Describe("Donation Model", func() {
donorID,
1,
db,
mutex,
logger,
)
Expect(err).NotTo(HaveOccurred())
Expand Down

0 comments on commit b04e00b

Please sign in to comment.