| | |
| | | import org.opends.server.replication.server.changelog.je.DraftCNDB.*; |
| | | import org.opends.server.types.Attribute; |
| | | import org.opends.server.types.Attributes; |
| | | import org.opends.server.types.DebugLogLevel; |
| | | import org.opends.server.types.InitializationException; |
| | | |
| | | import static org.opends.messages.ReplicationMessages.*; |
| | |
| | | * FIXME Is this field that useful? {@link #getFirstChangeNumber()} does not |
| | | * even use it! |
| | | */ |
| | | private int firstChangeNumber = NO_KEY; |
| | | private long firstChangeNumber = NO_KEY; |
| | | /** |
| | | * FIXME Is this field that useful? {@link #getLastChangeNumber()} does not |
| | | * even use it! |
| | | */ |
| | | private int lastChangeNumber = NO_KEY; |
| | | private long lastChangeNumber = NO_KEY; |
| | | private DbMonitorProvider dbMonitor = new DbMonitorProvider(); |
| | | private boolean shutdown = false; |
| | | private boolean trimDone = false; |
| | |
| | | |
| | | // DB initialization |
| | | db = new DraftCNDB(dbenv); |
| | | firstChangeNumber = db.readFirstChangeNumber(); |
| | | lastChangeNumber = db.readLastChangeNumber(); |
| | | firstChangeNumber = getChangeNumber(db.readFirstCNIndexData()); |
| | | lastChangeNumber = getChangeNumber(db.readLastCNIndexData()); |
| | | |
| | | // Trimming thread |
| | | thread = new DirectoryThread(this, "Replication DraftCN db"); |
| | |
| | | DirectoryServer.registerMonitorProvider(dbMonitor); |
| | | } |
| | | |
| | | private long getChangeNumber(CNIndexData cnIndexData) |
| | | throws ChangelogException |
| | | { |
| | | if (cnIndexData != null) |
| | | { |
| | | return cnIndexData.getChangeNumber(); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public synchronized void add(long changeNumber, String previousCookie, |
| | | String baseDN, CSN csn) |
| | | public void add(CNIndexData cnIndexData) throws ChangelogException |
| | | { |
| | | db.addEntry(changeNumber, previousCookie, baseDN, csn); |
| | | db.addEntry(cnIndexData); |
| | | |
| | | if (debugEnabled()) |
| | | TRACER.debugInfo( |
| | | "In DraftCNDbhandler.add, added: " |
| | | + " key=" + changeNumber |
| | | + " previousCookie=" + previousCookie |
| | | + " baseDN=" + baseDN |
| | | + " csn=" + csn); |
| | | TRACER.debugInfo("In DraftCNDbhandler.add, added: " + cnIndexData); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public long getFirstChangeNumber() |
| | | public CNIndexData getFirstCNIndexData() throws ChangelogException |
| | | { |
| | | return db.readFirstChangeNumber(); |
| | | return db.readFirstCNIndexData(); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public long getLastChangeNumber() |
| | | public CNIndexData getLastCNIndexData() throws ChangelogException |
| | | { |
| | | return db.readLastChangeNumber(); |
| | | return db.readLastCNIndexData(); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public long getLastChangeNumber() throws ChangelogException |
| | | { |
| | | final CNIndexData data = getLastCNIndexData(); |
| | | if (data != null) |
| | | { |
| | | return data.getChangeNumber(); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | // From the draftCNDb change record, get the domain and CSN |
| | | final CSN csn = cursor.currentCSN(); |
| | | final String baseDN = cursor.currentBaseDN(); |
| | | final CNIndexData data = cursor.currentData(); |
| | | final String baseDN = data.getBaseDN(); |
| | | if (baseDNToClear != null && baseDNToClear.equalsIgnoreCase(baseDN)) |
| | | { |
| | | cursor.delete(); |
| | |
| | | continue; |
| | | } |
| | | |
| | | final CSN csn = data.getCSN(); |
| | | final ServerState startState = domain.getStartState(); |
| | | final CSN fcsn = startState.getCSN(csn.getServerId()); |
| | | |
| | | final int currentChangeNumber = cursor.currentKey(); |
| | | final long currentChangeNumber = data.getChangeNumber(); |
| | | |
| | | if (csn.older(fcsn)) |
| | | { |
| | |
| | | { |
| | | Map<String, ServerState> csnStartStates = |
| | | MultiDomainServerState.splitGenStateToServerStates( |
| | | cursor.currentValue()); |
| | | data.getPreviousCookie()); |
| | | csnVector = csnStartStates.get(baseDN); |
| | | |
| | | if (debugEnabled()) |
| | |
| | | public List<Attribute> getMonitorData() |
| | | { |
| | | List<Attribute> attributes = new ArrayList<Attribute>(); |
| | | attributes.add(Attributes.create("first-draft-changenumber", |
| | | Integer.toString(db.readFirstChangeNumber()))); |
| | | attributes.add(Attributes.create("last-draft-changenumber", |
| | | Integer.toString(db.readLastChangeNumber()))); |
| | | attributes.add(Attributes.create("count", |
| | | Long.toString(count()))); |
| | | |
| | | try |
| | | { |
| | | CNIndexData firstCNData = db.readFirstCNIndexData(); |
| | | String firstCN = String.valueOf(firstCNData.getChangeNumber()); |
| | | attributes.add(Attributes.create("first-draft-changenumber", firstCN)); |
| | | } |
| | | catch (ChangelogException e) |
| | | { |
| | | if (debugEnabled()) |
| | | TRACER.debugCaught(DebugLogLevel.WARNING, e); |
| | | attributes.add(Attributes.create("first-draft-changenumber", "0")); |
| | | } |
| | | |
| | | try |
| | | { |
| | | CNIndexData lastCNData = db.readLastCNIndexData(); |
| | | if (lastCNData != null) |
| | | { |
| | | String lastCN = String.valueOf(lastCNData.getChangeNumber()); |
| | | attributes.add(Attributes.create("last-draft-changenumber", lastCN)); |
| | | } |
| | | } |
| | | catch (ChangelogException e) |
| | | { |
| | | if (debugEnabled()) |
| | | TRACER.debugCaught(DebugLogLevel.WARNING, e); |
| | | attributes.add(Attributes.create("last-draft-changenumber", "0")); |
| | | } |
| | | |
| | | attributes.add(Attributes.create("count", Long.toString(count()))); |
| | | return attributes; |
| | | } |
| | | |
| | |
| | | public void clear() throws ChangelogException |
| | | { |
| | | db.clear(); |
| | | firstChangeNumber = db.readFirstChangeNumber(); |
| | | lastChangeNumber = db.readLastChangeNumber(); |
| | | firstChangeNumber = getChangeNumber(db.readFirstCNIndexData()); |
| | | lastChangeNumber = getChangeNumber(db.readLastCNIndexData()); |
| | | } |
| | | |
| | | private ReentrantLock lock = new ReentrantLock(); |
| | |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public String getPreviousCookie(long changeNumber) throws ChangelogException |
| | | public CNIndexData getCNIndexData(long changeNumber) |
| | | throws ChangelogException |
| | | { |
| | | DraftCNDBCursor cursor = null; |
| | | try |
| | | { |
| | | cursor = db.openReadCursor(changeNumber); |
| | | return cursor.currentValue(); |
| | | return cursor.currentData(); |
| | | } |
| | | finally |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public CSN getCSN(long changeNumber) throws ChangelogException |
| | | { |
| | | DraftCNDBCursor cursor = null; |
| | | try |
| | | { |
| | | cursor = db.openReadCursor(changeNumber); |
| | | return cursor.currentCSN(); |
| | | } |
| | | finally |
| | | { |
| | | close(cursor); |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public String getBaseDN(long changeNumber) throws ChangelogException |
| | | { |
| | | DraftCNDBCursor cursor = null; |
| | | try |
| | | { |
| | | cursor = db.openReadCursor(changeNumber); |
| | | return cursor.currentBaseDN(); |
| | | } |
| | | finally |
| | | { |
| | | close(cursor); |
| | | } |
| | | } |
| | | } |