From 0982b9037736fca16112a31c5708c4efbc0e8b17 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sat, 9 May 2015 09:42:22 +0300 Subject: [PATCH 01/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB=D1=82=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B0,=20=D0=B2=D0=BE?= =?UTF-8?q?=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D0=BA=D0=B0=D1=83=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CounterControllerTest.cs | 26 ++++++++++++++++++- .../Controllers/CounterController.cs | 16 ++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs index ba538e1..a44ac37 100644 --- a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs +++ b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs @@ -1,4 +1,5 @@ -using System.Net; +using System.Linq; +using System.Net; using System.Threading.Tasks; using System.Web.Http; using BuildRevisionCounter.Controllers; @@ -64,5 +65,28 @@ public async Task CurrentReturnsSameValueAsPreviousBumping() var rev2 = await _controller.Current("CurrentReturnSameValueAsPreviousBumping"); Assert.AreEqual(rev1, rev2); } + + [Test] + public async Task GetAllRevisionReturnsAllRevision() + { + const string revName1 = "BumpingIncrementsRevisionNumber1"; + const string revName2 = "BumpingIncrementsRevisionNumber2"; + const string revName3 = "BumpingIncrementsRevisionNumber3"; + + await _controller.Bumping(revName1); + await _controller.Bumping(revName1); + await _controller.Bumping(revName2); + await _controller.Bumping(revName3); + + var rev1 = await _controller.Current(revName1); + var rev2 = await _controller.Current(revName2); + var rev3 = await _controller.Current(revName3); + + var result = await _controller.GetAllRevision(); + + Assert.IsTrue(result.Any(x => x.Id == revName1 && x.NextNumber == rev1)); + Assert.IsTrue(result.Any(x => x.Id == revName2 && x.NextNumber == rev2)); + Assert.IsTrue(result.Any(x => x.Id == revName3 && x.NextNumber == rev3)); + } } } \ No newline at end of file diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index c0e65a8..41fff7e 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using System.Web.Http; @@ -27,6 +28,21 @@ public CounterController(IMongoDBStorage mongoDbStorage) _mongoDbStorage = mongoDbStorage; } + [HttpGet] + [Route("")] + [Authorize(Roles = "admin, editor, anonymous")] + public async Task> GetAllRevision() + { + var revisions = await _mongoDbStorage.Revisions + .Find(r => true) + .ToListAsync(); + + if (revisions == null) + throw new HttpResponseException(HttpStatusCode.NotFound); + + return revisions; + } + [HttpGet] [Route("{revisionName}")] [Authorize(Roles = "admin, editor, anonymous")] From 092a1c7c4ee1827ddeb9650ad7a6b3e84e936c6c Mon Sep 17 00:00:00 2001 From: AleXK Date: Sat, 9 May 2015 10:39:34 +0300 Subject: [PATCH 02/12] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=B0=D1=83=D0=BD=D1=82=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CounterControllerTest.cs | 12 +++++- .../Controllers/CounterController.cs | 41 +++++++++++++------ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs index a44ac37..7edb02c 100644 --- a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs +++ b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs @@ -44,12 +44,20 @@ public async Task CurrentThrowsExceptionIfRevisionNotFound() } [Test] - public async Task BumpingNewRevisionReturnsOne() + public async Task BumpingNewRevisionReturnsZero() { var rev = await _controller.Bumping("BumpingNewRevisionReturnsZero"); - Assert.AreEqual(1, rev); + Assert.AreEqual(0, rev); } + [Test] + public async Task BumpingNewRevisionMayBeInvokedMultipleTimes() + { + const string revName = "BumpingNewRevisionMayBeInvokedMultipleTimes"; + await _controller.Bumping(revName); + await _controller.Bumping(revName); + } + [Test] public async Task BumpingIncrementsRevisionNumber() { diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index 41fff7e..78752ba 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -63,21 +63,36 @@ public async Task Current([FromUri] string revisionName) [Authorize(Roles = "buildserver")] public async Task Bumping([FromUri] string revisionName) { - var result = await _mongoDbStorage.Revisions - .FindOneAndUpdateAsync( - r => r.Id == revisionName, - Builders.Update - .Inc(r => r.NextNumber, 1) - .SetOnInsert(r => r.Created, DateTime.UtcNow) - .Set(r => r.Updated, DateTime.UtcNow), - new FindOneAndUpdateOptions - { - IsUpsert = true, - ReturnDocument = ReturnDocument.After - }); + var existRevision = await _mongoDbStorage.Revisions + .CountAsync(r => r.Id == revisionName); + if (existRevision == 0) + { + await _mongoDbStorage.Revisions + .InsertOneAsync(new RevisionModel + { + Id = revisionName, + NextNumber = 0, + Created = DateTime.UtcNow + }); + return 0; + } + else + { + var result = await _mongoDbStorage.Revisions + .FindOneAndUpdateAsync( + r => r.Id == revisionName, + Builders.Update + .Inc(r => r.NextNumber, 1) + .Set(r => r.Updated, DateTime.UtcNow), + new FindOneAndUpdateOptions + { + IsUpsert = true, + ReturnDocument = ReturnDocument.After + }); - return result.NextNumber; + return result.NextNumber; + } } } } \ No newline at end of file From 14f853068233295ac9909c1f837acd2cedec9186 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 10 May 2015 12:36:46 +0300 Subject: [PATCH 03/12] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B5=D1=84=D0=B5=D1=80=D0=B5=D0=BD=D1=81=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=BE=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8,=20=D1=83?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=BB=20binginRedirect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BuildRevisionCounter.Tests/App.config | 7 +--- .../BuildRevisionCounter.Tests.csproj | 12 +++++- BuildRevisionCounter.Tests/packages.config | 3 ++ .../BuildRevisionCounter.csproj | 34 +++++++++++------ BuildRevisionCounter/Web.config | 38 ++++++++----------- BuildRevisionCounter/packages.config | 14 ++++--- 6 files changed, 59 insertions(+), 49 deletions(-) diff --git a/BuildRevisionCounter.Tests/App.config b/BuildRevisionCounter.Tests/App.config index a0d182e..6e9cd70 100644 --- a/BuildRevisionCounter.Tests/App.config +++ b/BuildRevisionCounter.Tests/App.config @@ -1,11 +1,6 @@  - - - + - \ No newline at end of file diff --git a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj index eb99439..77fe089 100644 --- a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj +++ b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj @@ -47,15 +47,23 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll + + False + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + + False - ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll diff --git a/BuildRevisionCounter.Tests/packages.config b/BuildRevisionCounter.Tests/packages.config index 4dd89e5..ac95f92 100644 --- a/BuildRevisionCounter.Tests/packages.config +++ b/BuildRevisionCounter.Tests/packages.config @@ -1,7 +1,10 @@  + + + \ No newline at end of file diff --git a/BuildRevisionCounter/BuildRevisionCounter.csproj b/BuildRevisionCounter/BuildRevisionCounter.csproj index 596f9ab..6c1e6b3 100644 --- a/BuildRevisionCounter/BuildRevisionCounter.csproj +++ b/BuildRevisionCounter/BuildRevisionCounter.csproj @@ -40,11 +40,13 @@ - - ..\packages\Microsoft.Owin.3.0.0\lib\net45\Microsoft.Owin.dll + + False + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll - - ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + + False + ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll False @@ -57,9 +59,9 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - + False - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll False @@ -85,9 +87,13 @@ - + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + + False - ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll + ..\packages\Microsoft.AspNet.Cors.5.2.3\lib\net45\System.Web.Cors.dll @@ -98,13 +104,17 @@ - + + False + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + + False - ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll + ..\packages\Microsoft.AspNet.WebApi.Cors.5.2.3\lib\net45\System.Web.Http.Cors.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Owin.5.0.0\lib\net45\System.Web.Http.Owin.dll + ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index 210bf89..f45d7e5 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -1,26 +1,18 @@  - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter/packages.config b/BuildRevisionCounter/packages.config index 80e8661..a41b8ab 100644 --- a/BuildRevisionCounter/packages.config +++ b/BuildRevisionCounter/packages.config @@ -1,14 +1,16 @@  - - - - - + + + + + + + - + From a97be84b51be7112a25802c51b574a454e6b52c6 Mon Sep 17 00:00:00 2001 From: AleXK Date: Tue, 12 May 2015 11:14:30 +0300 Subject: [PATCH 04/12] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Добавил пагинацию для метода возвращающего все каунтеры 2. Добавил блокировку на создание нового каунтера. Уйти от 2 запросов к БД не получилось. Проблему многопоточного доступа решил в коде сервиса --- .../Controllers/CounterControllerTest.cs | 72 ++++++++++++-- .../Controllers/CounterController.cs | 95 +++++++++++-------- 2 files changed, 118 insertions(+), 49 deletions(-) diff --git a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs index 7edb02c..06a4467 100644 --- a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs +++ b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Net; using System.Threading.Tasks; using System.Web.Http; @@ -50,13 +51,20 @@ public async Task BumpingNewRevisionReturnsZero() Assert.AreEqual(0, rev); } - [Test] - public async Task BumpingNewRevisionMayBeInvokedMultipleTimes() - { - const string revName = "BumpingNewRevisionMayBeInvokedMultipleTimes"; - await _controller.Bumping(revName); - await _controller.Bumping(revName); - } + [Test] + public async Task BumpingNewRevisionMayBeInvokedMultipleTimes() + { + try + { + const string revName = "BumpingNewRevisionMayBeInvokedMultipleTimes"; + await _controller.Bumping(revName); + await _controller.Bumping(revName); + } + catch (Exception) + { + Assert.Fail("Ошибка при создании одного каунтера из разных потоков"); + } + } [Test] public async Task BumpingIncrementsRevisionNumber() @@ -96,5 +104,53 @@ public async Task GetAllRevisionReturnsAllRevision() Assert.IsTrue(result.Any(x => x.Id == revName2 && x.NextNumber == rev2)); Assert.IsTrue(result.Any(x => x.Id == revName3 && x.NextNumber == rev3)); } + + [Test] + public async Task GetAllRevisionReturnsSecondPage() + { + // пересоздадим БД перед этим тестом, + // он должен проводиться на чистой БД + SetUpAsync().Wait(); + + for (int i = 0; i < 10; i++) + { + string revName = "GetAllRevisionReturnsSecondPage" + i.ToString(); + await _controller.Bumping(revName); + } + + var result = await _controller.GetAllRevision(3, 2); + + Assert.IsTrue(result.Any(x => x.Id == "GetAllRevisionReturnsSecondPage3")); + Assert.IsTrue(result.Any(x => x.Id == "GetAllRevisionReturnsSecondPage4")); + Assert.IsTrue(result.Any(x => x.Id == "GetAllRevisionReturnsSecondPage5")); + } + + [Test] + public async Task GetAllRevisionArgumentExceptionPageSize() + { + try + { + await _controller.GetAllRevision(0, 2); + Assert.Fail(); + } + catch (HttpResponseException ex) + { + Assert.AreEqual(HttpStatusCode.BadRequest, ex.Response.StatusCode); + } + } + + [Test] + public async Task GetAllRevisionArgumentExceptionPageNumber() + { + try + { + await _controller.GetAllRevision(3, 0); + Assert.Fail(); + } + catch (HttpResponseException ex) + { + Assert.AreEqual(HttpStatusCode.BadRequest, ex.Response.StatusCode); + } + } } } \ No newline at end of file diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index 78752ba..f53ccd7 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -28,20 +28,25 @@ public CounterController(IMongoDBStorage mongoDbStorage) _mongoDbStorage = mongoDbStorage; } - [HttpGet] - [Route("")] - [Authorize(Roles = "admin, editor, anonymous")] - public async Task> GetAllRevision() - { - var revisions = await _mongoDbStorage.Revisions - .Find(r => true) - .ToListAsync(); + [HttpGet] + [Route("")] + [Authorize(Roles = "admin, editor, anonymous")] + public async Task> GetAllRevision([FromUri] Int32 pageSize=20, [FromUri] Int32 pageNumber=1) + { + if (pageSize < 1 || pageNumber < 1) + throw new HttpResponseException(HttpStatusCode.BadRequest); - if (revisions == null) - throw new HttpResponseException(HttpStatusCode.NotFound); + var revisions = await _mongoDbStorage.Revisions + .Find(r => true) + .Skip(pageSize * (pageNumber - 1)) + .Limit(pageSize) + .ToListAsync(); + + if (revisions == null) + throw new HttpResponseException(HttpStatusCode.NotFound); - return revisions; - } + return revisions; + } [HttpGet] [Route("{revisionName}")] @@ -58,41 +63,49 @@ public async Task Current([FromUri] string revisionName) return revision.NextNumber; } + /// + /// Объект синхранизации вставки + /// + private readonly Object _sync = new Object(); + [HttpPost] [Route("{revisionName}")] [Authorize(Roles = "buildserver")] public async Task Bumping([FromUri] string revisionName) { - var existRevision = await _mongoDbStorage.Revisions - .CountAsync(r => r.Id == revisionName); - if (existRevision == 0) - { - await _mongoDbStorage.Revisions - .InsertOneAsync(new RevisionModel - { - Id = revisionName, - NextNumber = 0, - Created = DateTime.UtcNow - }); - return 0; - } - else - { - var result = await _mongoDbStorage.Revisions - .FindOneAndUpdateAsync( - r => r.Id == revisionName, - Builders.Update - .Inc(r => r.NextNumber, 1) - .Set(r => r.Updated, DateTime.UtcNow), - new FindOneAndUpdateOptions - { - IsUpsert = true, - ReturnDocument = ReturnDocument.After - }); - + // накладывааем блокировку на проверку каунтера + // и вставку начального значения если каунтера еще нет + lock (_sync) + { + var existRevision = _mongoDbStorage.Revisions + .CountAsync(r => r.Id == revisionName) + .Result; + if (existRevision == 0) + { + _mongoDbStorage.Revisions + .InsertOneAsync(new RevisionModel + { + Id = revisionName, + NextNumber = 0, + Created = DateTime.UtcNow + }).Wait(); + return 0; + } + } - return result.NextNumber; - } + // если каунтер уже создан, то отправляем запрос в монгу + var result = await _mongoDbStorage.Revisions + .FindOneAndUpdateAsync( + r => r.Id == revisionName, + Builders.Update + .Inc(r => r.NextNumber, 1) + .Set(r => r.Updated, DateTime.UtcNow), + new FindOneAndUpdateOptions + { + IsUpsert = true, + ReturnDocument = ReturnDocument.After + }); + return result.NextNumber; } } } \ No newline at end of file From 66b3fa2e8cf17ff092d82ebfe9aa20435f357518 Mon Sep 17 00:00:00 2001 From: AleXK Date: Tue, 12 May 2015 11:23:04 +0300 Subject: [PATCH 05/12] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=82=D0=B0=D0=B1=D1=83=D0=BB=D1=8F=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D1=83=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CounterControllerTest.cs | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs index 06a4467..f565107 100644 --- a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs +++ b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs @@ -82,28 +82,28 @@ public async Task CurrentReturnsSameValueAsPreviousBumping() Assert.AreEqual(rev1, rev2); } - [Test] - public async Task GetAllRevisionReturnsAllRevision() - { - const string revName1 = "BumpingIncrementsRevisionNumber1"; - const string revName2 = "BumpingIncrementsRevisionNumber2"; - const string revName3 = "BumpingIncrementsRevisionNumber3"; - - await _controller.Bumping(revName1); - await _controller.Bumping(revName1); - await _controller.Bumping(revName2); - await _controller.Bumping(revName3); - - var rev1 = await _controller.Current(revName1); - var rev2 = await _controller.Current(revName2); - var rev3 = await _controller.Current(revName3); - - var result = await _controller.GetAllRevision(); - - Assert.IsTrue(result.Any(x => x.Id == revName1 && x.NextNumber == rev1)); - Assert.IsTrue(result.Any(x => x.Id == revName2 && x.NextNumber == rev2)); - Assert.IsTrue(result.Any(x => x.Id == revName3 && x.NextNumber == rev3)); - } + [Test] + public async Task GetAllRevisionReturnsAllRevision() + { + const string revName1 = "BumpingIncrementsRevisionNumber1"; + const string revName2 = "BumpingIncrementsRevisionNumber2"; + const string revName3 = "BumpingIncrementsRevisionNumber3"; + + await _controller.Bumping(revName1); + await _controller.Bumping(revName1); + await _controller.Bumping(revName2); + await _controller.Bumping(revName3); + + var rev1 = await _controller.Current(revName1); + var rev2 = await _controller.Current(revName2); + var rev3 = await _controller.Current(revName3); + + var result = await _controller.GetAllRevision(); + + Assert.IsTrue(result.Any(x => x.Id == revName1 && x.NextNumber == rev1)); + Assert.IsTrue(result.Any(x => x.Id == revName2 && x.NextNumber == rev2)); + Assert.IsTrue(result.Any(x => x.Id == revName3 && x.NextNumber == rev3)); + } [Test] public async Task GetAllRevisionReturnsSecondPage() From e33c72c62ab9b263aa2db09ac4b4d36c93e49042 Mon Sep 17 00:00:00 2001 From: AleXK Date: Fri, 15 May 2015 18:41:17 +0300 Subject: [PATCH 06/12] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BC=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BF=D0=BE=D1=82=D0=BE=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B.=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D1=83=20=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0.=20=D0=9A=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CounterControllerTest.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs index f565107..235c163 100644 --- a/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs +++ b/BuildRevisionCounter.Tests/Controllers/CounterControllerTest.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; @@ -35,7 +36,7 @@ public async Task CurrentThrowsExceptionIfRevisionNotFound() { try { - var rev = await _controller.Current("CurrentThrowsExceptionIfRevisionNotFound"); + await _controller.Current("CurrentThrowsExceptionIfRevisionNotFound"); Assert.Fail(); } catch (HttpResponseException ex) @@ -54,16 +55,21 @@ public async Task BumpingNewRevisionReturnsZero() [Test] public async Task BumpingNewRevisionMayBeInvokedMultipleTimes() { - try - { - const string revName = "BumpingNewRevisionMayBeInvokedMultipleTimes"; - await _controller.Bumping(revName); - await _controller.Bumping(revName); - } - catch (Exception) + string revName = "BumpingNewRevisionMayBeInvokedMultipleTimes" + Guid.NewGuid().ToString(); + + // запустим сразу n потоков вставки + const int n = 5; + List taskList = new List(); + for (int i = 0; i < n; i++) { - Assert.Fail("Ошибка при создании одного каунтера из разных потоков"); + taskList.Add(Task.Run(async () => await _controller.Bumping(revName))); } + // дождемся окончания всех потококв + Task.WaitAll(taskList.ToArray()); + + // проверим результатнашего каунтера + var res = await _controller.Current(revName); + Assert.AreEqual(n - 1, res); } [Test] From e85cc29062fabab93ecf108f431a56246ae6d8bd Mon Sep 17 00:00:00 2001 From: AleXK Date: Fri, 15 May 2015 20:11:50 +0300 Subject: [PATCH 07/12] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=B0=D1=83=D0=BD=D1=82=D0=B5=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Сначала пробуем обновить с выключенным IsUpsert. Если приходит null значит записи с таким именем еще нет 2. Пытаемся вставить ее, если получилось возвращаем 0 3. Если при вставке произошла ошибка, то значит мы не успели вставить, запускаем опять обновление --- .../Controllers/CounterController.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index f53ccd7..ae9b310 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -63,49 +63,61 @@ public async Task Current([FromUri] string revisionName) return revision.NextNumber; } - /// - /// Объект синхранизации вставки - /// - private readonly Object _sync = new Object(); - [HttpPost] [Route("{revisionName}")] [Authorize(Roles = "buildserver")] public async Task Bumping([FromUri] string revisionName) { - // накладывааем блокировку на проверку каунтера - // и вставку начального значения если каунтера еще нет - lock (_sync) + // попробуем обновить документ + var result = await FindOneAndUpdateRevisionModelAsync(revisionName); + + if (result == null) { - var existRevision = _mongoDbStorage.Revisions - .CountAsync(r => r.Id == revisionName) - .Result; - if (existRevision == 0) + // если не получилось, значит документ еще не был создан + // создадим его с начальным значением 0 + try { - _mongoDbStorage.Revisions + await _mongoDbStorage.Revisions .InsertOneAsync(new RevisionModel { Id = revisionName, NextNumber = 0, Created = DateTime.UtcNow - }).Wait(); + }); return 0; } + catch (MongoWriteException e) + { + // если прои вставке произошла ошибка значит мы не успели и запись там уже есть + // и теперь попытка обновления должна пройти без ошибок + result = FindOneAndUpdateRevisionModelAsync(revisionName).Result; + } } - // если каунтер уже создан, то отправляем запрос в монгу + return result.NextNumber; + } + + /// + /// Инкриментит каунтер в БД + /// + /// + /// + private async Task FindOneAndUpdateRevisionModelAsync(string revisionName) + { var result = await _mongoDbStorage.Revisions .FindOneAndUpdateAsync( r => r.Id == revisionName, Builders.Update .Inc(r => r.NextNumber, 1) + .SetOnInsert(r => r.Created, DateTime.UtcNow) .Set(r => r.Updated, DateTime.UtcNow), new FindOneAndUpdateOptions { - IsUpsert = true, + IsUpsert = false, ReturnDocument = ReturnDocument.After }); - return result.NextNumber; + + return result; } } } \ No newline at end of file From 07090b88153e824e3ac725db9f944066e65d1baf Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 17 May 2015 09:35:12 +0300 Subject: [PATCH 08/12] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83?= =?UTF-8?q?=D0=B5=D0=BC=D1=83=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BuildRevisionCounter/Controllers/CounterController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index ae9b310..23e6126 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -86,7 +86,7 @@ await _mongoDbStorage.Revisions }); return 0; } - catch (MongoWriteException e) + catch (MongoWriteException) { // если прои вставке произошла ошибка значит мы не успели и запись там уже есть // и теперь попытка обновления должна пройти без ошибок From 0869d7874f669ea0b733e9b1f474665c0e15bdc5 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 17 May 2015 10:45:51 +0300 Subject: [PATCH 09/12] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D1=8B=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D0=B5=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=82?= =?UTF-8?q?=D1=8C=D1=81=D1=8F=20=D0=B8=D0=B7=20=D0=B7=D0=B0=20Ninject=20(N?= =?UTF-8?q?inject.Web.WebApi,=20Ninject.Web.WebApi.OwinHost,=20Ninject.Web?= =?UTF-8?q?.Common.OwinHost),=20=D0=BE=D0=BD=20=D1=81=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20=D1=81=D0=BE=20=D1=81=D1=82=D0=B0=D1=80=D1=8B?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=D0=BC=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2=20System.Web.Http?= =?UTF-8?q?.Owin=205.0.0.0,=20System.Web.Http=205.0.0.0,=20Microsoft.Owin?= =?UTF-8?q?=20Microsoft.Owin=203.0.0.0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поэтому что бы не было биндинг редиректов эти пакеты не должны быть выше 5.0.0 версии. Так же после этого появилась проблема с 6 версий Newtonsoft.Json. System.Net.Http.Formatting и System.Web.Http собраны под 4,5 версию. В итоге Newtonsoft.Json должна быть не выше 4.5. Сборка, тесты и запуск проходят успешно --- BuildRevisionCounter.Tests/App.config | 6 +-- .../BuildRevisionCounter.Tests.csproj | 16 +++---- BuildRevisionCounter.Tests/packages.config | 6 +-- .../BuildRevisionCounter.csproj | 42 +++++++------------ BuildRevisionCounter/Web.config | 30 ++++++------- BuildRevisionCounter/packages.config | 13 +++--- 6 files changed, 50 insertions(+), 63 deletions(-) diff --git a/BuildRevisionCounter.Tests/App.config b/BuildRevisionCounter.Tests/App.config index 6e9cd70..2a98551 100644 --- a/BuildRevisionCounter.Tests/App.config +++ b/BuildRevisionCounter.Tests/App.config @@ -1,6 +1,6 @@  - - - + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj index 77fe089..b7179eb 100644 --- a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj +++ b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj @@ -47,23 +47,23 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - - False - ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll - + + False ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll diff --git a/BuildRevisionCounter.Tests/packages.config b/BuildRevisionCounter.Tests/packages.config index ac95f92..5f2716a 100644 --- a/BuildRevisionCounter.Tests/packages.config +++ b/BuildRevisionCounter.Tests/packages.config @@ -1,10 +1,10 @@  - - + + - + \ No newline at end of file diff --git a/BuildRevisionCounter/BuildRevisionCounter.csproj b/BuildRevisionCounter/BuildRevisionCounter.csproj index 6c1e6b3..78c442b 100644 --- a/BuildRevisionCounter/BuildRevisionCounter.csproj +++ b/BuildRevisionCounter/BuildRevisionCounter.csproj @@ -40,13 +40,9 @@ - + False - ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll - - - False - ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + ..\packages\Microsoft.Owin.2.0.2\lib\net45\Microsoft.Owin.dll False @@ -59,9 +55,8 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - - False - ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll False @@ -73,13 +68,16 @@ ..\packages\Ninject.Web.Common.3.2.3.0\lib\net45-full\Ninject.Web.Common.dll - + + False ..\packages\Ninject.Web.Common.OwinHost.3.2.3.0\lib\net45-full\Ninject.Web.Common.OwinHost.dll - + + False ..\packages\Ninject.Web.WebApi.3.2.4.0\lib\net45-full\Ninject.Web.WebApi.dll - + + False ..\packages\Ninject.Web.WebApi.OwinHost.3.2.4.0\lib\net45-full\Ninject.Web.WebApi.OwinHost.dll @@ -87,13 +85,9 @@ - - False - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - - + False - ..\packages\Microsoft.AspNet.Cors.5.2.3\lib\net45\System.Web.Cors.dll + ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll @@ -104,17 +98,13 @@ - - False - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - - + False - ..\packages\Microsoft.AspNet.WebApi.Cors.5.2.3\lib\net45\System.Web.Http.Cors.dll + ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll + ..\packages\Microsoft.AspNet.WebApi.Owin.5.0.1\lib\net45\System.Web.Http.Owin.dll diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index f45d7e5..7aa4447 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -1,18 +1,18 @@  - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter/packages.config b/BuildRevisionCounter/packages.config index a41b8ab..b2d6300 100644 --- a/BuildRevisionCounter/packages.config +++ b/BuildRevisionCounter/packages.config @@ -1,16 +1,13 @@  - - - - - - - + + + + - + From 73bf5a2ac3be44c192e8470075984acf43b10d77 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 17 May 2015 14:25:51 +0300 Subject: [PATCH 10/12] =?UTF-8?q?=D0=A2.=D0=BA.=20=D0=B2=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=BD=D0=B3=D0=B5=20=D0=BD=D0=B5=D1=82=20=D1=82=D0=B0=D0=B9?= =?UTF-8?q?=D0=BC=D0=B0=D1=83=D1=82=D0=B0=20=D0=BD=D0=B0=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8E,=20=D1=82=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BB=D0=BB=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2,=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D1=85=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=80=D0=BE=D0=BB=D1=8C=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B9=D0=BC=D0=B0=D1=83=D1=82=D0=B0.=20=D0=A2=D0=B0=D0=B9?= =?UTF-8?q?=D0=BC=D0=B0=D1=83=D1=82=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B2=2030=20=D1=81=D0=B5=D0=BA.=20=D0=9C?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B5=D0=B3=D0=BE=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D1=82=D0=B8=20=D0=B2=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0,=20=D0=BD=D0=BE=20=D1=82=D0=BE=D0=B3=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B1=D1=83=D0=B4=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BE=D0=BF=D1=8F=D1=82=D1=8C=20=D1=81=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D1=91=D1=82?= =?UTF-8?q?=20=D0=BA=20=D0=B4=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8E=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0.=20?= =?UTF-8?q?=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BE=D0=BA=D0=BE=D0=BD=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B8=D0=B7=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2,=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=83=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D1=88=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=D1=81=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CounterController.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/BuildRevisionCounter/Controllers/CounterController.cs b/BuildRevisionCounter/Controllers/CounterController.cs index 23e6126..0a366dd 100644 --- a/BuildRevisionCounter/Controllers/CounterController.cs +++ b/BuildRevisionCounter/Controllers/CounterController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Net; +using System.Threading; using System.Threading.Tasks; using System.Web.Http; using BuildRevisionCounter.Interfaces; @@ -36,16 +37,29 @@ public async Task> GetAllRevision([FromUri] I if (pageSize < 1 || pageNumber < 1) throw new HttpResponseException(HttpStatusCode.BadRequest); - var revisions = await _mongoDbStorage.Revisions + CancellationTokenSource cts = new CancellationTokenSource(); + var task = _mongoDbStorage.Revisions .Find(r => true) .Skip(pageSize * (pageNumber - 1)) .Limit(pageSize) - .ToListAsync(); + .ToListAsync(cts.Token); - if (revisions == null) + // запустим паралельно 2 таска, второй таск в роли таймаута (30 сек) + const int timeout = 30*1000; + if (await Task.WhenAny(task, Task.Delay(timeout, cts.Token)) != task) + { + // посылаем команду прервать поток поиска + cts.Cancel(); + // генерируем сообщение о том что не дождались ответа от монги + throw new HttpResponseException(HttpStatusCode.GatewayTimeout); + } + // прерываем поток таймаута + cts.Cancel(); + + if (task.Result == null) throw new HttpResponseException(HttpStatusCode.NotFound); - return revisions; + return task.Result; } [HttpGet] From d911583f00cc12d9d476fc84daee622be8b1c921 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 17 May 2015 15:27:03 +0300 Subject: [PATCH 11/12] =?UTF-8?q?=D0=9D=D1=83=D0=B6=D0=BD=D0=BE=20=D0=B1?= =?UTF-8?q?=D1=8B=D0=BB=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20Microsoft.Owin.Host.SystemWeb,=20=D1=8D=D1=82=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?Owin=20=D0=B4=D0=BB=D1=8F=20iis.=20=D0=98=20=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=B8=D0=BB=D1=81=D1=8F?= =?UTF-8?q?=20=D0=B1=D0=B8=D0=BD=D0=B4=D0=B8=D0=BD=D0=B3=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=20=D0=B8=D0=B7=20=D0=B7?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20=D1=81=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BA=20Ninject?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BuildRevisionCounter.Tests/App.config | 8 ++++++++ BuildRevisionCounter/BuildRevisionCounter.csproj | 8 +++++--- BuildRevisionCounter/Web.config | 8 ++++++++ BuildRevisionCounter/packages.config | 3 ++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/BuildRevisionCounter.Tests/App.config b/BuildRevisionCounter.Tests/App.config index 2a98551..95f3c0b 100644 --- a/BuildRevisionCounter.Tests/App.config +++ b/BuildRevisionCounter.Tests/App.config @@ -3,4 +3,12 @@ + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter/BuildRevisionCounter.csproj b/BuildRevisionCounter/BuildRevisionCounter.csproj index 78c442b..87cb08b 100644 --- a/BuildRevisionCounter/BuildRevisionCounter.csproj +++ b/BuildRevisionCounter/BuildRevisionCounter.csproj @@ -40,9 +40,11 @@ - - False - ..\packages\Microsoft.Owin.2.0.2\lib\net45\Microsoft.Owin.dll + + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll + + + ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll False diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index 7aa4447..ca51db7 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -15,4 +15,12 @@ + + + + + + + + \ No newline at end of file diff --git a/BuildRevisionCounter/packages.config b/BuildRevisionCounter/packages.config index b2d6300..76bad7f 100644 --- a/BuildRevisionCounter/packages.config +++ b/BuildRevisionCounter/packages.config @@ -3,7 +3,8 @@ - + + From 9761830aaee3f6fce52c035bfd20f3b1e7275e45 Mon Sep 17 00:00:00 2001 From: AleXK Date: Sun, 17 May 2015 20:36:30 +0300 Subject: [PATCH 12/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B7=D0=BE=D0=BB=D0=B2=D1=8B=20?= =?UTF-8?q?=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=BD=D0=BE=D0=BC.=20=D0=A7=D1=82=D0=BE=20?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=BB=D0=B0=D1=81=D1=8C?= =?UTF-8?q?=20=D1=80=D0=B0=D0=BD=D1=8C=D1=88=D0=B5=20=D0=B2=D1=81=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE,=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B5?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BC=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Таким образом удалось обновить все пакеты nuget до последней версии, кроме одного - System.Web.Http. При его резолве через код падает конструктор StandardKernel В итоге все пакеты обновлены до последнего и остался один биндинг редирект --- BuildRevisionCounter.Tests/App.config | 4 ++ .../BuildRevisionCounter.Tests.csproj | 13 +++--- BuildRevisionCounter.Tests/packages.config | 6 +-- .../BuildRevisionCounter.csproj | 21 +++++---- BuildRevisionCounter/Startup.cs | 44 ++++++++++++++++--- BuildRevisionCounter/Web.config | 18 ++++---- BuildRevisionCounter/packages.config | 8 ++-- 7 files changed, 78 insertions(+), 36 deletions(-) diff --git a/BuildRevisionCounter.Tests/App.config b/BuildRevisionCounter.Tests/App.config index 95f3c0b..65a2e80 100644 --- a/BuildRevisionCounter.Tests/App.config +++ b/BuildRevisionCounter.Tests/App.config @@ -9,6 +9,10 @@ + + + + \ No newline at end of file diff --git a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj index b7179eb..6d60788 100644 --- a/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj +++ b/BuildRevisionCounter.Tests/BuildRevisionCounter.Tests.csproj @@ -47,8 +47,9 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + + False + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll False @@ -57,13 +58,13 @@ - + False - ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll diff --git a/BuildRevisionCounter.Tests/packages.config b/BuildRevisionCounter.Tests/packages.config index 5f2716a..ac95f92 100644 --- a/BuildRevisionCounter.Tests/packages.config +++ b/BuildRevisionCounter.Tests/packages.config @@ -1,10 +1,10 @@  - - + + - + \ No newline at end of file diff --git a/BuildRevisionCounter/BuildRevisionCounter.csproj b/BuildRevisionCounter/BuildRevisionCounter.csproj index 87cb08b..e7ee5a4 100644 --- a/BuildRevisionCounter/BuildRevisionCounter.csproj +++ b/BuildRevisionCounter/BuildRevisionCounter.csproj @@ -57,8 +57,9 @@ ..\packages\MongoDB.Driver.Core.2.0.0\lib\net45\MongoDB.Driver.Core.dll - - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + + False + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll False @@ -87,9 +88,9 @@ - + False - ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll @@ -100,13 +101,13 @@ - + False - ..\packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\System.Web.Http.dll + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - + False - ..\packages\Microsoft.AspNet.WebApi.Owin.5.0.1\lib\net45\System.Web.Http.Owin.dll + ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll @@ -118,7 +119,9 @@ - + + Designer + diff --git a/BuildRevisionCounter/Startup.cs b/BuildRevisionCounter/Startup.cs index fc77cfa..f5cef1b 100644 --- a/BuildRevisionCounter/Startup.cs +++ b/BuildRevisionCounter/Startup.cs @@ -1,24 +1,58 @@ -using System.Configuration; +using System; +using System.Configuration; +using System.Net.Http.Formatting; +using System.Reflection; +using System.Web.Http; using System.Web.Http.Filters; +using BuildRevisionCounter; +using BuildRevisionCounter.Interfaces; using BuildRevisionCounter.Security; using Microsoft.Owin; using MongoDB.Driver; using Ninject; +using Ninject.Modules; using Ninject.Web.Common.OwinHost; using Ninject.Web.WebApi.FilterBindingSyntax; using Ninject.Web.WebApi.OwinHost; using Owin; -using BuildRevisionCounter; -using System.Web.Http; -using System.Net.Http.Formatting; -using BuildRevisionCounter.Interfaces; [assembly: OwinStartup(typeof(Startup))] namespace BuildRevisionCounter { + public class MyAssemblyNameRetriever : AssemblyNameRetriever + { + + } + public class Startup { + static Startup() + { + AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; + } + + private static Assembly ResolveAssembly(object sender, ResolveEventArgs args) + { + var name = new AssemblyName(args.Name); + //if (name.Name == "System.Web.Http") + //{ + // name.Version = new Version(5, 2, 3, 0); + // return Assembly.Load(name); + //} + if (name.Name == "System.Web.Http.Owin") + { + name.Version = new Version(5, 2, 3, 0); + return Assembly.Load(name); + } + if (name.Name == "Microsoft.Owin") + { + name.Version = new Version(3, 0, 1, 0); + return Assembly.Load(name); + } + return null; + } + public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); diff --git a/BuildRevisionCounter/Web.config b/BuildRevisionCounter/Web.config index ca51db7..1e428b3 100644 --- a/BuildRevisionCounter/Web.config +++ b/BuildRevisionCounter/Web.config @@ -15,12 +15,12 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/BuildRevisionCounter/packages.config b/BuildRevisionCounter/packages.config index 76bad7f..460b340 100644 --- a/BuildRevisionCounter/packages.config +++ b/BuildRevisionCounter/packages.config @@ -1,14 +1,14 @@  - - - + + + - +