1 21 22 package org.continuent.sequoia.controller.recoverylog; 23 24 import java.sql.SQLException ; 25 import java.util.Arrays ; 26 import java.util.HashMap ; 27 import java.util.Map ; 28 29 import javax.management.NotCompliantMBeanException ; 30 import javax.management.openmbean.CompositeData ; 31 import javax.management.openmbean.CompositeDataSupport ; 32 import javax.management.openmbean.CompositeType ; 33 import javax.management.openmbean.OpenDataException ; 34 import javax.management.openmbean.OpenType ; 35 import javax.management.openmbean.SimpleType ; 36 import javax.management.openmbean.TabularData ; 37 import javax.management.openmbean.TabularDataSupport ; 38 import javax.management.openmbean.TabularType ; 39 40 import org.continuent.sequoia.common.i18n.Translate; 41 import org.continuent.sequoia.common.jmx.mbeans.RecoveryLogControlMBean; 42 import org.continuent.sequoia.common.log.Trace; 43 import org.continuent.sequoia.controller.jmx.AbstractStandardMBean; 44 45 51 public class RecoveryLogControl extends AbstractStandardMBean 52 implements 53 RecoveryLogControlMBean 54 { 55 56 private RecoveryLog managedRecoveryLog; 57 private final Trace logger = Trace 58 .getLogger("org.continuent.sequoia.controller.recoverylog"); 60 private static final OpenType [] LOG_ENTRY_ITEM_TYPES = new OpenType []{ 61 SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, 62 SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, 63 SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, 64 SimpleType.STRING, SimpleType.STRING }; 65 private static final int ENTRIES_PER_DUMP = 100; 66 67 private TabularType logEntriesType; 68 private CompositeType logEntryType; 69 70 76 public RecoveryLogControl(RecoveryLog recoveryLog) 77 throws NotCompliantMBeanException 78 { 79 super(RecoveryLogControlMBean.class); 80 this.managedRecoveryLog = recoveryLog; 81 defineTypes(); 82 } 83 84 89 private void defineTypes() 90 { 91 try 92 { 93 logEntryType = new CompositeType ( 94 "LogEntry", Translate.get("RecoveryLogControl.LogEntryDescription"), getHeaders(), getHeaders(), LOG_ENTRY_ITEM_TYPES); 97 logEntriesType = new TabularType ( 98 "LogEntries", Translate.get("RecoveryLogControl.LogEntriesDescription"), logEntryType, getHeaders()); } 101 catch (OpenDataException e) 102 { 103 if (logger.isWarnEnabled()) 104 { 105 logger.warn(Translate.get("RecoveryLogControl.openTypeWarning"), e); } 107 } 108 } 109 110 113 public String getAssociatedString() 114 { 115 return "recoverylog"; } 117 118 121 public String [] getHeaders() 122 { 123 return managedRecoveryLog.getColumnNames(); 124 } 125 126 129 public TabularData dump(long from) 130 { 131 if (logger.isDebugEnabled()) 132 { 133 logger.debug("dumping recovery log from index " + from + " (" 134 + ENTRIES_PER_DUMP + " entries per page)"); 135 } 136 String [][] entries = managedRecoveryLog.getLogEntries(from, 137 ENTRIES_PER_DUMP); 138 TabularData result = toTabularData(entries); 139 return result; 140 } 141 142 145 public int getEntriesPerDump() 146 { 147 return ENTRIES_PER_DUMP; 148 } 149 150 153 public long[] getIndexes() 154 { 155 try 156 { 157 return managedRecoveryLog.getIndexes(); 158 } 159 catch (SQLException e) 160 { 161 if (logger.isWarnEnabled()) 162 { 163 logger.warn( 165 "unable to get the min and max indexes of the recovery log", e); 166 } 167 return null; 168 } 169 } 170 171 174 public long getEntries() 175 { 176 try 177 { 178 return managedRecoveryLog.getNumberOfLogEntries(); 179 } 180 catch (SQLException e) 181 { 182 if (logger.isWarnEnabled()) 183 { 184 logger.warn( 186 "unable to get the number of log entries in the recovery log", e); 187 } 188 return -1; 189 } 190 } 191 192 198 private TabularData toTabularData(String [][] entries) 199 { 200 TabularData entriesData = new TabularDataSupport (logEntriesType); 201 for (int i = 0; i < entries.length; i++) 202 { 203 String [] entry = entries[i]; 204 CompositeData entryData = toCompositeData(entry); 205 if (entryData != null) 206 { 207 entriesData.put(entryData); 208 } 209 } 210 return entriesData; 211 } 212 213 222 private CompositeData toCompositeData(String [] entry) 223 { 224 try 225 { 226 CompositeData entryData = new CompositeDataSupport (logEntryType, 227 getHeaders(), entry); 228 return entryData; 229 } 230 catch (OpenDataException e) 231 { 232 if (logger.isWarnEnabled()) 233 { 234 logger.warn(Translate.get( 235 "RecoveryLogControl.conversionWarning", Arrays.asList(entry)), e); } 237 return null; 238 } 239 } 240 241 244 public Map getCheckpoints() 245 { 246 try 247 { 248 return managedRecoveryLog.getCheckpoints(); 249 } 250 catch (SQLException e) 251 { 252 if (logger.isWarnEnabled()) 253 { 254 logger.warn(e.getMessage(), e); 255 } 256 return new HashMap (); 257 } 258 } 259 } 260 | Popular Tags |