use of com.linkedin.databus2.core.DatabusException in project databus by linkedin.
the class FileMaxSCNHandler method saveMaxScn.
@Override
public void saveMaxScn(long endOfPeriod) throws DatabusException {
_scn.set(endOfPeriod);
long ctr = _flushCounter.addAndGet(1);
// Retain the SCN Val every now and then
if (ctr % _staticConfig.getFlushItvl() == 0) {
if (LOG.isDebugEnabled()) {
LOG.debug("Flushing counter:" + ctr);
}
try {
writeScnToFile();
} catch (IOException e) {
LOG.error("Caught exception saving SCN = " + _scn, e);
throw new DatabusException("Caught exception saving SCN = " + _scn, e);
}
}
}
use of com.linkedin.databus2.core.DatabusException in project databus by linkedin.
the class TestGoldenGateEventProducer method testAddEventToBufferRateControl.
private void testAddEventToBufferRateControl(long throttleDurationInSecs) throws InvalidConfigException, UnsupportedKeyException, DatabusException, NoSuchFieldException, IllegalAccessException {
// 1 event per second required. Send 5 events. Must have 4 sleeps.
long rate = 1;
int numEvents = 5;
PhysicalSourceStaticConfig pssc = buildPssc(rate, throttleDurationInSecs);
long scn = 10;
DbusEventBufferAppendable mb = createBufMult(pssc);
GoldenGateEventProducer gg = new GoldenGateEventProducer(pssc, null, mb, null, null);
// enable if want to run with mocked timer
// run_with_mock_timer(gg);
int sourceId = 505;
HashSet<DBUpdateImage> db = new HashSet<DBUpdateImage>();
// name1 is the only key
ColumnsState.KeyPair kp1 = new ColumnsState.KeyPair(new String("name1"), Schema.Type.RECORD);
ArrayList<ColumnsState.KeyPair> keyPairs = new ArrayList<ColumnsState.KeyPair>(numEvents);
keyPairs.add(kp1);
Schema s = Schema.parse(avroSchema2);
GenericRecord gr1 = new GenericData.Record(s);
gr1.put("name1", "phani1");
gr1.put("name2", "boris1");
GenericRecord gr2 = new GenericData.Record(s);
gr2.put("name1", "phani2");
gr2.put("name2", "boris2");
GenericRecord gr3 = new GenericData.Record(s);
gr3.put("name1", "phani3");
gr3.put("name2", "boris3");
GenericRecord gr4 = new GenericData.Record(s);
gr4.put("name1", "phani4");
gr4.put("name2", "boris4");
GenericRecord gr5 = new GenericData.Record(s);
gr5.put("name1", "phani5");
gr5.put("name2", "boris5");
DBUpdateImage dbi1 = new DBUpdateImage(keyPairs, scn, gr1, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
DBUpdateImage dbi2 = new DBUpdateImage(keyPairs, scn, gr2, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
DBUpdateImage dbi3 = new DBUpdateImage(keyPairs, scn, gr3, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
DBUpdateImage dbi4 = new DBUpdateImage(keyPairs, scn, gr4, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
DBUpdateImage dbi5 = new DBUpdateImage(keyPairs, scn, gr5, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
db.add(dbi1);
db.add(dbi2);
db.add(dbi3);
db.add(dbi4);
db.add(dbi5);
// For a given transaction, and logical source : only 1 update ( the last one succeeds )
Assert.assertEquals(1, db.size());
// Generate 5 transactions with the same update
for (int i = 0; i < numEvents; i++) {
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates = new ArrayList<TransactionState.PerSourceTransactionalUpdate>(10);
TransactionState.PerSourceTransactionalUpdate dbUpdate = new TransactionState.PerSourceTransactionalUpdate(sourceId, db);
dbUpdates.add(dbUpdate);
long timestamp = 60;
gg.addEventToBuffer(dbUpdates, new TransactionInfo(0, 0, timestamp, scn));
scn++;
}
// It may not sleep the very first time as 1 second may have elapsed from when the rate control got started to when event in
// getting inserted. Subsequently, expect rate control to kick in
long numSleeps = Math.min(numEvents, throttleDurationInSecs);
Assert.assertEquals(gg.getRateControl().getNumSleeps(), numSleeps);
gg.getRateControl().resetNumSleeps();
return;
}
use of com.linkedin.databus2.core.DatabusException in project databus by linkedin.
the class TestGoldenGateEventProducer method testGGProducerStats.
@Test
public void testGGProducerStats() throws InvalidConfigException, UnsupportedKeyException, DatabusException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {
short[] sourceIds = new short[] { 505, 506 };
String[] sourceNames = new String[] { "source1", "source2" };
PhysicalSourceStaticConfig pssc = buildSimplePssc(sourceIds, sourceNames, "gg:///tmp:xxx");
long scn = 10;
DbusEventBufferAppendable mb = createBufMult(pssc);
// start producer
GoldenGateEventProducer gg = new GoldenGateEventProducer(pssc, null, mb, null, null);
Object handleXmlCallbackObject = getHandleXmlCallbackInnerInstance(gg);
Method method = getOnTransactionEndMethod();
// generates the updates
List<String> keys = new ArrayList<String>();
keys.add("keys1");
// SCN = 10
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates = generateUpdates(new short[] { sourceIds[0] }, keys, scn);
// SCN = 11
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates1 = generateUpdates(new short[] { sourceIds[1] }, keys, scn + 1);
// SCN = 12
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates2 = generateUpdates(new short[] { sourceIds[1] }, keys, scn + 2);
long timestamp = System.currentTimeMillis() * DbusConstants.NUM_NSECS_IN_MSEC;
// gg.addEventToBuffer(dbUpdates, new TransactionInfo(0, 0, timestamp, scn));
// gg.addEventToBuffer(dbUpdates1, new TransactionInfo(0, 0, timestamp+1, scn+1));
method.invoke(handleXmlCallbackObject, new Object[] { dbUpdates, new TransactionInfo(0, 0, timestamp, scn) });
method.invoke(handleXmlCallbackObject, new Object[] { dbUpdates1, new TransactionInfo(0, 0, timestamp + 1, scn + 1) });
// THis is an extra-call but the corresponding events will not be added to EVB.
// This is needed to flush the events in the above call to EVB
method.invoke(handleXmlCallbackObject, new Object[] { dbUpdates2, new TransactionInfo(0, 0, timestamp + 1, scn + 2) });
for (EventSourceStatisticsIface si : gg.getSources()) {
EventSourceStatistics ss = si.getStatisticsBean();
LOG.info(si.getSourceName() + ": scn=" + ss.getMaxScn() + ",averageSize=" + ss.getAvgEventSerializedSize() + ",numErrors=" + ss.getNumErrors() + ",totalEvents=" + ss.getNumTotalEvents() + ",averageFactTime=" + ss.getAvgEventFactoryTimeMillisPerEvent() + ",timeSinceDb=" + ss.getTimeSinceLastDBAccess());
if (si.getSourceId() == 505) {
Assert.assertEquals(6, ss.getAvgEventSerializedSize());
Assert.assertEquals(0, ss.getNumErrors());
Assert.assertEquals(1, ss.getNumTotalEvents());
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// we are not
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// really
// reading
Assert.assertEquals(10, ss.getMaxScn());
}
if (si.getSourceId() == 506) {
Assert.assertEquals(6, ss.getAvgEventSerializedSize());
Assert.assertEquals(0, ss.getNumErrors());
Assert.assertEquals(1, ss.getNumTotalEvents());
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// we are not
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// really
// reading
Assert.assertEquals(11, ss.getMaxScn());
}
if (si.getSourceId() == GoldenGateEventProducer.GLOBAL_SOURCE_ID) {
Assert.assertEquals(6, ss.getAvgEventSerializedSize());
Assert.assertEquals(0, ss.getNumErrors());
Assert.assertEquals(2, ss.getNumTotalEvents());
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// we are not
Assert.assertEquals(0, ss.getAvgEventFactoryTimeMillisPerEvent());
// really
// reading
Assert.assertEquals(11, ss.getMaxScn());
}
}
long approximateTimeSinceLastTransactionMs = System.currentTimeMillis() - timestamp / DbusConstants.NUM_NSECS_IN_MSEC;
long diff = gg.getParserStats().getTimeSinceLastTransactionMs() - approximateTimeSinceLastTransactionMs;
// somewhat
Assert.assertTrue("time diff is too big:" + diff, diff >= 0 && diff < 30);
// NS)
return;
}
use of com.linkedin.databus2.core.DatabusException in project databus by linkedin.
the class TestGoldenGateEventProducer method generateUpdates.
//aux method to generate updates
private List<TransactionState.PerSourceTransactionalUpdate> generateUpdates(short[] sourceIds, List<String> keys, long scn) throws DatabusException {
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates = new ArrayList<TransactionState.PerSourceTransactionalUpdate>(10);
HashSet<DBUpdateImage> db = new HashSet<DBUpdateImage>();
String keyName = "name";
Schema.Type keyType = Schema.Type.RECORD;
Schema s = Schema.parse(avroSchema);
for (short sourceId : sourceIds) {
for (String k : keys) {
ColumnsState.KeyPair kp = new ColumnsState.KeyPair(k, keyType);
ArrayList<ColumnsState.KeyPair> keyPairs = new ArrayList<ColumnsState.KeyPair>(1);
keyPairs.add(kp);
GenericRecord gr = new GenericData.Record(s);
gr.put(keyName, k);
DBUpdateImage dbi = new DBUpdateImage(keyPairs, scn, gr, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
db.add(dbi);
TransactionState.PerSourceTransactionalUpdate dbUpdate = new TransactionState.PerSourceTransactionalUpdate(sourceId, db);
dbUpdates.add(dbUpdate);
}
}
return dbUpdates;
}
use of com.linkedin.databus2.core.DatabusException in project databus by linkedin.
the class TestGoldenGateEventProducer method generateUpdatesForSchema2.
//aux method to generate updates
private List<TransactionState.PerSourceTransactionalUpdate> generateUpdatesForSchema2(short[] sourceIds, Map<String, String> keyVals, long scn) throws DatabusException {
List<TransactionState.PerSourceTransactionalUpdate> dbUpdates = new ArrayList<TransactionState.PerSourceTransactionalUpdate>(10);
HashSet<DBUpdateImage> db = new HashSet<DBUpdateImage>();
String keyName = "name1";
String valName = "name2";
Schema.Type keyType = Schema.Type.RECORD;
Schema s = Schema.parse(avroSchema2);
for (short sourceId : sourceIds) {
for (String k : keyVals.keySet()) {
ColumnsState.KeyPair kp = new ColumnsState.KeyPair(k, keyType);
ArrayList<ColumnsState.KeyPair> keyPairs = new ArrayList<ColumnsState.KeyPair>(1);
keyPairs.add(kp);
GenericRecord gr = new GenericData.Record(s);
gr.put(keyName, k);
gr.put(valName, keyVals.get(k));
DBUpdateImage dbi = new DBUpdateImage(keyPairs, scn, gr, s, DbUpdateState.DBUpdateImage.OpType.INSERT, false);
db.add(dbi);
TransactionState.PerSourceTransactionalUpdate dbUpdate = new TransactionState.PerSourceTransactionalUpdate(sourceId, db);
dbUpdates.add(dbUpdate);
}
}
return dbUpdates;
}
Aggregations