/* add or overwrite existing key:value pair */
rc = memcached_set(_osrfCache, clean_key, strlen(clean_key), value, strlen(value), seconds, 0);
if (rc != MEMCACHED_SUCCESS) {
- osrfLogError(OSRF_LOG_MARK, "Failed to cache key:value [%s]:[%s] - %s",
- key, value, memcached_strerror(_osrfCache, rc));
+ // Try one more time, maybe a server failure
+ rc = memcached_set(_osrfCache, clean_key, strlen(clean_key), value, strlen(value), seconds, 0);
+ if (rc != MEMCACHED_SUCCESS) {
+ osrfLogError(OSRF_LOG_MARK, "Failed to cache key:value [%s]:[%s] - %s",
+ key, value, memcached_strerror(_osrfCache, rc));
+ }
}
free(clean_key);
if( key ) {
char* clean_key = _clean_key( key );
const char* data = (const char*) memcached_get(_osrfCache, clean_key, strlen(clean_key), &val_len, &flags, &rc);
- free(clean_key);
if (rc != MEMCACHED_SUCCESS) {
- osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s",
- key, memcached_strerror(_osrfCache, rc));
+ // Try one more time, maybe a server failure
+ data = (const char*) memcached_get(_osrfCache, clean_key, strlen(clean_key), &val_len, &flags, &rc);
+ if (rc != MEMCACHED_SUCCESS) {
+ osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s",
+ key, memcached_strerror(_osrfCache, rc));
+ }
}
+ free(clean_key);
if( data ) {
osrfLogInternal( OSRF_LOG_MARK, "osrfCacheGetObject(): Returning object (key=%s): %s", key, data);
obj = jsonParse( data );
if( key ) {
char* clean_key = _clean_key( key );
char* data = (char*) memcached_get(_osrfCache, clean_key, strlen(clean_key), &val_len, &flags, &rc);
- free(clean_key);
if (rc != MEMCACHED_SUCCESS) {
- osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s",
- key, memcached_strerror(_osrfCache, rc));
+ // Try one more time, maybe a server failure
+ data = (char*) memcached_get(_osrfCache, clean_key, strlen(clean_key), &val_len, &flags, &rc);
+ if (rc != MEMCACHED_SUCCESS) {
+ osrfLogDebug(OSRF_LOG_MARK, "Failed to get key [%s] - %s",
+ key, memcached_strerror(_osrfCache, rc));
+ }
}
+ free(clean_key);
osrfLogInternal( OSRF_LOG_MARK, "osrfCacheGetString(): Returning object (key=%s): %s", key, data);
if(!data) osrfLogDebug(OSRF_LOG_MARK, "No cache data exists with key %s", key);
return data;
if( key ) {
char* clean_key = _clean_key( key );
rc = memcached_delete(_osrfCache, clean_key, strlen(clean_key), 0 );
- free(clean_key);
if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED) {
- osrfLogDebug(OSRF_LOG_MARK, "Failed to delete key [%s] - %s",
- key, memcached_strerror(_osrfCache, rc));
+ // Try one more time, maybe a server failure
+ rc = memcached_delete(_osrfCache, clean_key, strlen(clean_key), 0 );
+ if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED) {
+ osrfLogDebug(OSRF_LOG_MARK, "Failed to delete key [%s] - %s",
+ key, memcached_strerror(_osrfCache, rc));
+ }
}
+ free(clean_key);
return 0;
}
return -1;
$expiretime ||= $max_persist_time;
unless( $self->{memcache}->set( $key, $value, $expiretime ) ) {
- $log->error("Unable to store $key => [".length($value)." bytes] in memcached server" );
- return undef;
+ unless( $self->{memcache}->set( $key, $value, $expiretime ) ) { # retry exactly once on possible server failure
+ $log->error("Unable to store $key => [".length($value)." bytes] in memcached server" );
+ return undef;
+ }
}
$log->debug("Stored $key => $value in memcached server", INTERNAL);
$key = _clean_cache_key($key);
return undef if $key eq ''; # no zero-length keys
if($self->{persist}){ _load_methods(); }
- $self->{memcache}->delete($key);
+ # This will retry exactly once on failed delete, which can happen b/c of a server failure
+ $self->{memcache}->delete($key) || $self->{memcache}->delete($key);
if( $self->{persist} ) {
$persist_destroy_slot->run("_CACHEVAL_$key");
}
return undef if $key eq ''; # no zero-length keys
- my $val = $self->{memcache}->get( $key );
+ # This will retry exactly once on an undef response, which can happen b/c of a server failure
+ my $val = $self->{memcache}->get( $key ) // $self->{memcache}->get( $key );
return OpenSRF::Utils::JSON->JSON2perl($val) if defined($val);
if($self->{persist}){ _load_methods(); }