mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	-Implement emulated autocommit for SQLite backend. Mixing and matching autocommit semantics was creating a deadlock. Emulated autocomment does not guarantee rollback to go back as far as one may expect
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4374 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -24,6 +24,13 @@ | ||||
| #Some known weird behaviors | ||||
| #creating new sqlite db files when only requested to read non-existant table, easy to fix, | ||||
| #class xcattable | ||||
| #FYI on emulated AutoCommit: | ||||
| #SQLite specific behavior has Table layer implementing AutoCommit.  There | ||||
| #is a significant limitation, 'rollback' may not roll all the way back | ||||
| #if an intermediate transaction occured on the same table | ||||
| #TODO: short term, have tabutils implement it's own rollback (the only consumer) | ||||
| #TODO: longer term, either figure out a way to properly implement it or  | ||||
| #      document it as a limitation for SQLite configurations | ||||
| package xCAT::Table; | ||||
| use xCAT::MsgUtils; | ||||
| use Sys::Syslog; | ||||
| @@ -507,6 +514,7 @@ sub new | ||||
|     my $create = 1; | ||||
|     if (exists($otherargs{'-create'}) && ($otherargs{'-create'}==0)) {$create = 0;} | ||||
|     $self->{autocommit} = $otherargs{'-autocommit'}; | ||||
|     $self->{realautocommit} = $self->{autocommit}; #Assume we let the DB do the work, i.e. the autocommit is either not used or is not emulated by Table.pm | ||||
|     unless (defined($self->{autocommit})) | ||||
|     { | ||||
|         $self->{autocommit} = 1; | ||||
| @@ -531,6 +539,7 @@ sub new | ||||
|         if ($xcatcfg =~ /^SQLite:/) | ||||
|         { | ||||
|             $self->{backend_type} = 'sqlite'; | ||||
|             $self->{realautocommit} = 0; #We will emulate autocommit if autocommit is requested | ||||
|             my @path = split(':', $xcatcfg, 2); | ||||
|             unless (-e $path[1] . "/" . $self->{tabname} . ".sqlite" || $create) | ||||
|             { | ||||
| @@ -554,13 +563,13 @@ sub new | ||||
|             #return undef; | ||||
|         } | ||||
|         my $oldumask= umask 0077; | ||||
|         unless ($::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{autocommit}}) { #= $self->{tabname}; | ||||
|           $::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{autocommit}} = | ||||
|             DBI->connect($self->{connstring}, $self->{dbuser}, $self->{dbpass}, {AutoCommit => $self->{autocommit}}); | ||||
|         unless ($::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{realautocommit}}) { #= $self->{tabname}; | ||||
|           $::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{realautocommit}} = | ||||
|             DBI->connect($self->{connstring}, $self->{dbuser}, $self->{dbpass}, {AutoCommit => $self->{realautocommit}}); | ||||
|          } | ||||
|          umask $oldumask; | ||||
|  | ||||
|         $self->{dbh} = $::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{autocommit}}; | ||||
|         $self->{dbh} = $::XCAT_DBHS->{$self->{connstring},$self->{dbuser},$self->{dbpass},$self->{realautocommit}}; | ||||
|         #Store the Table object reference as afflicted by changes to the DBH | ||||
|         #This for now is ok, as either we aren't in DB worker mode, in which case this structure would be short lived... | ||||
|         #or we are in db worker mode, in which case Table objects live indefinitely | ||||
| @@ -584,6 +593,7 @@ sub new | ||||
|                                       $xCAT::Schema::tabspec{$self->{tabname}}, | ||||
|                       $xcatcfg); | ||||
|                     $self->{dbh}->do($str); | ||||
|                     $self->{dbh}->commit; | ||||
|                 } | ||||
|                 else { return undef; } | ||||
|             } | ||||
| @@ -754,6 +764,9 @@ sub updateschema | ||||
|             my $stmt = | ||||
|                   "ALTER TABLE " . $self->{tabname} . " ADD $dcol $datatype"; | ||||
|             $self->{dbh}->do($stmt); | ||||
|             if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|                 $self->{dbh}->commit; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -845,6 +858,9 @@ sub updateschema | ||||
| 		$str = "DROP TABLE $btn"; | ||||
| 		$self->{dbh}->do($str); | ||||
| 	    } | ||||
|         if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|             $self->{dbh}->commit; | ||||
|         } | ||||
| 	} | ||||
|     } | ||||
| } | ||||
| @@ -987,6 +1003,10 @@ sub addAttribs | ||||
|         xCAT::NotifHandler->notify("a", $self->{tabname}, [0], | ||||
|                                           \%new_notif_data); | ||||
|     } | ||||
|     if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|         $self->{dbh}->commit(); | ||||
|     } | ||||
|     $sth->finish(); | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -1205,7 +1225,10 @@ sub setAttribs | ||||
|         { | ||||
|             return (undef, $sth->errstr); | ||||
|         } | ||||
| 	$sth->finish; | ||||
| 	    $sth->finish; | ||||
|         if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|             $self->{dbh}->commit; | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -1248,7 +1271,10 @@ sub setAttribs | ||||
|         { | ||||
|             return (undef, $sth->errstr); | ||||
|         } | ||||
| 	$sth->finish; | ||||
| 	    $sth->finish; | ||||
|         if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|             $self->{dbh}->commit(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #notify the interested parties | ||||
| @@ -1365,6 +1391,9 @@ sub setAttribsWhere | ||||
|                                  \@notif_data, \%new_notif_data); | ||||
|     } | ||||
|     $sth->finish; | ||||
|     if ($self->{autocommit} and not $self->{realautocommit}) { | ||||
|         $self->{dbh}->commit; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user