EV-Etcd
view release on metacpan or search on metacpan
eg/txn_test.pl view on Meta::CPAN
#!/usr/bin/env perl
use strict;
use warnings;
use lib 'blib/lib', 'blib/arch';
use EV;
use EV::Etcd;
use Data::Dumper;
my $client = EV::Etcd->new(
endpoints => ['127.0.0.1:2379'],
);
print "=== Transaction Test ===\n\n";
# Test 1: Compare-and-swap - create key if it doesn't exist (version == 0)
print "1. Compare-and-swap: Create '/txntest' only if it doesn't exist...\n";
$client->txn(
# Compare: version == 0 means key doesn't exist
[
{ key => '/txntest', target => 'version', result => '=', version => 0 },
],
# Success: create the key
[
{ put => { key => '/txntest', value => 'initial-value' } },
],
# Failure: get current value
[
{ range => { key => '/txntest' } },
],
sub {
my ($resp, $err) = @_;
if ($err) {
print "Transaction error: $err->{message}\n";
EV::break;
return;
}
print " Transaction succeeded: $resp->{succeeded}\n";
print " Revision: $resp->{header}{revision}\n";
if ($resp->{succeeded}) {
print " Key was created (didn't exist before)\n\n";
} else {
print " Key already existed, got current value:\n";
my $range_resp = $resp->{responses}[0]{response_range};
if ($range_resp && @{$range_resp->{kvs}}) {
print " Value: $range_resp->{kvs}[0]{value}\n\n";
}
}
# Test 2: Update only if value matches
test_conditional_update();
}
);
sub test_conditional_update {
print "2. Conditional update: Change value only if current value matches...\n";
$client->txn(
# Compare: value must be 'initial-value'
[
{ key => '/txntest', target => 'value', result => '=', value => 'initial-value' },
],
# Success: update the value
[
{ put => { key => '/txntest', value => 'updated-value' } },
],
# Failure: do nothing (empty array)
( run in 0.343 second using v1.01-cache-2.11-cpan-524268b4103 )