Return-Path: Delivered-To: apmail-hbase-issues-archive@www.apache.org Received: (qmail 8720 invoked from network); 4 Apr 2011 23:47:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 4 Apr 2011 23:47:47 -0000 Received: (qmail 83787 invoked by uid 500); 4 Apr 2011 23:47:47 -0000 Delivered-To: apmail-hbase-issues-archive@hbase.apache.org Received: (qmail 83764 invoked by uid 500); 4 Apr 2011 23:47:46 -0000 Mailing-List: contact issues-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list issues@hbase.apache.org Received: (qmail 83756 invoked by uid 99); 4 Apr 2011 23:47:46 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Apr 2011 23:47:46 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.116] (HELO hel.zones.apache.org) (140.211.11.116) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Apr 2011 23:47:43 +0000 Received: from hel.zones.apache.org (hel.zones.apache.org [140.211.11.116]) by hel.zones.apache.org (Postfix) with ESMTP id 18B4292211 for ; Mon, 4 Apr 2011 23:47:06 +0000 (UTC) Date: Mon, 4 Apr 2011 23:47:06 +0000 (UTC) From: "Jonathan Gray (JIRA)" To: issues@hbase.apache.org Message-ID: <4200257.33751.1301960826097.JavaMail.tomcat@hel.zones.apache.org> In-Reply-To: <651062379.28967.1301677265880.JavaMail.tomcat@hel.zones.apache.org> Subject: [jira] [Commented] (HBASE-3725) HBase increments from old value after delete and write to disk MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/HBASE-3725?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13015683#comment-13015683 ] Jonathan Gray commented on HBASE-3725: -------------------------------------- Hey Nathaniel. Thanks for posting the unit test! I will take a look at this sometime this week and try to get a fix out for it. > HBase increments from old value after delete and write to disk > -------------------------------------------------------------- > > Key: HBASE-3725 > URL: https://issues.apache.org/jira/browse/HBASE-3725 > Project: HBase > Issue Type: Bug > Components: io, regionserver > Affects Versions: 0.90.1 > Reporter: Nathaniel Cook > Attachments: HBASE-3725.patch > > > Deleted row values are sometimes used for starting points on new increments. > To reproduce: > Create a row "r". Set column "x" to some default value. > Force hbase to write that value to the file system (such as restarting the cluster). > Delete the row. > Call table.incrementColumnValue with "some_value" > Get the row. > The returned value in the column was incremented from the old value before the row was deleted instead of being initialized to "some_value". > Code to reproduce: > {code} > import java.io.IOException; > import org.apache.hadoop.conf.Configuration; > import org.apache.hadoop.hbase.HBaseConfiguration; > import org.apache.hadoop.hbase.HColumnDescriptor; > import org.apache.hadoop.hbase.HTableDescriptor; > import org.apache.hadoop.hbase.client.Delete; > import org.apache.hadoop.hbase.client.Get; > import org.apache.hadoop.hbase.client.HBaseAdmin; > import org.apache.hadoop.hbase.client.HTableInterface; > import org.apache.hadoop.hbase.client.HTablePool; > import org.apache.hadoop.hbase.client.Increment; > import org.apache.hadoop.hbase.client.Result; > import org.apache.hadoop.hbase.util.Bytes; > public class HBaseTestIncrement > { > static String tableName = "testIncrement"; > static byte[] infoCF = Bytes.toBytes("info"); > static byte[] rowKey = Bytes.toBytes("test-rowKey"); > static byte[] newInc = Bytes.toBytes("new"); > static byte[] oldInc = Bytes.toBytes("old"); > /** > * This code reproduces a bug with increment column values in hbase > * Usage: First run part one by passing '1' as the first arg > * Then restart the hbase cluster so it writes everything to disk > * Run part two by passing '2' as the first arg > * > * This will result in the old deleted data being found and used for the increment calls > * > * @param args > * @throws IOException > */ > public static void main(String[] args) throws IOException > { > if("1".equals(args[0])) > partOne(); > if("2".equals(args[0])) > partTwo(); > if ("both".equals(args[0])) > { > partOne(); > partTwo(); > } > } > /** > * Creates a table and increments a column value 10 times by 10 each time. > * Results in a value of 100 for the column > * > * @throws IOException > */ > static void partOne()throws IOException > { > Configuration conf = HBaseConfiguration.create(); > HBaseAdmin admin = new HBaseAdmin(conf); > HTableDescriptor tableDesc = new HTableDescriptor(tableName); > tableDesc.addFamily(new HColumnDescriptor(infoCF)); > if(admin.tableExists(tableName)) > { > admin.disableTable(tableName); > admin.deleteTable(tableName); > } > admin.createTable(tableDesc); > HTablePool pool = new HTablePool(conf, Integer.MAX_VALUE); > HTableInterface table = pool.getTable(Bytes.toBytes(tableName)); > //Increment unitialized column > for (int j = 0; j < 10; j++) > { > table.incrementColumnValue(rowKey, infoCF, oldInc, (long)10); > Increment inc = new Increment(rowKey); > inc.addColumn(infoCF, newInc, (long)10); > table.increment(inc); > } > Get get = new Get(rowKey); > Result r = table.get(get); > System.out.println("initial values: new " + Bytes.toLong(r.getValue(infoCF, newInc)) + " old " + Bytes.toLong(r.getValue(infoCF, oldInc))); > } > /** > * First deletes the data then increments the column 10 times by 1 each time > * > * Should result in a value of 10 but it doesn't, it results in a values of 110 > * > * @throws IOException > */ > static void partTwo()throws IOException > { > Configuration conf = HBaseConfiguration.create(); > HTablePool pool = new HTablePool(conf, Integer.MAX_VALUE); > HTableInterface table = pool.getTable(Bytes.toBytes(tableName)); > > Delete delete = new Delete(rowKey); > table.delete(delete); > //Increment columns > for (int j = 0; j < 10; j++) > { > table.incrementColumnValue(rowKey, infoCF, oldInc, (long)1); > Increment inc = new Increment(rowKey); > inc.addColumn(infoCF, newInc, (long)1); > table.increment(inc); > } > Get get = new Get(rowKey); > Result r = table.get(get); > System.out.println("after delete values: new " + Bytes.toLong(r.getValue(infoCF, newInc)) + " old " + Bytes.toLong(r.getValue(infoCF, oldInc))); > } > } > {code} -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira