Uploaded image for project: 'Phoenix'
  1. Phoenix
  2. PHOENIX-5048

Index Rebuilder does not handle INDEX_STATE timestamp check for all index

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.14.0, 5.0.0, 4.14.1
    • 4.15.0, 5.1.0, 4.14.2, 5.0.1
    • None
    • None

    Description

      After rebuilder is finished for Partial Index Rebuild, It will check if Index state has been updated after Upper bound of the scan we use in partial index Rebuild. If that happens then it will fail Index Rebuild as Index write failure occured while we were rebuilding Index.

      MetaDataEndpointImpl.java#updateIndexState()
      public void updateIndexState(RpcController controller, UpdateIndexStateRequest request,
      RpcCallback<MetaDataResponse> done) {
      ...
      // If the index status has been updated after the upper bound of the scan we use
      // to partially rebuild the index, then we need to fail the rebuild because an
      // index write failed before the rebuild was complete.
      if (actualTimestamp > expectedTimestamp) {
      builder.setReturnCode(MetaDataProtos.MutationCode.UNALLOWED_TABLE_MUTATION);
      builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis());
      done.run(builder.build());
      return;
      }
      ...
      }

      After Introduction of TrackingParallelWriterIndexCommitter PHOENIX-3815, we only disable Index which get failure . Before that , in ParallelWriterIndexCommitter we were disabling all index even if Index failure happens for one Index only. 

      Suppose Data Table has 3 index and above condition becomes true for first index , then we won't even check for remain two Index.

      MetaDataRegionObserver.java#BuildIndexScheduleTask.java#run()
      for (PTable indexPTable : indexesToPartiallyRebuild) {
      String indexTableFullName = SchemaUtil.getTableName(
      indexPTable.getSchemaName().getString(),
      indexPTable.getTableName().getString());
      if (scanEndTime == latestUpperBoundTimestamp) {
      IndexUtil.updateIndexState(conn, indexTableFullName, PIndexState.ACTIVE, 0L, latestUpperBoundTimestamp);
      batchExecutedPerTableMap.remove(dataPTable.getName());
      LOG.info("Making Index:" + indexPTable.getTableName() + " active after rebuilding");
      } else {
      // Increment timestamp so that client sees updated disable timestamp
      IndexUtil.updateIndexState(conn, indexTableFullName, indexPTable.getIndexState(), scanEndTime * signOfDisableTimeStamp, latestUpperBoundTimestamp);
      Long noOfBatches = batchExecutedPerTableMap.get(dataPTable.getName());
      if (noOfBatches == null) {
      noOfBatches = 0l;
      }
      batchExecutedPerTableMap.put(dataPTable.getName(), ++noOfBatches);
      LOG.info("During Round-robin build: Successfully updated index disabled timestamp for "
      + indexTableFullName + " to " + scanEndTime);
      }
      }
      

       

       

       

      Attachments

        1. PHOENIX-5048.patch
          2 kB
          Mihir Monani
        2. PHOENIX-5048.v2.patch
          2 kB
          Mihir Monani
        3. PHOENIX-5048.v3.patch
          3 kB
          Mihir Monani
        4. PHOENIX-5048.v4.patch
          3 kB
          Mihir Monani
        5. PHOENIX-5048.v5.patch
          3 kB
          Mihir Monani

        Activity

          People

            mihir6692 Mihir Monani
            mihir6692 Mihir Monani
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: