[ 
https://issues.apache.org/jira/browse/HBASE-9115?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aleksandr B updated HBASE-9115:
-------------------------------

    Description: 
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);
        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 = table.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} 

  was:
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} 

    
> HTableInterface.append operation fails (overwrites) the value added to the 
> 1st column 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);
>         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 = table.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

Reply via email to