Dissem / Jabit

Bitmessage Library for Java
Apache License 2.0
26 stars 10 forks source link

Unique index or primary key violation #18

Closed manmountain closed 8 years ago

manmountain commented 9 years ago

JdbcSQLException when running the Jabit demo client.

Exception in thread "pool-1-thread-7" java.lang.RuntimeException: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "CONSTRAINT_INDEX_6 ON PUBLIC.MESSAGE(IV) VALUES (X'769f8dca6666fcbd6e97c59b1ea00cfccfac4272ce98aae9ea54e2a98d54f763', 7)"; SQL statement: INSERT INTO Message (iv, type, sender, recipient, data, sent, received, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?) [23505-187] at ch.dissem.bitmessage.repository.JdbcMessageRepository.save(JdbcMessageRepository.java:184) at ch.dissem.bitmessage.DefaultMessageListener.receive(DefaultMessageListener.java:127) at ch.dissem.bitmessage.DefaultMessageListener.receive(DefaultMessageListener.java:61) at ch.dissem.bitmessage.networking.Connection.receiveMessage(Connection.java:279) at ch.dissem.bitmessage.networking.Connection.run(Connection.java:128) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "CONSTRAINT_INDEX_6 ON PUBLIC.MESSAGE(IV) VALUES (X'769f8dca6666fcbd6e97c59b1ea00cfccfac4272ce98aae9ea54e2a98d54f763', 7)"; SQL statement: INSERT INTO Message (iv, type, sender, recipient, data, sent, received, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?) [23505-187] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) at org.h2.message.DbException.get(DbException.java:179) at org.h2.message.DbException.get(DbException.java:155) at org.h2.index.BaseIndex.getDuplicateKeyException(BaseIndex.java:102) at org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:233) at org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:191) at org.h2.mvstore.db.MVTable.addRow(MVTable.java:638) at org.h2.command.dml.Insert.insertRows(Insert.java:156) at org.h2.command.dml.Insert.update(Insert.java:114) at org.h2.command.CommandContainer.update(CommandContainer.java:78) at org.h2.command.Command.executeUpdate(Command.java:254) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:143) at ch.dissem.bitmessage.repository.JdbcMessageRepository.insert(JdbcMessageRepository.java:203) at ch.dissem.bitmessage.repository.JdbcMessageRepository.save(JdbcMessageRepository.java:161) ... 7 more

Dissem commented 9 years ago

This is expected when two nodes send the same object. This shouldn't happen too often, as there are some countermeasures, but when a node doesn't send a requested object in time it will be requested from multiple other connected nodes which will cause this exception. As it's not possible to ignore specific SQL exceptions I wanted to keep logging this for debugging purposes. I think there should be better ways to handle this, and I'm glad for any proposals.

Dissem commented 8 years ago

Should now be fixed, there was an issue with the fallback mechanism, and initial fetching of objects was very inefficient.