File Coverage

blib/lib/Etcd/Lock.pm
Criterion Covered Total %
statement 8 39 20.5
branch 0 10 0.0
condition 0 6 0.0
subroutine 3 9 33.3
pod 3 4 75.0
total 14 68 20.5


line stmt bran cond sub pod time code
1             package Etcd::Lock;
2             $Etcd::Lock::VERSION = '0.03';
3 3     3   170607 use 5.012;
  3         30  
4              
5 3     3   1214 use Net::Etcd;
  3         811455  
  3         91  
6 3     3   1105 use boolean;
  3         2818  
  3         12  
7              
8             sub new {
9 0     0 0   my $c = shift;
10 0           my %a = @_;
11 0           my %b;
12 0           $b{etcd} = Net::Etcd->new( { host => $a{host} } );
13 0           $b{ttl} = 3600;
14 0           foreach (qw/host key ttl/) {
15 0 0         $b{$_} = $a{$_} if (exists $a{$_});
16             }
17 0           return bless \%b, $c;
18             }
19              
20             sub lock {
21 0     0 1   my $s = shift;
22 0           return $s->_lock_unlock(true);
23             }
24              
25             sub unlock {
26 0     0 1   my $s = shift;
27 0           return $s->_lock_unlock(false);
28             }
29              
30             sub ttl {
31 0     0 1   my $s = shift;
32 0 0         $s->{ttl} = shift if @_;
33 0           return $s->{ttl};
34             }
35              
36             sub _lock_unlock ( ) {
37 0     0     my $s = shift;
38 0           my $nval = shift;
39 0           my $k = $s->{key};
40              
41 0           my $val = $s->{etcd}->range( { key => $k } )->get_value;
42 0 0         return $val unless defined $nval;
43 0 0 0       return false if defined $val && $val eq $nval;
44 0           my $lid = $s->_lease_id;
45 0 0         if ($nval) {
46 0           $s->{etcd}->lease( { ID => $lid, TTL => $s->{ttl} } )->grant;
47 0           $s->{etcd}->put( { key => $k, value => $nval, lease => $lid } );
48             }
49             else {
50 0           $s->{etcd}->deleterange( { key => $k } );
51 0           $s->{etcd}->lease( { ID => $lid } )->revoke;
52             }
53 0           return true;
54             }
55              
56             sub _lease_id {
57 0     0     my $s = shift;
58 0   0       state $leased_id //= $$ . time;
59 0           return $leased_id;
60             }
61              
62             1;
63              
64             =pod
65              
66             =head1 NAME
67              
68             Etcd::Lock - Lock based on etcd
69              
70             =for html

71            
72             github workflow tests
73            
74             Top language:
75             github last commit
76            

77              
78             =head1 VERSION
79              
80             version 0.03
81              
82             =head1 SYNOPSIS
83              
84             use Etcd::Lock
85              
86             my $etcdLock = Etcd::Lock->new(host => 'host.name.com', key => 'lock_key');
87             $etcdLock->lock();
88             ... do_something ...
89             $etcdLock->unlock();
90              
91             =head1 DESCRIPTION
92              
93             Etcd::Lock is a lock based on etcd. When a key is locked, try to lock same key
94             return false. Key is unlocked automatically when ttl seconds expired.
95              
96             =encoding UTF-8
97              
98             =head1 METHODS
99              
100             =head2 lock()
101              
102             Return true if key is unlocked. Now it's locked.
103              
104             =head2 unlock()
105              
106             Return true if key is locked. Now it's unlocked
107              
108             =head2 ttl(new_ttl)
109              
110             Set or return after how many seconds a lock is automatically removed.
111             Defaul: 3600.
112              
113             =head1 BUGS/CONTRIBUTING
114              
115             Please report any bugs through the web interface at L
116              
117             If you want to contribute changes or otherwise involve yourself in development, feel free to fork the Git repository from
118             L.
119              
120             =head1 SUPPORT
121              
122             You can find this documentation with the perldoc command too.
123              
124             perldoc etcd-lock
125              
126             =head1 AUTHOR
127              
128             Emiliano Bruni
129              
130             =head1 COPYRIGHT AND LICENSE
131              
132             This software is copyright (c) 2022 by Emiliano Bruni.
133              
134             This is free software; you can redistribute it and/or modify it under
135             the same terms as the Perl 5 programming language system itself.
136              
137             =cut
138              
139             __END__