| | |
| | | */ |
| | | private ChangeNumberIndexDB cnIndexDB; |
| | | |
| | | /** |
| | | * The last value generated of the change number. |
| | | * <p> |
| | | * Guarded by cnIndexDBLock |
| | | **/ |
| | | private long lastGeneratedChangeNumber = 0; |
| | | |
| | | /** Used for protecting {@link ChangeNumberIndexDB} related state. */ |
| | | private final Object cnIndexDBLock = new Object(); |
| | | |
| | |
| | | |
| | | shutdownCNIndexDB(); |
| | | |
| | | lastGeneratedChangeNumber = 0; |
| | | cnIndexDB = null; |
| | | } |
| | | } |
| | |
| | | if (cnIndexDB == null) |
| | | { |
| | | cnIndexDB = this.changelogDB.newChangeNumberIndexDB(); |
| | | final CNIndexRecord lastCNRecord = cnIndexDB.getLastRecord(); |
| | | // initialization of the lastGeneratedChangeNumber from the DB content |
| | | // if DB is empty => last record does not exist => default to 0 |
| | | lastGeneratedChangeNumber = |
| | | (lastCNRecord != null) ? lastCNRecord.getChangeNumber() : 0; |
| | | } |
| | | return cnIndexDB; |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * Generate a new change number. |
| | | * |
| | | * @return The generated change number |
| | | */ |
| | | public long getNewChangeNumber() |
| | | { |
| | | synchronized (cnIndexDBLock) |
| | | { |
| | | return ++lastGeneratedChangeNumber; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Get first and last change number. |
| | | * |
| | | * @param crossDomainEligibleCSN |
| | |
| | | { |
| | | // The database was empty, just keep increasing numbers since last time |
| | | // we generated one change number. |
| | | firstChangeNumber += lastGeneratedChangeNumber; |
| | | lastChangeNumber += lastGeneratedChangeNumber; |
| | | long lastGeneratedCN = this.cnIndexDB.getLastGeneratedChangeNumber(); |
| | | firstChangeNumber += lastGeneratedCN; |
| | | lastChangeNumber += lastGeneratedCN; |
| | | } |
| | | return new long[] { firstChangeNumber, lastChangeNumber }; |
| | | } |