@@ -70,6 +70,39 @@ private static bool IsEnabled()
70
70
}
71
71
}
72
72
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
+
73
106
/// <summary>
74
107
/// Generate the Key for ADO
75
108
/// </summary>
@@ -427,6 +460,11 @@ private bool Store(string key, MemCachedD_Value value, TimeSpan validFor, string
427
460
return false ;
428
461
}
429
462
463
+ if ( IsCasLocked ( repository ) )
464
+ {
465
+ return false ;
466
+ }
467
+
430
468
Stopwatch sw = Stopwatch . StartNew ( ) ;
431
469
int ? cacheTraceCompressLength = null ;
432
470
DateTime traceStart = DateTime . Now ;
@@ -636,9 +674,6 @@ private void CasRepositoryStore(string key, string repository)
636
674
// Initiate Keys
637
675
List < string > keys = new List < string > ( ) ;
638
676
639
-
640
-
641
-
642
677
try
643
678
{
644
679
// Initiate loop
@@ -721,13 +756,15 @@ private void CasRepositoryStore(string key, string repository)
721
756
/// <param name="repository"></param>
722
757
public bool CasRepositoryFlush ( string repository )
723
758
{
759
+
724
760
Exception ex = null ;
725
761
// Check if it's enabled first
726
762
if ( ! IsEnabled ( ) )
727
763
{
728
764
return false ;
729
765
}
730
766
767
+
731
768
if ( string . IsNullOrEmpty ( repository ) )
732
769
{
733
770
return false ;
@@ -738,6 +775,23 @@ public bool CasRepositoryFlush(string repository)
738
775
repository = repository . ToUpper ( ) ;
739
776
}
740
777
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
+
741
795
Stopwatch sw = Stopwatch . StartNew ( ) ;
742
796
DateTime traceStart = DateTime . Now ;
743
797
bool successTraceFlag = true ;
@@ -835,6 +889,9 @@ public bool CasRepositoryFlush(string repository)
835
889
}
836
890
finally
837
891
{
892
+ //unlock the cas
893
+ Remove_BSO < dynamic > ( "API" , "MemCacheD" , "casManagement" , repository + "-Lock" ) ;
894
+
838
895
sw . Stop ( ) ;
839
896
var duration = Utility . StopWatchToSeconds ( sw ) ;
840
897
0 commit comments