Search in sources :

Example 6 with TraceSystem

use of org.h2.message.TraceSystem in project h2database by h2database.

the class WriterThread method run.

@Override
public void run() {
    while (!stop) {
        Database database = databaseRef.get();
        if (database == null) {
            break;
        }
        int wait = writeDelay;
        try {
            if (database.isFileLockSerialized()) {
                wait = Constants.MIN_WRITE_DELAY;
                database.checkpointIfRequired();
            } else {
                database.flush();
            }
        } catch (Exception e) {
            TraceSystem traceSystem = database.getTraceSystem();
            if (traceSystem != null) {
                traceSystem.getTrace(Trace.DATABASE).error(e, "flush");
            }
        }
        // wait 0 mean wait forever, which is not what we want
        wait = Math.max(wait, Constants.MIN_WRITE_DELAY);
        synchronized (this) {
            while (!stop && wait > 0) {
                // wait 100 ms at a time
                int w = Math.min(wait, 100);
                try {
                    wait(w);
                } catch (InterruptedException e) {
                // ignore
                }
                wait -= w;
            }
        }
    }
    databaseRef = null;
}
Also used : Database(org.h2.engine.Database) TraceSystem(org.h2.message.TraceSystem) AccessControlException(java.security.AccessControlException)

Example 7 with TraceSystem

use of org.h2.message.TraceSystem in project h2database by h2database.

the class JdbcDataSourceFactory method getTraceSystem.

/**
 * INTERNAL
 */
public static TraceSystem getTraceSystem() {
    synchronized (JdbcDataSourceFactory.class) {
        if (cachedTraceSystem == null) {
            cachedTraceSystem = new TraceSystem(SysProperties.CLIENT_TRACE_DIRECTORY + "h2datasource" + Constants.SUFFIX_TRACE_FILE);
            cachedTraceSystem.setLevelFile(SysProperties.DATASOURCE_TRACE_LEVEL);
        }
        return cachedTraceSystem;
    }
}
Also used : TraceSystem(org.h2.message.TraceSystem)

Example 8 with TraceSystem

use of org.h2.message.TraceSystem in project h2database by h2database.

the class Database method isReconnectNeeded.

/**
 * Check if the contents of the database was changed and therefore it is
 * required to re-connect. This method waits until pending changes are
 * completed. If a pending change takes too long (more than 2 seconds), the
 * pending change is broken (removed from the properties file).
 *
 * @return true if reconnecting is required
 */
public boolean isReconnectNeeded() {
    if (fileLockMethod != FileLockMethod.SERIALIZED) {
        return false;
    }
    if (reconnectChangePending) {
        return false;
    }
    long now = System.nanoTime();
    if (now < reconnectCheckNext) {
        return false;
    }
    reconnectCheckNext = now + reconnectCheckDelayNs;
    if (lock == null) {
        lock = new FileLock(traceSystem, databaseName + Constants.SUFFIX_LOCK_FILE, Constants.LOCK_SLEEP);
    }
    try {
        Properties prop = lock.load(), first = prop;
        while (true) {
            if (prop.equals(reconnectLastLock)) {
                return false;
            }
            if (prop.getProperty("changePending", null) == null) {
                break;
            }
            if (System.nanoTime() > now + reconnectCheckDelayNs * 10) {
                if (first.equals(prop)) {
                    // the writing process didn't update the file -
                    // it may have terminated
                    lock.setProperty("changePending", null);
                    lock.save();
                    break;
                }
            }
            trace.debug("delay (change pending)");
            Thread.sleep(TimeUnit.NANOSECONDS.toMillis(reconnectCheckDelayNs));
            prop = lock.load();
        }
        reconnectLastLock = prop;
    } catch (Exception e) {
        // DbException, InterruptedException
        trace.error(e, "readOnly {0}", readOnly);
    // ignore
    }
    return true;
}
Also used : FileLock(org.h2.store.FileLock) Properties(java.util.Properties) DbException(org.h2.message.DbException) SQLException(java.sql.SQLException) IOException(java.io.IOException)

Example 9 with TraceSystem

use of org.h2.message.TraceSystem in project h2database by h2database.

the class Database method open.

private synchronized void open(int traceLevelFile, int traceLevelSystemOut) {
    if (persistent) {
        String dataFileName = databaseName + Constants.SUFFIX_OLD_DATABASE_FILE;
        boolean existsData = FileUtils.exists(dataFileName);
        String pageFileName = databaseName + Constants.SUFFIX_PAGE_FILE;
        String mvFileName = databaseName + Constants.SUFFIX_MV_FILE;
        boolean existsPage = FileUtils.exists(pageFileName);
        boolean existsMv = FileUtils.exists(mvFileName);
        if (existsData && (!existsPage && !existsMv)) {
            throw DbException.get(ErrorCode.FILE_VERSION_ERROR_1, "Old database: " + dataFileName + " - please convert the database " + "to a SQL script and re-create it.");
        }
        if (existsPage && !FileUtils.canWrite(pageFileName)) {
            readOnly = true;
        }
        if (existsMv && !FileUtils.canWrite(mvFileName)) {
            readOnly = true;
        }
        if (existsPage && !existsMv) {
            dbSettings.mvStore = false;
        }
        if (readOnly) {
            if (traceLevelFile >= TraceSystem.DEBUG) {
                String traceFile = Utils.getProperty("java.io.tmpdir", ".") + "/" + "h2_" + System.currentTimeMillis();
                traceSystem = new TraceSystem(traceFile + Constants.SUFFIX_TRACE_FILE);
            } else {
                traceSystem = new TraceSystem(null);
            }
        } else {
            traceSystem = new TraceSystem(databaseName + Constants.SUFFIX_TRACE_FILE);
        }
        traceSystem.setLevelFile(traceLevelFile);
        traceSystem.setLevelSystemOut(traceLevelSystemOut);
        trace = traceSystem.getTrace(Trace.DATABASE);
        trace.info("opening {0} (build {1})", databaseName, Constants.BUILD_ID);
        if (autoServerMode) {
            if (readOnly || fileLockMethod == FileLockMethod.NO || fileLockMethod == FileLockMethod.SERIALIZED || fileLockMethod == FileLockMethod.FS || !persistent) {
                throw DbException.getUnsupportedException("autoServerMode && (readOnly || " + "fileLockMethod == NO || " + "fileLockMethod == SERIALIZED || " + "fileLockMethod == FS || " + "inMemory)");
            }
        }
        String lockFileName = databaseName + Constants.SUFFIX_LOCK_FILE;
        if (readOnly) {
            if (FileUtils.exists(lockFileName)) {
                throw DbException.get(ErrorCode.DATABASE_ALREADY_OPEN_1, "Lock file exists: " + lockFileName);
            }
        }
        if (!readOnly && fileLockMethod != FileLockMethod.NO) {
            if (fileLockMethod != FileLockMethod.FS) {
                lock = new FileLock(traceSystem, lockFileName, Constants.LOCK_SLEEP);
                lock.lock(fileLockMethod);
                if (autoServerMode) {
                    startServer(lock.getUniqueId());
                }
            }
        }
        if (SysProperties.MODIFY_ON_WRITE) {
            while (isReconnectNeeded()) {
            // wait until others stopped writing
            }
        } else {
            while (isReconnectNeeded() && !beforeWriting()) {
            // wait until others stopped writing and
            // until we can write (the file is not yet open -
            // no need to re-connect)
            }
        }
        deleteOldTempFiles();
        starting = true;
        if (SysProperties.MODIFY_ON_WRITE) {
            try {
                getPageStore();
            } catch (DbException e) {
                if (e.getErrorCode() != ErrorCode.DATABASE_IS_READ_ONLY) {
                    throw e;
                }
                pageStore = null;
                while (!beforeWriting()) {
                // wait until others stopped writing and
                // until we can write (the file is not yet open -
                // no need to re-connect)
                }
                getPageStore();
            }
        } else {
            getPageStore();
        }
        starting = false;
        if (mvStore == null) {
            writer = WriterThread.create(this, writeDelay);
        } else {
            setWriteDelay(writeDelay);
        }
    } else {
        if (autoServerMode) {
            throw DbException.getUnsupportedException("autoServerMode && inMemory");
        }
        traceSystem = new TraceSystem(null);
        trace = traceSystem.getTrace(Trace.DATABASE);
        if (dbSettings.mvStore) {
            getPageStore();
        }
    }
    systemUser = new User(this, 0, SYSTEM_USER_NAME, true);
    mainSchema = new Schema(this, 0, Constants.SCHEMA_MAIN, systemUser, true);
    infoSchema = new Schema(this, -1, "INFORMATION_SCHEMA", systemUser, true);
    schemas.put(mainSchema.getName(), mainSchema);
    schemas.put(infoSchema.getName(), infoSchema);
    publicRole = new Role(this, 0, Constants.PUBLIC_ROLE_NAME, true);
    roles.put(Constants.PUBLIC_ROLE_NAME, publicRole);
    systemUser.setAdmin(true);
    systemSession = new Session(this, systemUser, ++nextSessionId);
    lobSession = new Session(this, systemUser, ++nextSessionId);
    CreateTableData data = new CreateTableData();
    ArrayList<Column> cols = data.columns;
    Column columnId = new Column("ID", Value.INT);
    columnId.setNullable(false);
    cols.add(columnId);
    cols.add(new Column("HEAD", Value.INT));
    cols.add(new Column("TYPE", Value.INT));
    cols.add(new Column("SQL", Value.STRING));
    boolean create = true;
    if (pageStore != null) {
        create = pageStore.isNew();
    }
    data.tableName = "SYS";
    data.id = 0;
    data.temporary = false;
    data.persistData = persistent;
    data.persistIndexes = persistent;
    data.create = create;
    data.isHidden = true;
    data.session = systemSession;
    meta = mainSchema.createTable(data);
    IndexColumn[] pkCols = IndexColumn.wrap(new Column[] { columnId });
    metaIdIndex = meta.addIndex(systemSession, "SYS_ID", 0, pkCols, IndexType.createPrimaryKey(false, false), true, null);
    objectIds.set(0);
    starting = true;
    Cursor cursor = metaIdIndex.find(systemSession, null, null);
    ArrayList<MetaRecord> records = New.arrayList();
    while (cursor.next()) {
        MetaRecord rec = new MetaRecord(cursor.get());
        objectIds.set(rec.getId());
        records.add(rec);
    }
    Collections.sort(records);
    synchronized (systemSession) {
        for (MetaRecord rec : records) {
            rec.execute(this, systemSession, eventListener);
        }
    }
    if (mvStore != null) {
        mvStore.initTransactions();
        mvStore.removeTemporaryMaps(objectIds);
    }
    recompileInvalidViews(systemSession);
    starting = false;
    if (!readOnly) {
        // set CREATE_BUILD in a new database
        String name = SetTypes.getTypeName(SetTypes.CREATE_BUILD);
        if (settings.get(name) == null) {
            Setting setting = new Setting(this, allocateObjectId(), name);
            setting.setIntValue(Constants.BUILD_ID);
            lockMeta(systemSession);
            addDatabaseObject(systemSession, setting);
        }
        // mark all ids used in the page store
        if (pageStore != null) {
            BitSet f = pageStore.getObjectIds();
            for (int i = 0, len = f.length(); i < len; i++) {
                if (f.get(i) && !objectIds.get(i)) {
                    trace.info("unused object id: " + i);
                    objectIds.set(i);
                }
            }
        }
    }
    getLobStorage().init();
    systemSession.commit(true);
    trace.info("opened {0}", databaseName);
    if (checkpointAllowed > 0) {
        afterWriting();
    }
}
Also used : Schema(org.h2.schema.Schema) BitSet(java.util.BitSet) TraceSystem(org.h2.message.TraceSystem) CreateTableData(org.h2.command.ddl.CreateTableData) Cursor(org.h2.index.Cursor) Constraint(org.h2.constraint.Constraint) DbException(org.h2.message.DbException) IndexColumn(org.h2.table.IndexColumn) IndexColumn(org.h2.table.IndexColumn) Column(org.h2.table.Column) FileLock(org.h2.store.FileLock)

Example 10 with TraceSystem

use of org.h2.message.TraceSystem in project h2database by h2database.

the class Session method getTrace.

@Override
public Trace getTrace() {
    if (trace != null && !closed) {
        return trace;
    }
    String traceModuleName = "jdbc[" + id + "]";
    if (closed) {
        return new TraceSystem(null).getTrace(traceModuleName);
    }
    trace = database.getTraceSystem().getTrace(traceModuleName);
    return trace;
}
Also used : ValueString(org.h2.value.ValueString) TraceSystem(org.h2.message.TraceSystem)

Aggregations

TraceSystem (org.h2.message.TraceSystem)14 FileLock (org.h2.store.FileLock)5 DbException (org.h2.message.DbException)4 IOException (java.io.IOException)2 SQLException (java.sql.SQLException)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 File (java.io.File)1 PrintStream (java.io.PrintStream)1 FileChannel (java.nio.channels.FileChannel)1 AccessControlException (java.security.AccessControlException)1 BitSet (java.util.BitSet)1 Properties (java.util.Properties)1 CreateTableData (org.h2.command.ddl.CreateTableData)1 Constraint (org.h2.constraint.Constraint)1 Database (org.h2.engine.Database)1 Cursor (org.h2.index.Cursor)1 Schema (org.h2.schema.Schema)1 Column (org.h2.table.Column)1 IndexColumn (org.h2.table.IndexColumn)1 Transfer (org.h2.value.Transfer)1