2323import java .util .Optional ;
2424import java .util .Set ;
2525
26+ import org .apache .zookeeper .CreateMode ;
2627import org .apache .zookeeper .DummyWatcher ;
2728import org .apache .zookeeper .PortAssignment ;
2829import org .apache .zookeeper .ZKTestCase ;
30+ import org .apache .zookeeper .ZooDefs ;
2931import org .apache .zookeeper .ZooKeeper ;
3032import org .apache .zookeeper .jmx .MBeanRegistry ;
3133import org .apache .zookeeper .jmx .ZKMBeanInfo ;
3234import org .apache .zookeeper .server .ServerCnxn ;
3335import org .apache .zookeeper .server .ServerCnxnFactory ;
3436import org .apache .zookeeper .server .SyncRequestProcessor ;
3537import org .apache .zookeeper .server .ZooKeeperServer ;
38+ import org .apache .zookeeper .server .backup .monitoring .BackupBean ;
3639import org .apache .zookeeper .server .backup .storage .BackupStorageProvider ;
3740import org .apache .zookeeper .server .backup .storage .impl .FileSystemBackupStorage ;
3841import org .apache .zookeeper .server .persistence .FileTxnSnapLog ;
@@ -58,7 +61,6 @@ public class BackupBeanTest extends ZKTestCase {
5861 private ZooKeeperServer zks ;
5962 private ServerCnxnFactory serverCnxnFactory ;
6063 private BackupStorageProvider backupStorage ;
61- private BackupManager backupManager ;
6264 private BackupStatus backupStatus ;
6365 private FileTxnSnapLog snapLog ;
6466 private BackupConfig backupConfig ;
@@ -128,7 +130,6 @@ public void teardown() throws Exception {
128130 Assert .assertTrue ("waiting for server to shutdown" ,
129131 ClientBase .waitForServerDown (HOSTPORT , CONNECTION_TIMEOUT ));
130132
131- backupManager = null ;
132133 backupStatus = null ;
133134 serverCnxnFactory = null ;
134135 zks = null ;
@@ -157,4 +158,117 @@ private boolean containsMBean(Set<ZKMBeanInfo> mbeanSet, String mbeanName, boole
157158 .findAny ();
158159 return foundMBean .isPresent ();
159160 }
161+
162+ @ Test
163+ public void testMBeanUpdate () throws Exception {
164+ MockBackupManager backupManager = new MockBackupManager (dataDir , dataDir , dataDir , backupTmpDir , 15 ,
165+ new FileSystemBackupStorage (backupConfig ), TEST_NAMESPACE , 0 );
166+ BackupBean backupBean = backupManager .getBackupBean ();
167+
168+ Assert .assertEquals (0 , backupBean .getMinutesSinceLastSuccessfulSnapshotIteration ());
169+ Assert .assertEquals (0 , backupBean .getMinutesSinceLastSuccessfulTxnLogIteration ());
170+
171+ String [] nodeNames = {"/firstNode" , "/secondNode" , "/thirdNode" , "/fourthNode" , "/fifthNode" };
172+
173+ createNode (connection , nodeNames [0 ]);
174+ backupManager .getSnapBackup (snapLog , true ).run (1 );
175+ backupManager .getLogBackup (snapLog , true ).run (1 );
176+ Assert .assertTrue (backupBean .getLastSnapshotIterationDuration () > 0L );
177+ Assert .assertTrue (backupBean .getLastTxnLogIterationDuration () > 0L );
178+ Assert .assertEquals (1 , backupBean .getNumberOfSnapshotFilesBackedUpLastIteration ());
179+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedSnapshotIterations ());
180+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedTxnLogIterations ());
181+ Assert .assertFalse (backupBean .getSnapshotBackupActiveStatus ());
182+ Assert .assertFalse (backupBean .getTxnLogBackupActiveStatus ());
183+
184+ createNode (connection , nodeNames [1 ]);
185+ backupManager .getSnapBackup (snapLog , false ).run (1 );
186+ backupManager .getLogBackup (snapLog , true ).run (1 );
187+ Assert .assertEquals (1 , backupBean .getNumConsecutiveFailedSnapshotIterations ());
188+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedTxnLogIterations ());
189+
190+ createNode (connection , nodeNames [2 ]);
191+ backupManager .getSnapBackup (snapLog , true ).run (1 );
192+ backupManager .getLogBackup (snapLog , false ).run (1 );
193+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedSnapshotIterations ());
194+ Assert .assertEquals (1 , backupBean .getNumConsecutiveFailedTxnLogIterations ());
195+
196+ createNode (connection , nodeNames [3 ]);
197+ backupManager .getSnapBackup (snapLog , false ).run (1 );
198+ backupManager .getLogBackup (snapLog , false ).run (1 );
199+ Assert .assertEquals (1 , backupBean .getNumConsecutiveFailedSnapshotIterations ());
200+ Assert .assertEquals (2 , backupBean .getNumConsecutiveFailedTxnLogIterations ());
201+
202+ createNode (connection , nodeNames [4 ]);
203+ backupManager .getSnapBackup (snapLog , true ).run (1 );
204+ backupManager .getLogBackup (snapLog , true ).run (1 );
205+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedSnapshotIterations ());
206+ Assert .assertEquals (0 , backupBean .getNumConsecutiveFailedTxnLogIterations ());
207+
208+ Thread .sleep (60 * 1000 );
209+ Assert .assertTrue (backupBean .getMinutesSinceLastSuccessfulSnapshotIteration () > 0L );
210+ Assert .assertTrue (backupBean .getMinutesSinceLastSuccessfulTxnLogIteration () > 0L );
211+ }
212+
213+ private void createNode (ZooKeeper zk , String path ) throws Exception {
214+ zk .create (path , new byte [0 ], ZooDefs .Ids .OPEN_ACL_UNSAFE , CreateMode .PERSISTENT );
215+ }
216+
217+ private static class MockBackupManager extends BackupManager {
218+
219+ public MockBackupManager (File snapDir , File dataLogDir , File backupStatusDir , File tmpDir ,
220+ int backupIntervalInMinutes , BackupStorageProvider backupStorageProvider , String namespace ,
221+ long serverId ) throws IOException {
222+ super (snapDir , dataLogDir , backupStatusDir , tmpDir , backupIntervalInMinutes ,
223+ backupStorageProvider , namespace , serverId );
224+ }
225+
226+ public BackupBean getBackupBean () {
227+ return this .backupBean ;
228+ }
229+
230+ public MockSnapshotBackupProcess getSnapBackup (FileTxnSnapLog snapLog , boolean errorFree ) {
231+ return new MockSnapshotBackupProcess (snapLog , errorFree , backupBean );
232+ }
233+
234+ public MockTxnLogBackupProcess getLogBackup (FileTxnSnapLog snapLog , boolean errorFree ) {
235+ return new MockTxnLogBackupProcess (snapLog , errorFree , backupBean );
236+ }
237+
238+ private class MockSnapshotBackupProcess extends BackupManager .SnapBackup {
239+ private boolean expectedErrorFree ;
240+ private BackupBean backupBean ;
241+
242+ public MockSnapshotBackupProcess (FileTxnSnapLog snapLog , boolean expectedErrorFree ,
243+ BackupBean backupBean ) {
244+ super (snapLog );
245+ this .expectedErrorFree = expectedErrorFree ;
246+ this .backupBean = backupBean ;
247+ }
248+
249+ @ Override
250+ protected void endIteration (boolean errorFree ) {
251+ Assert .assertTrue (backupBean .getSnapshotBackupActiveStatus ());
252+ super .endIteration (expectedErrorFree );
253+ }
254+ }
255+
256+ private class MockTxnLogBackupProcess extends BackupManager .TxnLogBackup {
257+ private boolean expectedErrorFree ;
258+ private BackupBean backupBean ;
259+
260+ public MockTxnLogBackupProcess (FileTxnSnapLog snapLog , boolean expectedErrorFree ,
261+ BackupBean backupBean ) {
262+ super (snapLog );
263+ this .expectedErrorFree = expectedErrorFree ;
264+ this .backupBean = backupBean ;
265+ }
266+
267+ @ Override
268+ protected void endIteration (boolean errorFree ) {
269+ Assert .assertTrue (backupBean .getTxnLogBackupActiveStatus ());
270+ super .endIteration (expectedErrorFree );
271+ }
272+ }
273+ }
160274}
0 commit comments