@@ -48,22 +48,34 @@ class LockGuardedCacheLoader
48
48
private $ loadTimeout ;
49
49
50
50
/**
51
- * LockGuardedCacheLoader constructor.
51
+ * Minimal delay timeout in ms.
52
+ * Delay will be applied as rand($minimalDelayTimeout, $delayTimeout)
53
+ * in order to desynchronize multiple clients trying
54
+ * to acquire the lock for the same resource at the same time
55
+ *
56
+ * @var int
57
+ */
58
+ private $ minimalDelayTimeout ;
59
+
60
+ /**
52
61
* @param LockManagerInterface $locker
53
62
* @param int $lockTimeout
54
63
* @param int $delayTimeout
55
64
* @param int $loadTimeout
65
+ * @param int $minimalDelayTimeout
56
66
*/
57
67
public function __construct (
58
68
LockManagerInterface $ locker ,
59
69
int $ lockTimeout = 10000 ,
60
70
int $ delayTimeout = 20 ,
61
- int $ loadTimeout = 10000
71
+ int $ loadTimeout = 10000 ,
72
+ int $ minimalDelayTimeout = 5
62
73
) {
63
74
$ this ->locker = $ locker ;
64
75
$ this ->lockTimeout = $ lockTimeout ;
65
76
$ this ->delayTimeout = $ delayTimeout ;
66
77
$ this ->loadTimeout = $ loadTimeout ;
78
+ $ this ->minimalDelayTimeout = $ minimalDelayTimeout ;
67
79
}
68
80
69
81
/**
@@ -100,7 +112,8 @@ public function lockedLoadData(
100
112
}
101
113
102
114
if ($ cachedData === false ) {
103
- usleep ($ this ->delayTimeout * 1000 );
115
+ $ lookupTimeout = rand ($ this ->minimalDelayTimeout , $ this ->delayTimeout );
116
+ usleep ($ lookupTimeout * 1000 );
104
117
$ cachedData = $ dataLoader ();
105
118
}
106
119
}
0 commit comments