PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.2
Jetpack – WP Security, Backup, Speed, & Growth v16.2
16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 All 506 releases
jetpack / jetpack_vendor / automattic / jetpack-sync / src / class-health.php

class-health.php in Jetpack – WP Security, Backup, Speed, & Growth 16.2, at jetpack_vendor/automattic/jetpack-sync/src/class-health.php

207 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Health class.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8 namespace Automattic\Jetpack\Sync;
9
10 /**
11 * Health class.
12 */
13 class Health {
14
15 /**
16 * Prefix of the blog lock transient.
17 *
18 * @access public
19 *
20 * @var string
21 */
22 const STATUS_OPTION = 'sync_health_status';
23
24 /**
25 * Status key in option array.
26 *
27 * @access public
28 *
29 * @var string
30 */
31 const OPTION_STATUS_KEY = 'status';
32
33 /**
34 * Timestamp key in option array.
35 *
36 * @access public
37 *
38 * @var string
39 */
40 const OPTION_TIMESTAMP_KEY = 'timestamp';
41
42 /**
43 * Unknown status code.
44 *
45 * @access public
46 *
47 * @var string
48 */
49 const STATUS_UNKNOWN = 'unknown';
50
51 /**
52 * Disabled status code.
53 *
54 * @access public
55 *
56 * @var string
57 */
58 const STATUS_DISABLED = 'disabled';
59
60 /**
61 * Out of sync status code.
62 *
63 * @access public
64 *
65 * @var string
66 */
67 const STATUS_OUT_OF_SYNC = 'out_of_sync';
68
69 /**
70 * In sync status code.
71 *
72 * @access public
73 *
74 * @var string
75 */
76 const STATUS_IN_SYNC = 'in_sync';
77
78 /**
79 * If sync is active, Health-related hooks will be initialized after plugins are loaded.
80 */
81 public static function init() {
82 add_action( 'jetpack_full_sync_end', array( __CLASS__, 'full_sync_end_update_status' ), 10, 2 );
83 }
84
85 /**
86 * Gets health status code.
87 *
88 * @return string Sync Health Status
89 */
90 public static function get_status() {
91 $status = \Jetpack_Options::get_option( self::STATUS_OPTION );
92
93 if ( false === $status || ! is_array( $status ) || empty( $status[ self::OPTION_STATUS_KEY ] ) ) {
94 return self::STATUS_UNKNOWN;
95 }
96
97 switch ( $status[ self::OPTION_STATUS_KEY ] ) {
98 case self::STATUS_DISABLED:
99 case self::STATUS_OUT_OF_SYNC:
100 case self::STATUS_IN_SYNC:
101 return $status[ self::OPTION_STATUS_KEY ];
102 default:
103 return self::STATUS_UNKNOWN;
104 }
105 }
106
107 /**
108 * When the Jetpack plugin is upgraded, set status to disabled if sync is not enabled,
109 * or to unknown, if the status has never been set before.
110 */
111 public static function on_jetpack_upgraded() {
112 if ( ! Settings::is_sync_enabled() ) {
113 self::update_status( self::STATUS_DISABLED );
114 return;
115 }
116 if ( false === self::is_status_defined() ) {
117 self::update_status( self::STATUS_UNKNOWN );
118 }
119 }
120
121 /**
122 * When the Jetpack plugin is activated, set status to disabled if sync is not enabled,
123 * or to unknown.
124 */
125 public static function on_jetpack_activated() {
126 if ( ! Settings::is_sync_enabled() ) {
127 self::update_status( self::STATUS_DISABLED );
128 return;
129 }
130 self::update_status( self::STATUS_UNKNOWN );
131 }
132
133 /**
134 * Updates sync health status with either a valid status, or an unknown status.
135 *
136 * @param string $status Sync Status.
137 *
138 * @return bool True if an update occoured, or false if the status didn't change.
139 */
140 public static function update_status( $status ) {
141 if ( self::get_status() === $status ) {
142 return false;
143 }
144 // Default Status Option.
145 $new_status = array(
146 self::OPTION_STATUS_KEY => self::STATUS_UNKNOWN,
147 self::OPTION_TIMESTAMP_KEY => microtime( true ),
148 );
149
150 switch ( $status ) {
151 case self::STATUS_DISABLED:
152 case self::STATUS_OUT_OF_SYNC:
153 case self::STATUS_IN_SYNC:
154 $new_status[ self::OPTION_STATUS_KEY ] = $status;
155 break;
156 }
157
158 \Jetpack_Options::update_option( self::STATUS_OPTION, $new_status );
159 return true;
160 }
161
162 /**
163 * Check if Status has been previously set.
164 *
165 * @return bool is a Status defined
166 */
167 public static function is_status_defined() {
168 $status = \Jetpack_Options::get_option( self::STATUS_OPTION );
169
170 if ( false === $status || ! is_array( $status ) || empty( $status[ self::OPTION_STATUS_KEY ] ) ) {
171 return false;
172 } else {
173 return true;
174 }
175 }
176
177 /**
178 * Check if the sync queue is healthy based on size and lag.
179 *
180 * The queue is considered healthy if either size OR lag is within its limit.
181 * This matches the logic in Listener::can_add_to_queue(): data loss only occurs
182 * when both limits are exceeded simultaneously.
183 *
184 * @param int $queue_size Current queue size.
185 * @param float $queue_lag Current queue lag in seconds.
186 * @param int $max_queue_size Maximum allowed queue size.
187 * @param float $max_queue_lag Maximum allowed queue lag in seconds.
188 * @return bool Whether the queue is healthy.
189 */
190 public static function is_queue_healthy( $queue_size, $queue_lag, $max_queue_size, $max_queue_lag ) {
191 return ( $queue_size < $max_queue_size )
192 || ( $queue_lag < $max_queue_lag );
193 }
194
195 /**
196 * Update Sync Status if Full Sync ended of Posts
197 *
198 * @param string $checksum The checksum that's currently being processed.
199 * @param array $range The ranges of object types being processed.
200 */
201 public static function full_sync_end_update_status( $checksum, $range ) {
202 if ( isset( $range['posts'] ) ) {
203 self::update_status( self::STATUS_IN_SYNC );
204 }
205 }
206 }
207