You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Aleksandr B (JIRA)" <ji...@apache.org> on 2013/08/02 13:17:48 UTC

[jira] [Created] (HBASE-9115) HTableInterface.append operation fails (overwrites) the value added to the 1st colum out of several

Aleksandr B created HBASE-9115:
----------------------------------

             Summary: HTableInterface.append operation fails (overwrites) the value added to the 1st colum out of several
                 Key: HBASE-9115
                 URL: https://issues.apache.org/jira/browse/HBASE-9115
             Project: HBase
          Issue Type: Bug
    Affects Versions: 0.94.10
         Environment: MAC OS X 10.8.4, Hbase in the pseudo-distributed mode, hadoop v1.2.0, Hbase Java API based client.

*hdfs-site.xml*:
{code:xml} 
<configuration>
     <property>
         <name>dfs.replication</name>
         <value>1</value>
     </property>
    <property>
        <name>dfs.support.append</name>
        <value>true</value>
    </property>
</configuration>
{code}

*hbase-site.xml*:
{code:xml} 
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/hbase</value>
  </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>localhost</value>
    </property>
    <property>
        <name>dfs.support.append</name>
        <value>true</value>
    </property>
</configuration>
{code} 
            Reporter: Aleksandr B
            Priority: Critical


I use Hbase Java API and I try to append values Bytes.toBytes("one two") and Bytes.toBytes(" three") in 3 columns.
Only for 2 out of these 3 columns the result is "one two three".

*Output from the hbase shell:*
{noformat} 
hbase(main):008:0* scan "mytesttable"
ROW                                    COLUMN+CELL                                                                                                    
 mytestRowKey                          column=TestA:dlbytes, timestamp=1375436156140, value=one two three                                             
 mytestRowKey                          column=TestA:tbytes, timestamp=1375436156140, value=one two three                                              
 mytestRowKey                          column=TestA:ulbytes, timestamp=1375436156140, value= three                                                    
1 row(s) in 0.0280 seconds
{noformat}

*My test code:*
{code:title=Database.java|borderStyle=solid}
import static org.junit.Assert.*;

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.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Append;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;

...

    @Test
    public void testAppend() throws IOException {
        byte [] rowKey = Bytes.toBytes("mytestRowKey");
        byte [] column1 = Bytes.toBytes("ulbytes");
        byte [] column2 = Bytes.toBytes("dlbytes");
        byte [] column3 = Bytes.toBytes("tbytes");
        String part11 = "one two";
        String part12 = " three";
        String cFamily = "TestA";
        String TABLE = "mytesttable";
        Configuration conf = HBaseConfiguration.create();

        HTablePool pool = new HTablePool(conf, 10);
        HBaseAdmin admin = new HBaseAdmin(conf);
        
        if(admin.tableExists(TABLE)){
            admin.disableTable(TABLE);
            admin.deleteTable(TABLE);
        }
        
        HTableDescriptor tableDescriptor = new HTableDescriptor(TABLE);
        HColumnDescriptor hcd = new HColumnDescriptor(cFamily);
        hcd.setMaxVersions(1);
        tableDescriptor.addFamily(hcd);
        admin.createTable(tableDescriptor);

        HTableInterface table = pool.getTable(TABLE);
        
        Append a = new Append(rowKey);
        a.setReturnResults(false);
        a.add(Bytes.toBytes(cFamily), column1, Bytes.toBytes(part11));
        a.add(Bytes.toBytes(cFamily), column2, Bytes.toBytes(part11));
        a.add(Bytes.toBytes(cFamily), column3, Bytes.toBytes(part11));
        table.append(a);
        HTableInterface table2 = pool.getTable(TABLE);
        a = new Append(rowKey);
        a.add(Bytes.toBytes(cFamily), column1, Bytes.toBytes(part12));
        a.add(Bytes.toBytes(cFamily), column2, Bytes.toBytes(part12));
        a.add(Bytes.toBytes(cFamily), column3, Bytes.toBytes(part12));
        Result result = table2.append(a);

        byte [] resultForColumn1 = result.getValue(Bytes.toBytes(cFamily), column1);
        byte [] resultForColumn2 = result.getValue(Bytes.toBytes(cFamily), column2);
        byte [] resultForColumn3 = result.getValue(Bytes.toBytes(cFamily), column3);
        if (resultForColumn1 == null || resultForColumn2 == null || resultForColumn3 == null)
            System.out.println("The DB table contains these values but they are never given back, strange...");
        else {
            assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
                    resultForColumn1));
            assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
                    resultForColumn2));
            assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
                    resultForColumn3));
        }
      }
{code} 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira