Skip to content

Commit d3486a8

Browse files
committed
memcache CAS locking for casrepositoryflush implemented
1 parent cd9bf14 commit d3486a8

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

rls/packages/API.Library.6.1.25.nupkg

77.2 KB
Binary file not shown.

src/API.Library/API.Library.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
<PackageId>API.Library</PackageId>
1313
<Product>API Library</Product>
1414
<Copyright>Central Statistics Office, Ireland</Copyright>
15-
<Version>6.1.24</Version>
15+
<Version>6.1.25</Version>
1616
<Authors>Central Statistics Office, Ireland</Authors>
1717
<SignAssembly>False</SignAssembly>
1818
<RepositoryUrl>https://github.com/CSOIreland/Server-API-Library</RepositoryUrl>
1919
<PackageReleaseNotes>
20-
[BUG FIX] Dispose of database connection if it cant't be opened
20+
[ENHANCEMENT] memcache CAS locking for casrepositoryflush implemented
2121
</PackageReleaseNotes>
2222
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
2323
<RestoreLockedMode>true</RestoreLockedMode>
@@ -34,6 +34,8 @@
3434
<None Remove="Entities\ADO.cs~RF5780ef96.TMP" />
3535
<None Remove="Entities\API.Common.cs~RF1e6b9c0d.TMP" />
3636
<None Remove="Entities\MemCacheD.cs~RFcba3198.TMP" />
37+
<None Remove="Entities\MemCacheD.cs~RFf6fcfeae.TMP" />
38+
<None Remove="Entities\MemCacheD.cs~RFf747b93c.TMP" />
3739
<None Remove="log4net.config" />
3840
</ItemGroup>
3941

src/API.Library/Entities/MemCacheD.cs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,39 @@ private static bool IsEnabled()
7070
}
7171
}
7272

73+
74+
/// <summary>
75+
/// Check if MemCacheD cas is locked
76+
/// </summary>
77+
/// <returns></returns>
78+
private bool IsCasLocked(string repository)
79+
{
80+
if (string.IsNullOrEmpty(repository))
81+
{
82+
return false;
83+
}
84+
else
85+
{
86+
// Force to Case Insensitive
87+
repository = repository.ToUpper();
88+
}
89+
90+
91+
Log.Instance.Info("IsCasLocked repository is " + repository);
92+
93+
MemCachedD_Value casLock = Get_BSO<dynamic>("API", "MemCacheD", "casManagement", repository + "-Lock");
94+
95+
96+
if (casLock.hasData)
97+
{
98+
return casLock.data.Value;
99+
}
100+
else
101+
{
102+
return false;
103+
}
104+
}
105+
73106
/// <summary>
74107
/// Generate the Key for ADO
75108
/// </summary>
@@ -427,6 +460,11 @@ private bool Store(string key, MemCachedD_Value value, TimeSpan validFor, string
427460
return false;
428461
}
429462

463+
if (IsCasLocked(repository))
464+
{
465+
return false;
466+
}
467+
430468
Stopwatch sw = Stopwatch.StartNew();
431469
int? cacheTraceCompressLength = null;
432470
DateTime traceStart = DateTime.Now;
@@ -636,9 +674,6 @@ private void CasRepositoryStore(string key, string repository)
636674
// Initiate Keys
637675
List<string> keys = new List<string>();
638676

639-
640-
641-
642677
try
643678
{
644679
// Initiate loop
@@ -721,13 +756,15 @@ private void CasRepositoryStore(string key, string repository)
721756
/// <param name="repository"></param>
722757
public bool CasRepositoryFlush(string repository)
723758
{
759+
724760
Exception ex = null;
725761
// Check if it's enabled first
726762
if (!IsEnabled())
727763
{
728764
return false;
729765
}
730766

767+
731768
if (string.IsNullOrEmpty(repository))
732769
{
733770
return false;
@@ -738,6 +775,23 @@ public bool CasRepositoryFlush(string repository)
738775
repository = repository.ToUpper();
739776
}
740777

778+
/*** cas lock management **/
779+
if (IsCasLocked(repository))
780+
{
781+
return false;
782+
}
783+
784+
ApiServicesHelper.CacheD.Store_BSO<dynamic>("API", "MemCacheD", "casManagement", repository + "-Lock", true, DateTime.Today.AddMinutes(2), "METACAS");
785+
786+
MemCachedD_Value casLock = Get_BSO<dynamic>("API", "MemCacheD", "casManagement", repository + "-Lock");
787+
788+
//lock failed to set
789+
if (!casLock.hasData)
790+
{
791+
return false;
792+
}
793+
/*** end cas lock management **/
794+
741795
Stopwatch sw = Stopwatch.StartNew();
742796
DateTime traceStart = DateTime.Now;
743797
bool successTraceFlag = true;
@@ -835,6 +889,9 @@ public bool CasRepositoryFlush(string repository)
835889
}
836890
finally
837891
{
892+
//unlock the cas
893+
Remove_BSO<dynamic>("API", "MemCacheD", "casManagement", repository + "-Lock");
894+
838895
sw.Stop();
839896
var duration = Utility.StopWatchToSeconds(sw);
840897

0 commit comments

Comments
 (0)