@@ -166,7 +166,7 @@ func NewRuntime(ctx context.Context, options ...RuntimeOption) (*Runtime, error)
166
166
if err != nil {
167
167
return nil , err
168
168
}
169
- return newRuntimeFromConfig (conf , options ... )
169
+ return newRuntimeFromConfig (ctx , conf , options ... )
170
170
}
171
171
172
172
// NewRuntimeFromConfig creates a new container runtime using the given
@@ -175,10 +175,10 @@ func NewRuntime(ctx context.Context, options ...RuntimeOption) (*Runtime, error)
175
175
// An error will be returned if the configuration file at the given path does
176
176
// not exist or cannot be loaded
177
177
func NewRuntimeFromConfig (ctx context.Context , userConfig * config.Config , options ... RuntimeOption ) (* Runtime , error ) {
178
- return newRuntimeFromConfig (userConfig , options ... )
178
+ return newRuntimeFromConfig (ctx , userConfig , options ... )
179
179
}
180
180
181
- func newRuntimeFromConfig (conf * config.Config , options ... RuntimeOption ) (* Runtime , error ) {
181
+ func newRuntimeFromConfig (ctx context. Context , conf * config.Config , options ... RuntimeOption ) (* Runtime , error ) {
182
182
runtime := new (Runtime )
183
183
184
184
if conf .Engine .OCIRuntime == "" {
@@ -223,7 +223,7 @@ func newRuntimeFromConfig(conf *config.Config, options ...RuntimeOption) (*Runti
223
223
return nil , fmt .Errorf ("starting shutdown signal handler: %w" , err )
224
224
}
225
225
226
- if err := makeRuntime (runtime ); err != nil {
226
+ if err := makeRuntime (ctx , runtime ); err != nil {
227
227
return nil , err
228
228
}
229
229
@@ -333,7 +333,7 @@ func getDBState(runtime *Runtime) (State, error) {
333
333
334
334
// Make a new runtime based on the given configuration
335
335
// Sets up containers/storage, state store, OCI runtime
336
- func makeRuntime (runtime * Runtime ) (retErr error ) {
336
+ func makeRuntime (ctx context. Context , runtime * Runtime ) (retErr error ) {
337
337
// Find a working conmon binary
338
338
cPath , err := runtime .config .FindConmon ()
339
339
if err != nil {
@@ -629,6 +629,13 @@ func makeRuntime(runtime *Runtime) (retErr error) {
629
629
return err
630
630
}
631
631
632
+ // Mark the runtime as valid - ready to be used, cannot be modified
633
+ // further.
634
+ // Need to do this *before* refresh as we can remove containers there.
635
+ // Should not be a big deal as we don't return it to users until after
636
+ // refresh runs.
637
+ runtime .valid = true
638
+
632
639
// If we need to refresh the state, do it now - things are guaranteed to
633
640
// be set up by now.
634
641
if doRefresh {
@@ -639,17 +646,13 @@ func makeRuntime(runtime *Runtime) (retErr error) {
639
646
}
640
647
}
641
648
642
- if err2 := runtime .refresh (runtimeAliveFile ); err2 != nil {
649
+ if err2 := runtime .refresh (ctx , runtimeAliveFile ); err2 != nil {
643
650
return err2
644
651
}
645
652
}
646
653
647
654
runtime .startWorker ()
648
655
649
- // Mark the runtime as valid - ready to be used, cannot be modified
650
- // further
651
- runtime .valid = true
652
-
653
656
return nil
654
657
}
655
658
@@ -819,7 +822,7 @@ func (r *Runtime) Shutdown(force bool) error {
819
822
// Reconfigures the runtime after a reboot
820
823
// Refreshes the state, recreating temporary files
821
824
// Does not check validity as the runtime is not valid until after this has run
822
- func (r * Runtime ) refresh (alivePath string ) error {
825
+ func (r * Runtime ) refresh (ctx context. Context , alivePath string ) error {
823
826
logrus .Debugf ("Podman detected system restart - performing state refresh" )
824
827
825
828
// Clear state of database if not running in container
@@ -856,6 +859,22 @@ func (r *Runtime) refresh(alivePath string) error {
856
859
if err := ctr .refresh (); err != nil {
857
860
logrus .Errorf ("Refreshing container %s: %v" , ctr .ID (), err )
858
861
}
862
+ // This is the only place it's safe to use ctr.state.State unlocked
863
+ // We're holding the alive lock, guaranteed to be the only Libpod on the system right now.
864
+ if (ctr .AutoRemove () && ctr .state .State == define .ContainerStateExited ) || ctr .state .State == define .ContainerStateRemoving {
865
+ opts := ctrRmOpts {
866
+ // Don't force-remove, we're supposed to be fresh off a reboot
867
+ // If we have to force something is seriously wrong
868
+ Force : false ,
869
+ RemoveVolume : true ,
870
+ }
871
+ // This container should have autoremoved before the
872
+ // reboot but did not.
873
+ // Get rid of it.
874
+ if _ , _ , err := r .removeContainer (ctx , ctr , opts ); err != nil {
875
+ logrus .Errorf ("Unable to remove container %s which should have autoremoved: %v" , ctr .ID (), err )
876
+ }
877
+ }
859
878
}
860
879
for _ , pod := range pods {
861
880
if err := pod .refresh (); err != nil {
0 commit comments