Пример #1
0
  public void testUpdate() {
    BrokerPool.FORCE_CORRUPTION = true;
    BrokerPool pool = null;
    DBBroker broker = null;
    try {
      pool = startDB();
      assertNotNull(pool);
      broker = pool.get(SecurityManager.SYSTEM_USER);
      assertNotNull(broker);
      TransactionManager mgr = pool.getTransactionManager();
      assertNotNull(mgr);

      IndexInfo info = init(broker, mgr);
      assertNotNull(info);
      DocumentSet docs = new DocumentSet();
      docs.add(info.getDocument());
      XUpdateProcessor proc = new XUpdateProcessor(broker, docs, AccessContext.TEST);
      assertNotNull(proc);

      Txn transaction = mgr.beginTransaction();
      assertNotNull(transaction);
      System.out.println("Transaction started ...");

      String xupdate;
      Modification modifications[];

      // append some new element to records
      for (int i = 1; i <= 200; i++) {
        xupdate =
            "<xu:modifications version=\"1.0\" xmlns:xu=\"http://www.xmldb.org/xupdate\">"
                + "   <xu:append select=\"/products\">"
                + "       <product>"
                + "           <xu:attribute name=\"id\"><xu:value-of select=\"count(/products/product) + 1\"/></xu:attribute>"
                + "           <description>Product "
                + i
                + "</description>"
                + "           <price>"
                + (i * 2.5)
                + "</price>"
                + "           <stock>"
                + (i * 10)
                + "</stock>"
                + "       </product>"
                + "   </xu:append>"
                + "</xu:modifications>";
        proc.setBroker(broker);
        proc.setDocumentSet(docs);
        modifications = proc.parse(new InputSource(new StringReader(xupdate)));
        assertNotNull(modifications);
        modifications[0].process(transaction);
        proc.reset();
      }

      DOMFile domDb = ((NativeBroker) broker).getDOMFile();
      assertNotNull(domDb);
      System.out.println(domDb.debugPages(info.getDocument(), false));

      mgr.commit(transaction);
      System.out.println("Transaction commited ...");

      // the following transaction will not be committed and thus undone during recovery
      transaction = mgr.beginTransaction();
      assertNotNull(transaction);
      System.out.println("Transaction started ...");

      // rename elements
      xupdate =
          "<xu:modifications version=\"1.0\" xmlns:xu=\"http://www.xmldb.org/xupdate\">"
              + "   <xu:rename select=\"/products/product/description\">descript</xu:rename>"
              + "</xu:modifications>";
      proc.setBroker(broker);
      proc.setDocumentSet(docs);
      modifications = proc.parse(new InputSource(new StringReader(xupdate)));
      assertNotNull(modifications);
      modifications[0].process(transaction);
      proc.reset();

      //          Don't commit...
      pool.getTransactionManager().getJournal().flushToLog(true);
      System.out.println("Transaction interrupted ...");
    } catch (Exception e) {
      e.printStackTrace();
      fail(e.getMessage());
    } finally {
      pool.release(broker);
    }
  }
Пример #2
0
  @Override
  public void execute(DBBroker broker) throws EXistException {
    final Agent agentInstance = AgentFactory.getInstance();
    final BrokerPool brokerPool = broker.getBrokerPool();
    final TaskStatus endStatus = new TaskStatus(TaskStatus.Status.STOPPED_OK);

    agentInstance.changeStatus(brokerPool, new TaskStatus(TaskStatus.Status.INIT));

    if (paused) {
      LOG.info("Consistency check is paused.");
      agentInstance.changeStatus(brokerPool, new TaskStatus(TaskStatus.Status.PAUSED));
      return;
    }

    brokerPool.getProcessMonitor().startJob(ProcessMonitor.ACTION_BACKUP, null, monitor);

    PrintWriter report = null;
    try {
      boolean doBackup = createBackup;
      // TODO: don't use the direct access feature for now. needs more testing
      List<ErrorReport> errors = null;
      if (!incremental || incrementalCheck) {

        LOG.info("Starting consistency check...");

        report = openLog();
        final CheckCallback cb = new CheckCallback(report);

        final ConsistencyCheck check = new ConsistencyCheck(broker, false, checkDocs);
        agentInstance.changeStatus(brokerPool, new TaskStatus(TaskStatus.Status.RUNNING_CHECK));
        errors = check.checkAll(cb);

        if (!errors.isEmpty()) {
          endStatus.setStatus(TaskStatus.Status.STOPPED_ERROR);
          endStatus.setReason(errors);

          LOG.error("Errors found: " + errors.size());

          doBackup = true;

          if (fatalErrorsFound(errors)) {
            LOG.error("Fatal errors were found: pausing the consistency check task.");
            paused = true;
          }
        }

        LOG.info("Finished consistency check");
      }

      if (doBackup) {
        LOG.info("Starting backup...");

        final SystemExport sysexport = new SystemExport(broker, logCallback, monitor, false);
        lastExportedBackup = sysexport.export(exportDir, incremental, maxInc, createZip, errors);
        agentInstance.changeStatus(brokerPool, new TaskStatus(TaskStatus.Status.RUNNING_BACKUP));

        if (lastExportedBackup != null) {
          LOG.info("Created backup to file: " + lastExportedBackup.getAbsolutePath());
        }

        LOG.info("Finished backup");
      }

    } catch (final TerminatedException e) {
      throw new EXistException(e.getMessage(), e);

    } catch (final PermissionDeniedException e) {
      // TODO should maybe throw PermissionDeniedException instead!
      throw new EXistException(e.getMessage(), e);

    } finally {
      if (report != null) {
        report.close();
      }

      agentInstance.changeStatus(brokerPool, endStatus);
      brokerPool.getProcessMonitor().endJob();
    }
  }