Jan Fernando created PHOENIX-2149:
-------------------------------------

             Summary: MAX Value of Sequences not honored when closing 
Connection between calls to NEXT VALUE FOR
                 Key: PHOENIX-2149
                 URL: https://issues.apache.org/jira/browse/PHOENIX-2149
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 4.4.0
            Reporter: Jan Fernando


There appears to be an issue be related to closing connections between calls to 
NEXT VALUE FOR that causes the MAX sequence value to be ignored. I have found 
scenarios when I am allocating sequences near the MAX whereby the MAX is not 
honored and value greater than the max are returned by NEXT VALUE FOR.

It appears to be related to the logic to return all sequences on connection 
close. It looks like if you close the connection between each invocation when 
you hit the max value instead of the expected error being thrown sequence 
values continue to be doled out. It looks like for some reason the 
limit_reached_flag is not being set correctly on the SYSTEM.SEQUENCE table for 
the sequence in this case.

I added the test below to SequenceBulkAllocationIT that repros the issue.

If I either a) remove the nextConnection() call that keeps recycling 
connections in the test below or b) comment our the code in 
PhoenixConnection.close() that calls services.removeConnection() the test below 
starts to pass.

I wasn't able to repro in Squirrel because I guess it doesn't recycle 
connections.

{code}
    @Test
    public void testNextValuesForSequenceClosingConnections() throws Exception {
        final SequenceProperties props =
                new 
SequenceProperties.Builder().incrementBy(1).startsWith(4990).cacheSize(10).minValue(4990).maxValue(5000)
                        .numAllocated(4989).build();
        
        // Create Sequence
        nextConnection();
        createSequenceWithMinMax(props);
        nextConnection();
        
        // Try and get next value
        try {
            long val = 0L;
            for (int i = 0; i <= 11; i++) {
                ResultSet rs = 
conn.createStatement().executeQuery(String.format(SELECT_NEXT_VALUE_SQL, 
"bulkalloc.alpha"));
                rs.next();
                val = rs.getLong(1);
                nextConnection();
            }
            fail("Expect to fail as this value is greater than seq max " + val);
        } catch (SQLException e) {
            
assertEquals(SQLExceptionCode.SEQUENCE_VAL_REACHED_MAX_VALUE.getErrorCode(),
                e.getErrorCode());
            assertTrue(e.getNextException() == null);
        }
    }
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to