Skip to content

Get error "ITEM TOO BIG" when store data with Fastlz (but work fine with Zlib) #212

Open
@HarryTheGuy

Description

@HarryTheGuy

Hi,

I make a test with this scenario:

  • I have 1 text file with data size around 1.1 MB
  • Memcached item's max size is set as 1 MB (default)
  • I open the file, read the data then store it to memcached with 3 ways: no compression, compression with Fastlz, compression with Zlib.

The result

  • With no compression, I got error "ITEM TOO BIG" (correct)
  • With Fastlz, I got error "ITEM TOO BIG" (not correct)
  • With ZLib, I got "SUCCESS" (correct)
Harrys-MacBook-Pro:web harryhoang$ php test.php 
Data size (uncompressed): 1100000 bytes 
Data size (serialize, uncompressed): 1100013 bytes 
Data size (compressed, zlib): 832435 bytes 
Space Saving: 24%
Memcached factor: 1.3

Save without compression: ... 
Code:37
Message:ITEM TOO BIG

Save with Fastlz: ... 
Code:37
Message:ITEM TOO BIG

Save with Zlib: ... 
Code:0
Message:SUCCESS

So, I think we have issue when storing data using Fastlz. Please help me to check, thank you.

My memcached config

memcached support => enabled
libmemcached version => 1.0.18
memcached.compression_factor => 1.3 => 1.3
memcached.compression_threshold => 2000 => 2000
memcached.compression_type => fastlz => fastlz
memcached.serializer => igbinary => igbinary
memcached.sess_binary => no value => no value
memcached.sess_connect_timeout => 1000 => 1000
memcached.sess_consistent_hash => no value => no value
memcached.sess_lock_expire => 0 => 0
memcached.sess_lock_max_wait => 0 => 0
memcached.sess_lock_wait => 150000 => 150000
memcached.sess_locking => 1 => 1
memcached.sess_number_of_replicas => 0 => 0
memcached.sess_prefix => memc.sess.key. => memc.sess.key.
memcached.sess_randomize_replica_read => no value => no value
memcached.sess_remove_failed => 1 => 1
memcached.sess_sasl_password => no value => no value
memcached.sess_sasl_username => no value => no value
memcached.store_retry_count => 2 => 2
memcached.use_sasl => no value => no value

The test code

/** test memcached */

$originalData = null;
$originalDataSize = null;
$dataSerialize = null;
$dataSerializeSize = null;
$dataSerializeCompressed = null;
$dataSerializeCompressedSize = null;

$fileName = '/Users/harryhoang/Downloads/testFile.txt';
$sourceFile = fopen($fileName,'r');
if ($sourceFile) {
    $originalData  = fread($sourceFile, filesize($fileName));
    $originalDataSize = strlen($originalData);

    $dataSerialize = serialize($originalData);
    $dataSerializeCompressed = gzcompress($dataSerialize);

    $dataSerializeSize = strlen($dataSerialize);
    $dataSerializeCompressedSize = strlen($dataSerializeCompressed);
}
else {
    exit;
}

echo 'Data size (uncompressed): '.$originalDataSize." bytes \n";
echo 'Data size (serialize, uncompressed): '.$dataSerializeSize." bytes \n";
echo 'Data size (compressed, zlib): '.$dataSerializeCompressedSize." bytes \n";
echo 'Space Saving: '.round(($dataSerializeSize - $dataSerializeCompressedSize)/$dataSerializeSize * 100).'%';
echo "\n";

$memcached = new \Memcached;
$memcached->addServer('localhost',11211);

echo 'Memcached factor: '.ini_get('memcached.compression_factor')."\n";

echo "\nSave without compression: ... \n";

$memcached->setOption(\Memcached::OPT_COMPRESSION, false);

$result = $memcached->set('test', $originalData);
echo 'Code:'. $memcached->getResultCode()."\n";
echo 'Message:'. $memcached->getResultMessage()."\n";


echo "\nSave with Fastlz: ... \n";

$memcached->setOption(\Memcached::OPT_COMPRESSION, true);
$memcached->setOption(\Memcached::OPT_COMPRESSION_TYPE, Memcached::COMPRESSION_FASTLZ);
$memcached->setOption(\Memcached::OPT_SERIALIZER, \Memcached::SERIALIZER_PHP);

$result = $memcached->set('test', $originalData);
echo 'Code:'. $memcached->getResultCode()."\n";
echo 'Message:'. $memcached->getResultMessage()."\n";

echo "\nSave with Zlib: ... \n";

$memcached->setOption(\Memcached::OPT_COMPRESSION, true);
$memcached->setOption(\Memcached::OPT_COMPRESSION_TYPE, Memcached::COMPRESSION_ZLIB);
$memcached->setOption(\Memcached::OPT_SERIALIZER, \Memcached::SERIALIZER_PHP);

$result = $memcached->set('test', $originalData);
echo 'Code:'. $memcached->getResultCode()."\n";
echo 'Message:'. $memcached->getResultMessage()."\n";

echo 'Done'."\n";

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions